2011-10-28 9 views
9

mam przesiewanie niektórych śladów sieciowych i zauważyłem na moim komputerze, który po podłączeniu za pośrednictwem protokołu HTTP, pakiety wyglądać mniej więcej tak:ładowność danych w sieci TCP ack

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

Ja jednak spojrzał na jakiś CIFS (SMB), które ocaliłem od kilku lat. Widzę rzeczy takie jak:

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

Na wysokim poziomie, zastanawiam się, dlaczego różnica - co powoduje różne zachowania? Co to jest kontrolowanie, czy odpowiedź aplikacji jest umieszczona na żądaniu ack lub innym pakiecie: aplikacji lub systemie operacyjnym?

Odpowiedz

5

To zachowanie zależy zarówno od systemu operacyjnego, jak i aplikacji. W Linuksie jądro nie wysyła bezpośrednio potwierdzenia ACK, ale czeka na ustaloną liczbę milisekund (około 200), mając nadzieję, że ma dane do wysłania i może przekazać dane ACK.

Jeśli licznik czasu zgaśnie, to potwierdzenie zostanie wysłane natychmiast.

Przykład 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. 

Przykład 2.

Client sends the GET request. 

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

znaczenie, jeśli aplikacja dostaje wolniej na generowanie tej odpowiedzi ACK zostanie wysłany bez piggybacking na danych. A także w zależności od systemu operacyjnego, timer opóźnienia może być wyższy/niższy i ponownie zmieniać sposób wysyłania komunikatów ACK.

+0

czy można określić licznik opóźnienia w dowolnych ustawieniach inicjowania TCP? – NHDaly

+1

Możesz wyłączyć tę opcję za pomocą opcji TCP_QUICKACK z setsockopt w IPPROTO_TCP (nie przenośne btw). Ale zmiana wartości może nie być możliwa, ponieważ uważam, że jest ona zakodowana na sztywno, chyba że jest do niej dodany nowy sysctl (lub coś podobnego). – Milan

+0

Po ustawieniu opcji gniazda TCP, aby wyłączyć opcję TCP Quick ACK, nadal nie otrzymałem odpowiedzi na połączony pakiet: opt = 0; setsockopt (sockfd, IPPROTO_TCP, TCP_QUICKACK, (char *) i opt, sizeof (opt)); –

Powiązane problemy