jeśli klient tcp wyśle pakiet o numerze sekwencyjnym od 10000 do 20000, na serwer tcp. tcp odpowie ACK za pomocą seq_ack 20001.
jeśli przechwycę pakiet TCP od klienta i podzielę pakiet na 2 segmenty TCP, jeden z sekwencją od 10000 do 15000, a drugi z sekwencją od 15001 do 20000. A następnie te 2 segmenty TCP zostaną wysłane do serwera TCP. Załóżmy, że drugi segment ginie na ścieżce. Serwer TCP odpowie ACK na seq_ack 15001.
Teraz, ponieważ klient TCP wysyła pakiet integralny o sekwencji od 10000 do 20000, ale otrzymuje ACK z 15001, z punktu widzenia klienta jest to dziwne. Jak to zareaguje? Teoretycznie klient powinien ponownie przesłać bajty z sekwencji 15001 do 20000, a mianowicie, klient wyśle nowe pakiety z sekwencji 15001. Ale co z praktyką w implementacji stosu TCP, czy jest to to samo, co w teorii?
Myślę, że w buforze wysyłania TCP, gdy segment tcp jest wysyłany, segment pozostaje tam aż do potwierdzenia. Kiedy przychodzi ACK, bajty dla segmentu są usuwane z bufora. W buforze wysyłania znajduje się wskaźnik, gdy przychodzi potwierdzenie, wskaźnik wskazuje miejsce, w którym odpowiada parametr ack_seq. Bajty znajdujące się poniżej ack_seq są usuwane. W ten sposób cały segment nie musi być retransmitowany?
źródło
Rozmiary segmentów mogą się zmieniać i zmieniać w czasie trwania połączenia. Na szczęście TCP nie musi rejestrować rozmiaru segmentu, z którym wcześniej wysyłane były poszczególne pakiety. Dlatego wykona następujące czynności:
Obie operacje są wykonywane niezależnie od wielkości segmentu, do którego pierwotnie wysłano bajty. Teoria powinna pasować do większości implementacji.
Pozwól, że wyjaśnię:
Czy TCP używa bajtów lub segmentów? Do aplikacji TCP udostępnia interfejs strumienia bajtów. Ponadto wszystkie pola nagłówka i zmienne wewnętrzne są w bajtach. Jednak w celu przesłania informacji TCP dzieli je na segmenty, ponieważ wysyłanie bajtów jeden po drugim byłoby marnotrawstwem :-). Używanie liczników bajtów wszędzie ma tę zaletę, że rozmiar segmentu nie musi być stały przez cały czas trwania połączenia:
BTW: SACK nie jest tutaj odpowiedzią, ponieważ odbiornik (zwykle) użyje SACK tylko wtedy, gdy rozpozna dziurę w strumieniu bajtów (tj. Jeśli pakiet zostanie utracony, ale nadejdzie następny pakiet).
źródło