translate

Về TCP_NODELAY và TCP Optimization

Bài viết được dịch từ https://www.extrahop.com/company/blog/2016/tcp-nodelay-nagle-quickack-best-practices/.
Từ bây giờ tôi sẽ chuyển qua dịch thay vì viết blog cho đỡ mệt, không biết có bạn nào muốn join không?

Một chút về TCP, tại sao lại cần Nagle Algorithm và Delayed ACK, và chúng hoạt động với nhau ra sao

Internet hiện tại đã trở nên khổng lồ, mạng TCP/IP toàn cầu hiện tại hàng ngày gửi qua lại không biết bao nhiêu trang web cũng như file qua những khoảng cách rất lớn. Đã có rất nhiều thứ thay đổi kể từ khi internet được sinh ra, khi mà chính phủ sử dụng chủ yếu Telnet và NCP (Network Control Program) như là giao thức trao đổi chính. Internet đã phát triển với cấp số mũ, và ngày càng có nhiều giao thức sinh ra để làm cho việc vận chuyển năng suất hơn.

TCP/IP stack vào những năm 1980 trở thành giao thức chính, chiếm chỗ đứng và biến Telnet chỉ được sử dụng cho một số mục đích nhát định. Tại thời điểm đó thì TCP/IP đã có sẵn những cài đặt để tối ưu hoá luồng traffic, cũng như tránh được tắc nghẽn hay là mất mát dữ liệu. Thậm chí cho đến ngày nay, chúng ta cũng khó lòng mà biết cách tối ưu, khi nào nên, không nên dùng những cài đặt (setting) đó. Trong bài này chúng ta sẽ đi qua một vài kĩ thuật để tối ưu TCP, đặc biệt là thuật toán Nagle, TCP_NODELAY, Delayed ACK và TCP_QUICKACK.

Thuật toán Nagle, đặt tên theo nhà phát minh John Nagle, là một cơ chế để tăng hiệu năng TCP bằng cách giảm số lượng packet nhỏ lẻ (small packets) được gửi qua network. Mục đích là để tránh một node vận chuyển quá nhiều cách packet nhỏ lẻ khi mà ứng dụng phía trên vận chuyển data theo một tốc độ rùa bò. Khi một ứng dụng gửi quá nhiều packet nhỏ, nó sẽ gây ra tắc nghẽn network một acchs không mong muốn. Hiện tượng này càng trở nên rõ nét hơn khi ứng dụng cố gắng gửi nhứng packet mà payload thậm chí còn nhỏ hơn TCP header.

alt text

Bức tranh trên mô tả việc sự vô lý khi chúng ta cố gửi 1-byte Telnet packet trong 40-byte TCP packet, cũng tương tự như bạn để trong một chiếc xe tải một cái tủ bé tí, và chạy chiếc xe vòng quanh thành phố. Nếu chiếc xe vận chuyển đến ngay nhà bên cạnh thì không sao, nhưng trong trường hợp còn lại thì bạn sẽ muốn đợi một chút để chất thêm hàng vào chiếc xe cho đầy. Và đó là cách mà Nagle hoạt động. Nguyên lý chính của Nagle là tối ưu các request nhỏ bằng cách gộp nhiều request nhỏ thành một TCP segment to, sau đó gửi đi cả thể. TCP headers có thể lên đến 40 bytes, và có vô số các ứng dụng tầng trên có thể gửi 1 byte mỗi payload. Nếu môi trường của bạn config để gửi data ngay lập tức, bạn sẽ tốn đến 41 bytes chỉ để ... gửi 1 byte dữ liệu.

TCP delayed acknowledgement, hay viết tắt là Delayed ACK là mọt kĩ thuật khác cũng nhằm mục đích tối ưu hoá lưu lượng network và giảm nghẽn tắc. Delayed ACK được phát minh ra nhằm giảm số lượng ACK packets, cũng như giảm tổng chi phí của giao thức TCP nói chung. Ý tưởng chính của Delayed ACK là TCP sẽ không ngay lập tức ACK một TCP Segment, thay vào đó đợi một chút (ACK Timer, 200-500ms) rồi ACK cả thể. Delayed ACK đưa ra giả thuyết là sẽ có nhiều hơn 1 packet đến trong khoảng thời gian của ACK Timer. Do đó trong một số trường hợp khi giả thuyết này ... sai thì Delayed ACK ngược lại sẽ gây ra sự suy giảm về hiệu năng ứng dụng tầng trên.

Nagle và Delayed ACK được phát minh ra gần như cùng một thời điểm, nhưng do sự thiếu trao đổi giữa những người phát minh, họ cung cấp ra những giải pháp không hoàn chính, và nhiều khi xung đột lẫn nhau. John Nagle đã từng bày tỏ sự bưcs xúc trên Hacker News (tôi sẽ không dịch đoạn này).

That still irks me. The real problem is not tinygram prevention. It's ACK delays, and that stupid fixed timer. They both went into TCP around the same time, but independently. I did tinygram prevention (the Nagle algorithm) and Berkeley did delayed ACKs, both in the early 1980s. The combination of the two is awful.

Nagle và Delayed ACK không hợp tác tốt với nhau trong cùng một mạng TCP/IP.

Nagle về lý thuyết sẽ cố để gửi 1 vài probe packet tại một thời điểm. Do đó nếu 1 server sử dụng Nagle nói chuyện với 1 server sử dụng Delayed ACK, thì hiển nhiên bên sử dụng Delayed ACK sẽ cố để đợi packet tiếp theo rồi mới ACK, dẫn đến việc traffic sẽ bị chững lại (hold back). Do đó Nagle thường sẽ không phù hợp với môi trường mà 2 bên sẽ nói chuyện qua lại nhiều với nhau (interactive env).

Có một ví dụ về viêc: Delayed ACK cố gắng để gửi nhiều data trong cùng 1 segment nếu có thể, nhưng từ phía bên kia Nagle lại phụ thuộc vào ACK để gửi dữ liệu đi. Khi đó Nagle và Delayed ACK sẽ vô tình tạo ra một vòng xoay luẩn quẩn khi đợi lẫn nhau để gửi cũng như nhận ACK. Việc đó sẽ gây ra trì hoãn từ 200-500ms trong khi thực tế 2 bên có thể gửi/nhận ngay dữ liệu.

Trong những tình huống mà gửi dữ liệu 1 chiều chiếm phần lớn, khi đó tắt Nagle đi đôi khi sẽ giúp ích. Nhưng trong hầu hết những tình huống còn lại khi cả gửi/nhận đều cần thiết (roundtrip), khi đó tắt Nagle đi sẽ không giúp ích nhiều. Ở chiều ngược lại, Delayed ACK sẽ có ích chẳng hạn như trong trường hợp bạn muốn sử dụng tuỳ chọn echo trong telnet. Những tình huống kiểu vậy sẽ càng làm bạn rối trí hơn, bởi không biết khi nào nên dùng Nagle, Delayed ACK cũng như những tuỳ chọn tối ưu TCP khác.

Trong thực tế, không có cách nào để tắt Nagle cũng như Delayed ACK một cách tự động, vậy mà bạn cần phải hiểu rõ network của bạn mới có thể đưa ra các lựa chọn đúng đắn được.

TCP_NODELAY và TCP_QUICKACK là gì, chúng để làm gì?

TCP_NODELAY là tuỳ chọn sẽ giúp chọn bạn có thể tắt được Nagle, qua đó sẽ tránh được delay do Nagle gây ra, và dữ liệu sẽ được gửi sớm nhất có thể, thông qua việc bật cờ TCP_NODELAY lên. Ngược lại thì nếu cờ này là off thì dữ liệu sẽ được buffer rồi mới gửi đi. Có một tình huống hữu ích khi bật cờ này lên là khi protocol của bạn cần phải gửi dữ liệu qua lại, hay cần nhiều lần bắt tay qua lại (handshake) như là SSL, Citrix hay Telnet. Ngược lại, với những ứng dụng mà data chuyển chủ yếu là một chiều như là Web/HTTP thì việc bật cờ này lên sẽ không hữu ích lắm.

TCP_QUICKACK sẽ là tùy chọn giúp bạn tắt /bật được Delayed ACK.

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration