TCP okno - potvrzování přijatých dat

TCP okno - potvrzování přijatých dat
« kdy: 12. 11. 2013, 01:22:24 »
Při sledování např. stahování souboru ve WIRESHARKU jsem si OPAKOVANĚ všiml, že poměrně často dochází ke ztrátě paketu (segmentu TCP) přijímaných dat.

Co mě však (navíc) zarazilo je fakt, že ačkoli má strana (příjem) má nastaveno okno na cca 2500 B, tak i když chybějící segment nepotvrdím, tak mi od protistrany přijde klidně 10 (ale viděl jsem i případ, že několik set) dalších segmentů (každý cca 1400 B dlouhý) - a dojde tedy k mnohonásobnému překročení velikosti okna.

Jestli jsem f-ci klouzavého okna TCP správně pochopil, tak by mi protistrana neměla poslat bez potvrzení více dat, než je mnou indikovaná velikost okna. A pokud tedy potvrzení ode mne nedorazí, tak by měla protistrana vysílání pozastavit, resp. po vypršení čas. limitu nepotvrzená data znovuodeslat.

V příloze je kousek dat z wiresharku (.pcap), který situaci demonstruje.

Má někdo vysvětlení ?
Na mě to dělá dojem, jako by byl tento elementární mechanismus TCP/IP sítí jakoby ignorován.


dd

Re:TCP okno - potvrzování přijatých dat
« Odpověď #1 kdy: 12. 11. 2013, 02:46:32 »
Implementaci klouzaveho okna je vice, viz odkazy dole, ale jinak ta protistrana by ti mela automaticky preposlat pakety, ktere jsi proste nepotvrdil (po urcitem intervalu, ktery se muze lisit na kazde platforme). Neni zadna moznost rict protistrane, ze ti neco chybi.

http://en.wikipedia.org/wiki/Sliding_window
http://stackoverflow.com/questions/12956685/what-are-the-retransmission-rules-for-tcp

Kolemjdoucí

Re:TCP okno - potvrzování přijatých dat
« Odpověď #2 kdy: 12. 11. 2013, 03:33:19 »
Téměř určitě je tam nějaké Window Scaling které mění význam hodnot ve Window, to tam ale není protože jsi TCP spojení neodchytil od začátku.

Re:TCP okno - potvrzování přijatých dat
« Odpověď #3 kdy: 12. 11. 2013, 13:23:35 »
ANO, děkuji, jádro pudla je v tom scalink factor-u.
Nově jsem situaci odchytil včetně úvodního handshaku, a okno je ve skutečnosti mnohem větší.

Nyní např. 75k - a k retransmisi ztraceného segmentu dojde, asi z důvodu vypršení časovače, mnohem dříve, než se okno naplní.
Konkrétně došlo "jen" 10 nepotvrzených segmentů á 1,5k - stále tedy v okně bylo na 40 dalších nepotvrzených.

Asi bude v /proc nějaký nastavovací atribut - mohlo by být zajímavé sledovat to po omezení okna na max třeba 6kB.

   

j

Re:TCP okno - potvrzování přijatých dat
« Odpověď #4 kdy: 12. 11. 2013, 17:19:20 »
Mimochodem, kvuli ztrate jednoho/nekolika paketu neni duvod zastavit odesilani, navic prijemce (pripadne libovolny router cestou) muze samozrejme signalizovat ze  nestiha. Druha vec je, ze dneska se casto z duvodu neprimerene paranoi zakaze ICMP projistotu komplet, a pak nastavaj ruzny divenice, proc neco nefunguje. Me osobne nejvic bavej deravy firewally pres ktery neprojde icmp ping ...


Re:TCP okno - potvrzování přijatých dat
« Odpověď #5 kdy: 12. 11. 2013, 19:21:39 »
FYI: jsem nyní zkusmo připojen na net přes WiFi ISP - škrcené na 1024kb/512kb.
Časté výpadky přijímaných segmentů přičítám (?) traffic control, které vede asi až k zahazování paketů.
Při stahování byly opravdu časté. To byla prvotní motivace.

Tak jsem nyní zkusil:
Kód: [Vybrat]
echo echo 4096 8192 16384 >/proc/sys/net/ipv4/tcp_rmem
V této konfiguraci se R okno pohybovalo kolem 3kB a výpadky a retransmise jsou velmi ojedinělé - a navíc k retransmisi dojde již po 2 nepotvrzených segmentech. To doufám (?) prospěje k nezadrhování streamovaného videa (např. YT), ke kterému i při byť malém náskoku docházelo.

Pozn.:
echo 2048 2048 4096 >tcp_rmem už i 1024kb linku zpomalilo na 1/2 (jen 50-60kB/s místo 120-130kB/s) -> okno jen 1024B
echo 2048 4096 8192 >tcp_rmem už bylo OK, ale raději jsem dal rezervu: 4096 8192 16384

Ještě to budu sledovat, ale možná pro pomalé linky může mít omezení TCP okna smysl.