tcpdump kimenetet nem ertem - ack csomagban mikor/miert van/nincs payload?

Nezegetem ezt az oldalt mint pelda:

http://www.rogerclarke.com/II/IPrimerhttp-dump.html

Van egy http utesvaltas a 8-11 sorban:
8: request
9: ack 8-ra + payload
10: ack 8-ra + payload
11: ack 10-re

Es egy masik 18-22 sorokban:
18: resuest
19: ack 18-ra
20: ack 18-ra + payload
21: ack 18-ra + payload
22: ack 21-re

Kerdesem, hogy miert van kulonbseg a ketto kozt?
Konkretan a 19-es sor tunik nekem pazarlasnak, de gyanitom van oka, csak nem latom mi az.

Valszokat elore is koszonom!

Hozzászólások

az ack flag-et nem kotelezo beallitani ha adatot kuldesz, viszont de facto mindig be van billentve mondvan ha a payload nelkuli tcp ack csomag elveszik, akkor ilymodon tehermentesitse a halozatot a megf csomag ujrakuldeseto"l. a 18-as req-ra nem valaszol adattal rogton a peer, igy a kernel kuld egy ack-ot adat nelkul (ez a 19). kicsit kesobb megy a valasz amiben van adat is (20, 21). ha a 19-es ack elveszne vmi miatt, akkor a 18-as csomagot veges ido mulva ujrakuldene' - de igy nem kell, amennyiben a retransmit timeout kisebb mint amennyit a 20-as csomagra kell varni. sot, ha jol latom, a 18-asnal a psh flag is be vagyon allitva, ilyenkor meg kvazi elvaras az acknowledgement.

szerk: nem tudom mennyire ismered a tcp hattere't, bocs, hogyha vmi nem volt ertheto" es/vagy kicsit pongyolan fogalmaztam...

Koszonom, ertem amit irsz, csak azt nem ertem miert van kulonbseg a ket eset kozt. Miert nem kuld akkor az elso esetben is payload nelkuli ack-ot?

Ha jol ertem te azt mondod a kernel donti el, hogy mikor kuld ures ack-ot es mikor nem, idozites alapjan. Tudsz errol konkretumot hogy mukodik?

A tcpdump kimenet alapjan nincs idoelteres, persz lehet, hogy csak kicsi a felbontasa.

A tcpdump kimenet alapjan nincs idoelteres, persz lehet, hogy csak kicsi a felbontasa.
pontosan, igen, mert az idozites a peer-en (aki a 19, 20, 21 csomagot kuldte) zajlik, ezeket az idoadatot meg a kliens me'ri. altalaban egy gyors (~100mbit) halozatnal az elso 3-4 re-transmission mar kb 1/20 masodperc alatt lezajlik, ahol mar eleve az egyes csomagok kozotti ido is exponencialisan no", tehat ilyen szintu idoziteket nem realtime kernel eseten a madzag masik vegen mar nem lehet pontosan me'rni.

Tudsz errol konkretumot hogy mukodik?
ugy nagyvonalakban kb igy mukodik: van X es Y gep, azok kommunikalnak. az X gep kuld adatot, akkor a seq(X) szamlalo mellett van egy hossz is (L), mikor ezt Y megkapja, akkor visszakuld egy ack(Y)-t, amire igaz lesz, hogy seq(X)+L=ack(Y). namarmost az ethernet/ip az csomagokat kuld, igy egy csomagba kerul az is hogy ezeket az ack-okat Y megkuldje X-nek. tfh hogy egy "kicsi" (~40 byteos) csomag kuldesee ugyanannyiba kerul mint egy nagy (~1500 byteos), mert olyan a hardver.

nomarmost ekkor ha 10mega/sec-cel tolti X az adatot Y-be es elva'rna' hogy _minden_ csomagocska utan jojjon ack, akkor a masik iranyu savszelesseg is drasztikusan leesne (1:1 lenne a kuldott/fogadott csomagok aranya). ezert az van, hogy Y leszol X-nek hogy mennyi adatot kuldhet "felelotlenul" (ez a tcp window), az X az kuldi az adatot, es csak akkor kezd el nyafogni (retransmission, stb), ha ez az ablakmeret mar betelt, de me'g nem kapott ack-okat. ezert amikor "toltesz 1000-rel", akkor ez az ablak szepen megno" (aka'r a 64k-s hata'rt is atlepheti, ha van erre tcp option tamogatas), ekkor X nyugotan tolti fel a cuccot, Y meg neha ack-ol, mikor jonak latja. ez igy tok jol hangzik, de: amint X befejezte az adatkuldest, es nem telt be az ablak, akkor Y nem feltetlenul ackol rogton, hiszen me'g azt hiszi hogy majd jon adat. ekkor X kuld egy push bitet is (lasd tcp flags), es erre mar Y eszbekap, es ack-olja az adatot, de ez egy ures ack (sot, itt ha csak egyiranyu az adatforgalom, akkor Y lenyegeben payload nelkuli csomagokat kuld csak).

fokozva, http: itt az van hogy X kuld adatot (relative keveset: http request header), majd Y valaszol (relative sokat: honlap, kepek, stb). a http request header par csomagba belefer (akar egybe is, ha sok a cookie es/vagy postdata, akkor tobbe), de a window mar eleve gyorsan megszalad, akar 2-3 csomag lekuldese eseten (alapesetben exponencialisan no", 1024, 1280, 1536, 2048, 2560, 3072, 4096... asszem kb ez a szekvencia). a http request header utolso csomagjaval megy a push bit is, erre Y azonnal valaszol egy ack-kal, de utana rogton megy is az adat (honlap). viszont mi van akkor, ha ez a push-ra adott ack elveszik? akkor X egy ido utan ujrakuldene' a http request header-t, mondvan, hogy "biztos azert nem jott ack mert Y nem kapta meg". de, megkapta, csak X nem kapta meg, hogy Y megkapta... viszont Y rogton adatot is kuldene (mondvan hogy a http req megjott, mehet a moka). ilyenkor ha nem allitana be az ack-ot, akkor X az tovabbra is kuldene ujra a http req-t (amit Y persze lenyel, mondvan hogy ez mar megjott, hiszen ha seq(X)+L < ack(Y) fennall, akkor olyan adat jott le ami mar egyszer jott es Y tudomast is vett rola). igy viszont ha me'g az adat melle' Y beallitja az ack(Y)-t (de nem noveli, mert mar X nem kuld adatot) is, a megfelelo" tcp flag mellett (ack bit=1), akkor X mar nem fogja ujrakuldeni a http request header-t.

egy ilyen baromi egyszeru" master-slave protokol mint a http eseten is tudnak tehat vicces dolgok kialakulni, egy nem ennyire egyszeru adatforgalom meg huzosabb...