2009-10-23 36 views
14

Tôi có một ứng dụng nhận lưu lượng truy cập tương đối thưa thớt trên TCP mà không có phản hồi mức ứng dụng. Tôi tin rằng ngăn xếp TCP đang gửi ACK bị trì hoãn (dựa trên việc xem lướt qua gói chụp mạng). Cách được khuyến nghị để vô hiệu hóa bị trì hoãn-ACK trong ngăn xếp mạng cho một ổ cắm duy nhất là gì? Tôi đã xem TCP_QUICKACK, nhưng có vẻ như ngăn xếp sẽ thay đổi nó dưới chân tôi.Tắt ACK bị trì hoãn TCP

Điều này đang chạy trên hạt nhân Linux 2.6 và tôi không lo lắng về tính di động.

Trả lời

13

Bạn có thể setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) sau mỗi recv bạn thực hiện. Có vẻ như TCP_QUICKACK chỉ được đặt lại khi có dữ liệu được gửi hoặc nhận; nếu bạn không gửi bất kỳ dữ liệu nào, thì nó sẽ chỉ được đặt lại khi bạn nhận dữ liệu, trong trường hợp đó bạn có thể chỉ cần đặt lại dữ liệu đó.

Bạn có thể kiểm tra điều này trong trường 14 th của /proc/net/tcp; nếu nó không phải là 1, ACK sẽ được gửi ngay lập tức ... nếu tôi đọc mã TCP chính xác. (Tôi cũng không phải là chuyên gia về vấn đề này.)

+0

Tôi tin rằng anh ấy đã làm điều đó dựa trên câu hỏi của anh ấy và anh ấy nói giá trị đang được đặt lại. – Nikolaos

+0

Đặt 'TCP_QUICKACK' ngay lập tức gửi ACK nếu có bất kỳ điều gì cần được ACK'ed, vì vậy tôi nghĩ điều này là đủ. – ephemient

+0

Tôi vẫn 'gửi()' ing trên ổ cắm đó. Nhưng như tôi đã nói, tôi không trả lời những tin nhắn tôi nhận được. Tôi sẽ xem '/ proc/net/tcp'. – Tom

0

Tôi tin rằng sử dụng chức năng setsockopt() bạn có thể sử dụng TCP_NODELAY để tắt thuật toán Nagle.

Sửa Tìm thấy một liên kết: http://www.ibm.com/developerworks/linux/library/l-hisock.html

Sửa 2 Tom là đúng. Nagle không ảnh hưởng đến ACK bị trì hoãn.

+2

Vô hiệu hóa thuật toán của Nagle sẽ không ảnh hưởng đến sự thừa nhận chậm trễ (ít nhất, không phải trên bất kỳ triển khai nào mà tôi biết). – Tom

+0

liên kết là tuyệt vời –

+0

Không, vô hiệu hóa tác động nagle trì hoãn ack, ít nhất tôi có thể xác nhận trong kernel 3.17 rất gần đây của linux. – Timir

Các vấn đề liên quan