TCP:SEQ号与ACK号
三次握手Three-way Handshake
一個(gè)虛擬連接的建立是通過(guò)三次握手來(lái)實(shí)現(xiàn)的
1. (B) –> [SYN] –> (A)
假如服務(wù)器A和客戶(hù)機(jī)B通訊. 當(dāng)A要和B通信時(shí),B首先向A發(fā)一個(gè)SYN (Synchronize) 標(biāo)記的包,告訴A請(qǐng)求建立連接.
注意: 一個(gè) SYN包就是僅SYN標(biāo)記設(shè)為1的TCP包(參見(jiàn)TCP包頭Resources). 認(rèn)識(shí)到這點(diǎn)很重要,只有當(dāng)A受到B發(fā)來(lái)的SYN包,才可建立連接,除此之外別無(wú)他法。因此,如果你的防火墻丟棄所有的發(fā)往外網(wǎng)接口的SYN包,那么你將不能讓外部任何主機(jī)主動(dòng)建立連接。
2. (B) <– [SYN/ACK] <–(A)
接著,A收到后會(huì)發(fā)一個(gè)對(duì)SYN包的確認(rèn)包(SYN/ACK)回去,表示對(duì)第一個(gè)SYN包的確認(rèn),并繼續(xù)握手操作.
注意: SYN/ACK包是僅SYN 和 ACK 標(biāo)記為1的包.
3. (B) –> [ACK] –> (A)
B收到SYN/ACK 包,B發(fā)一個(gè)確認(rèn)包(ACK),通知A連接已建立。至此,三次握手完成,一個(gè)TCP連接完成
Note: ACK包就是僅ACK 標(biāo)記設(shè)為1的TCP包. 需要注意的是當(dāng)三此握手完成、連接建立以后,TCP連接的每個(gè)包都會(huì)設(shè)置ACK位
握手階段:
序號(hào) ???方向 ????????seq ??????????ack
1 ??A->B ????????0 ??????????????0
2 ????????B->A ????????0 ??????????????0+1=1
3 ????????A->B ????????1 ??????????????0+1=1
解釋:
1:A向B發(fā)起連接請(qǐng)求,以一個(gè)隨機(jī)數(shù)初始化A的seq,這里假設(shè)為0,此時(shí)ACK標(biāo)記為0,也就是如果抓包的話是看不到ack標(biāo)記的。
2:B收到A的連接請(qǐng)求后,也以一個(gè)隨機(jī)數(shù)初始化B的seq,這里假設(shè)為0,意思是:你的請(qǐng)求我已收到,我這方的數(shù)據(jù)流就從這個(gè)數(shù)開(kāi)始。B的ACK是A的seq加1,即0+1=1
3:A收到B的回復(fù)后,它的seq是它的上個(gè)請(qǐng)求的seq加1,即0+1=1,意思也是:你的回復(fù)我收到了,我這方的數(shù)據(jù)流就從這個(gè)數(shù)開(kāi)始。A此時(shí)的ACK是B的seq加1,即0+1=1
數(shù)據(jù)傳輸階段:
序號(hào) ???????方向 ????seq ????????????ack ????????????????????????????????????size
23 ????????????????A->B ???????????????40000 ????????70000 ????????????????????????????????1514
24 ????????????????B->A ???????????????70000 ????????40000+1514-54=41460 ????54
25 ????????????????A->B ???????????????41460 ????????70000+54-54=70000 ????????1514
26 ????????????????B->A ???????????????70000 ????????41460+1514-54=42920 ????54
解釋:
23:B接收到A發(fā)來(lái)的seq=40000,ack=70000,size=1514的數(shù)據(jù)包。
24:于是B向A也發(fā)一個(gè)數(shù)據(jù)包,告訴A,你的上個(gè)包我收到了。B的seq就以它收到的數(shù)據(jù)包的ACK填充,ACK是它收到的數(shù)據(jù)包的SEQ加上數(shù)據(jù)包的大小(不包括以太網(wǎng)協(xié)議頭,IP頭,TCP頭),以證實(shí)B發(fā)過(guò)來(lái)的數(shù)據(jù)全收到了。
25:A在收到B發(fā)過(guò)來(lái)的ack為41460的數(shù)據(jù)包時(shí),一看到41460,正好是它的上個(gè)數(shù)據(jù)包的seq加上包(應(yīng)用層純數(shù)據(jù))的大小,就明白,上次發(fā)送的數(shù)據(jù)包已安全到達(dá)。于是它再發(fā)一個(gè)數(shù)據(jù)包給B。這個(gè)正在發(fā)送的數(shù)據(jù)包的seq也以它收到的數(shù)據(jù)包的ACK填充,ACK就以它收到的數(shù)據(jù)包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長(zhǎng),沒(méi)數(shù)據(jù)項(xiàng))。
其實(shí),在握手和結(jié)束時(shí)確認(rèn)號(hào)應(yīng)該是對(duì)方序列號(hào)加1,傳輸數(shù)據(jù)時(shí)則是對(duì)方序列號(hào)加上對(duì)方攜帶應(yīng)用層數(shù)據(jù)的長(zhǎng)度。如果從以太網(wǎng)包返回來(lái)計(jì)算所加的長(zhǎng)度,就嫌走彎路了。
另外,如果對(duì)方?jīng)]有數(shù)據(jù)過(guò)來(lái),則自己的確認(rèn)號(hào)不變,序列號(hào)為上次的序列號(hào)加上本次應(yīng)用層數(shù)據(jù)發(fā)送長(zhǎng)度。
TCP的SEQ和ACK總結(jié):??????
???????在TCP通訊中,無(wú)論是建立連接,數(shù)據(jù)傳輸,友好斷開(kāi),強(qiáng)制斷開(kāi),都離不開(kāi)Seq值和Ack值,它們是TCP傳輸?shù)目煽勘WC。Seq是發(fā)送方告訴接收方,我當(dāng)前從第Seq個(gè)字節(jié)開(kāi)始發(fā)送len個(gè)字節(jié)數(shù)據(jù)(不包括以太網(wǎng)Eth頭,IP頭和Tcp頭,也就是純數(shù)據(jù)長(zhǎng)度)給你,而Ack則是接收方給發(fā)送方回復(fù):接收方回復(fù)的Ack=發(fā)送方Seq+發(fā)送數(shù)據(jù)長(zhǎng)度len。
??????在建立連接雙方握手時(shí),發(fā)送方的Seq為0,表示發(fā)送的數(shù)據(jù)長(zhǎng)度也為0,這時(shí)接收方收到數(shù)據(jù)幀后,會(huì)判斷Seq+數(shù)據(jù)長(zhǎng)度為0或者Seq+數(shù)據(jù)長(zhǎng)度為1的話,那么在回應(yīng)發(fā)送方的Ack的值就為1(也就表示確認(rèn)號(hào)有效,為0的話就表示數(shù)據(jù)包中不包含確認(rèn)信息(即不含有Ack字段),忽略確認(rèn)號(hào)字段)。
??????在數(shù)據(jù)傳輸中,如果Seq+數(shù)據(jù)長(zhǎng)度不為0或1并且數(shù)據(jù)長(zhǎng)度不為0的話,則回應(yīng)時(shí)的Ack就等于Seq+數(shù)據(jù)長(zhǎng)度的值,這就表示我已經(jīng)收到Seq+數(shù)據(jù)長(zhǎng)度個(gè)字節(jié)的數(shù)據(jù)。發(fā)送方收到該Ack就會(huì)比較自己的Seq+剛發(fā)出去的純數(shù)據(jù)長(zhǎng)度,如果一致,則回應(yīng)接收方的Ack,并且發(fā)送下一個(gè)包,否則將重發(fā)該包,若超時(shí)還沒(méi)收到Ack也會(huì)重發(fā)該包。
————————————————
版權(quán)聲明:本文為CSDN博主「ByteBai」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bytebai/article/details/21752925
總結(jié)
以上是生活随笔為你收集整理的TCP:SEQ号与ACK号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不抓包,如何学得了 TCP
- 下一篇: 网络协议系列之四:IGMP、ICMP和A