2011-10-28 30 views
9

Tôi chọn lọc thông qua một số dấu vết mạng và nhận thấy trên máy tính của riêng tôi rằng khi tôi kết nối qua HTTP, các gói dữ liệu giống như thế:tải dữ liệu trong một TCP ack

client --> server: GET 
server --> client: tcp ack 
server --> client: HTTP response 
client --> server: tcp ack 

Tuy nhiên, tôi nhìn vào một số CIFS (SMB) dấu vết tôi đã lưu từ một vài năm trở lại. Tôi thấy những thứ như:

client --> server: Create Request 
server --> client: Create response (This packet also acks the request) 

Ở mức cao, tôi tự hỏi tại sao sự khác biệt - điều gì đang gây ra các hành vi khác nhau? Điều gì đang kiểm soát xem phản ứng ứng dụng có được đặt trên yêu cầu ack hay gói khác: ứng dụng hoặc hệ điều hành không?

Trả lời

5

Hành vi này phụ thuộc vào cả hệ điều hành và ứng dụng. Trong Linux, hạt nhân không gửi trực tiếp ACK, nhưng thay vì đợi một số mili giây cố định (khoảng 200), hy vọng rằng có một số dữ liệu để gửi lại và có thể cho phép ACK thu thập dữ liệu.

Nếu bộ hẹn giờ tắt, ACK sẽ được gửi ngay lập tức.

Ví dụ 1.

Client sends the GET request. 

Server tries to create a http response, but before it does that 200ms are gone 
and it must send the ACK before the http response. 

Ví dụ 2.

Client sends the GET request. 

Server creates a http response within the timer limit, and the ACK can piggyback 
the data. 

Ý nghĩa, nếu ứng dụng của bạn có chậm hơn ở việc tạo ra phản ứng đó, ACK sẽ được gửi mà không cõng trên dữ liệu. Và cũng tùy thuộc vào hệ điều hành, bộ đếm thời gian trễ có thể cao hơn/thấp hơn và một lần nữa thay đổi cách ACK được gửi đi.

+0

bạn có thể chỉ định bộ hẹn giờ trễ trong bất kỳ cài đặt khởi tạo TCP nào không? – NHDaly

+1

Bạn có thể tắt nó bằng tùy chọn TCP_QUICKACK với setsockopt theo IPPROTO_TCP (không btw di động). Nhưng việc thay đổi giá trị có thể không thực hiện được vì tôi tin rằng nó được mã hóa cứng trừ khi có sysctl mới được thêm vào cho nó (hoặc một cái gì đó tương tự). – Milan

+0

Sau khi tôi đặt tùy chọn TCP socket để tắt TCP Quick ACK, tôi vẫn không nhận được gói kết hợp trả lời: opt = 0; setsockopt (sockfd, IPPROTO_TCP, TCP_QUICKACK, (char *) & opt, sizeof (opt)); –

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