原文永久鏈接:https://github.com/AttemptWeb/Record/issues/10
<https://github.com/AttemptWeb/Record/issues/10>
上面有一篇專門介紹過(guò)TCP和UCP協(xié)議 <https://github.com/AttemptWeb/Record/issues/6>
,其中只是粗略的提到TCP協(xié)議的三次握手,而四次揮手完全沒有說(shuō)到,所以這次專門總結(jié)了這篇文章,專門講講三次握手和四次揮手。
備注:(下文中提到的專業(yè)術(shù)語(yǔ))
ack —— 確認(rèn)號(hào)碼
seq —— 順序號(hào)碼
ISN —— 初始序列號(hào)
ACK —— 確認(rèn),使得確認(rèn)號(hào)有效(握手使用)
SYN —— 用于初始化一個(gè)連接的序列號(hào),建立聯(lián)機(jī)
FIN —— 該報(bào)文的發(fā)送方已經(jīng)結(jié)束向?qū)Ψ桨l(fā)送數(shù)據(jù)
#
<https://herrylo.github.io/front/2019-08-17.html#tcp%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B>
TCP的三次握手
三次握手 實(shí)際就是Client端和Server端建立穩(wěn)定TCP連接的發(fā)送三個(gè)包的過(guò)程。
*
第一次握手:(SYN=1, ACK=0, seq=x):
Client發(fā)送SYN標(biāo)志位1的包到Server,以及初始序號(hào)x(保存在包頭的序列號(hào)seq字段,簡(jiǎn)稱ISN),和ACK標(biāo)志位為0,并進(jìn)入SYN_SEND狀態(tài),等待Server確認(rèn)。
*
第二次握手:(SYN=1, ACK=1, seq=y, ack=x+1):
Server發(fā)回確認(rèn)包(ACK)應(yīng)答。即 SYN 標(biāo)志位和 ACK
標(biāo)志位均為1。Server確認(rèn)ISN序列號(hào),放到seq域里,同時(shí)將確認(rèn)序號(hào)(ack)設(shè)置為Client的ISN加1,即x+1。 發(fā)送完畢后,Server進(jìn)入
SYN_RCVD 狀態(tài)。
*
第三次握手:(ACK=1,seq=x+1,ack=y+1)
Client再次發(fā)送確認(rèn)包(ACK),ACK標(biāo)志位為1,并且把Server發(fā)來(lái)ISN的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方。
發(fā)送完畢后,Client和Server建立連接,TCP 握手結(jié)束。
#
<https://herrylo.github.io/front/2019-08-17.html#tcp%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B>
TCP四次揮手
四次揮手 實(shí)際就是Client端和Server端關(guān)閉TCP連接的發(fā)送四個(gè)包的過(guò)程。
* 第一次揮手(FIN=1,seq=u)
Client 想要關(guān)閉連接,Client 會(huì)發(fā)送一個(gè)FIN標(biāo)志位置為1,當(dāng)前序列號(hào)為u的包,表示需要關(guān)閉連接了。Client進(jìn)入 FIN_WAIT_1 狀態(tài)。
* 第二次揮手(ACK=1,seq=v,ack=u+1)
Server收到Client的FIN包之后,會(huì)發(fā)送一個(gè)確認(rèn)序號(hào)為收到的序列號(hào)u+1的包,表明自己接受到了Client關(guān)閉連接的請(qǐng)求,但還未準(zhǔn)備好關(guān)閉連接。Server進(jìn)入
CLOSE_WAIT 狀態(tài),Client進(jìn)入 FIN_WAIT_2 狀態(tài)。
* 第三次揮手(FIN=1,ACK=1,seq=w,ack=u+1)
當(dāng)Server將剩余數(shù)據(jù)發(fā)送完之后,會(huì)發(fā)送一個(gè)自己的FIN包,序列號(hào)為u+1。Server進(jìn)入 LAST_ACK 狀態(tài),等待來(lái)自Client的最后一個(gè)ACK。
* 第四次揮手(ACK=1,seq=u+1,ack=w+1)
Client接收到來(lái)自Server端的關(guān)閉請(qǐng)求之后,發(fā)送最后一個(gè)ACK確認(rèn)包,確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1。Client進(jìn)入
TIME_WAIT狀態(tài),等待可能出現(xiàn)的要求重傳的 ACK
包。Server接收到這個(gè)確認(rèn)包之后,關(guān)閉連接,進(jìn)入CLOSED狀態(tài)。(Client會(huì)等待2MSL之后,沒有收到Server的ACK
,就確認(rèn)Server進(jìn)入CLOSED狀態(tài),自己也關(guān)閉進(jìn)入CLOSED狀態(tài)。)
發(fā)送完畢后,Client和Server斷開連接,TCP 揮手結(jié)束。
以上就是這次揮手和握手的全部?jī)?nèi)容了,如果有疑問歡迎留言哦。
#
<https://herrylo.github.io/front/2019-08-17.html#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99>
參考資料
知乎:“三次握手,四次揮手”你真的懂嗎? <https://zhuanlan.zhihu.com/p/53374516>
bilibili: 計(jì)算機(jī)網(wǎng)絡(luò)TCP傳輸層連接管理
<https://www.bilibili.com/video/av9876107/?p=70&t=656>
ps: 順便推一下自己的個(gè)人公眾號(hào):Yopai,有興趣的可以關(guān)注,每周不定期更新,分享可以增加世界的快樂
熱門工具 換一換