Thuật toán Nagle, được đặt tên theo kỹ sư John Nagle, được thiết kế để giảm tắc nghẽn mạng do vấn đề gói tin nhỏ trong các ứng dụng TCP. Các triển khai UNIX bắt đầu sử dụng thuật toán Nagle vào những năm 1980, và nó vẫn là một tính năng tiêu chuẩn của TCP cho đến ngày nay.
Thuật toán Nagle hoạt động như thế nào?
Thuật toán Nagle xử lý dữ liệu ở phía gửi của các ứng dụng TCP bằng một phương pháp gọi là "nagling". Nó phát hiện các thông điệp có kích thước nhỏ và tích lũy các thông điệp đó thành các gói TCP lớn hơn trước khi gửi dữ liệu qua dây truyền. Quy trình này tránh việc tạo ra số lượng lớn không cần thiết các gói tin nhỏ.
Đặc tả kỹ thuật cho thuật toán Nagle được công bố năm 1984 dưới dạng RFC 896. Các quyết định về lượng dữ liệu tích lũy và thời gian chờ giữa các lần gửi là then chốt đối với hiệu suất tổng thể của nó.
Lợi ích của Nagling
Nagling có thể sử dụng hiệu quả băng thông của kết nối mạng ở giá trị thêm độ trễ (latency). Một ví dụ được mô tả trong RFC 896 minh họa lợi ích băng thông tiềm năng và lý do cho sự ra đời của nó:
- Nếu một ứng dụng TCP chặn các phím bấm bàn phím muốn truyền từng ký tự được gõ đến người nhận, nó có thể tạo ra một chuỗi thông điệp, mỗi thông điệp chứa 1 byte dữ liệu.
- Trước khi các thông điệp này có thể được gửi qua mạng, mỗi thông điệp phải được đóng gói với thông tin tiêu đề TCP như yêu cầu bởi TCP/IP. Mỗi tiêu đề có kích thước từ 20 đến 60 byte.
- Nếu không có nagling, ứng dụng ví dụ này sẽ tạo ra các thông điệp mạng bao gồm 95% hoặc nhiều hơn là thông tin tiêu đề (ít nhất 20 trong 21 byte) và 5% hoặc ít hơn là dữ liệu thực tế từ bàn phím của người gửi. Sử dụng thuật toán Nagle, cùng dữ liệu đó có thể được truyền bằng ít thông điệp hơn, dẫn đến tiết kiệm băng thông lớn.
Các ứng dụng kiểm soát việc sử dụng thuật toán Nagle với tùy chọn lập trình socket TCP_NODELAY. Windows, Linux và hệ thống Java thường bật Nagle theo mặc định. Do đó, các ứng dụng được viết cho những môi trường đó cần chỉ định TCP_NODELAY để tắt thuật toán.
Hạn chế
Các ứng dụng yêu cầu phản hồi mạng nhanh, như cuộc gọi video và chơi game trực tuyến, có thể không hoạt động tốt khi Nagle được bật. Độ trễ gây ra khi thuật toán mất thêm thời gian để lắp ráp các phần dữ liệu nhỏ có thể gây ra độ trễ (lag) rõ rệt trên màn hình hoặc trong luồng âm thanh số. Các ứng dụng như vậy thường tắt Nagle.
Thuật toán này được phát triển vào thời điểm mạng máy tính hỗ trợ băng thông ít hơn ngày nay. Ví dụ trên dựa trên trải nghiệm của John Nagle tại Ford Aerospace đầu những năm 1980, nơi các đánh đổi của nagling trên mạng chậm, tải nặng, đường dài của Ford có ý nghĩa. Ngày nay có ít tình huống hơn mà ứng dụng mạng có thể hưởng lợi từ thuật toán của ông.
Thuật toán Nagle chỉ sử dụng được với TCP. Các giao thức khác, như UDP, không hỗ trợ nó.