Seq和Ack
http://blog.csdn.net/bytebai/article/details/21752925
握手階段:
序號 方向 seq ack
1 A->B 0 0
2 B->A 0 0+1=1
3 A->B 1 0+1=1
解釋:
1:A向B發起連接請求,以一個隨機數初始化A的seq,這裏假設為0,此時ACK標記為0,也就是如果抓包的話是看不到ack標記的。
2:B收到A的連接請求後,也以一個隨機數初始化B的seq,這裏假設為0,意思是:你的請求我已收到,我這方的數據流就從這個數開始。B的ACK是A的seq加1,即0+1=1
3:A收到B的回復後,它的seq是它的上個請求的seq加1,即0+1=1,意思也是:你的回復我收到了,我這方的數據流就從這個數開始。A此時的ACK是B的seq加1,即0+1=1
數據傳輸階段:
序號 方向 seq ack size
23 A->B 40000 70000 1514
24 B->A 70000 40000+1514-54=41460
25 A->B 41460 70000+54-54=70000 1514
26 B->A 70000 41460+1514-54=42920 54
解釋:
23:B接收到A發來的seq=40000,ack=70000,size=1514的數據包。
24:於是B向A也發一個數據包,告訴A,你的上個包我收到了。B的seq就以它收到的數據包的ACK填充,ACK是它收到的數據包的SEQ加上數據包的大小(不包括以太網協議頭,IP頭,TCP頭),以證實B發過來的數據全收到了。
其實,在握手和結束時確認號應該是對方序列號加1,傳輸數據時則是對方序列號加上對方攜帶應用層數據的長度。如果從以太網包返回來計算所加的長度,就嫌走彎路了。
另外,如果對方沒有數據過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層數據發送長度。
Seq和Ack