置位概念:根據(jù) TCP 的包頭字段叼架,存在幾個(gè)重要的字段
- seq(Sequence Number 序號/序列號):seq 序號隨機(jī)生成
- ack(Acknowledgement number 確認(rèn)號):ack 序號
- URG:緊急指針有效
- ACK:驗(yàn)證 ack 確認(rèn)號有效(為了與確認(rèn)號 ack 區(qū)分開呐粘,我們用大寫表示)
- PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層
- RST:重置連接
- SYN(同步序列編號):位數(shù)置 1新荤,表示建立 TCP 連接
- FIN:位數(shù)置 1思币,表示斷開 TCP 連接
1棵红、三次握手(three-way handshake)
三次握手過程說明
- 1噪舀、由客戶端發(fā)送建立 TCP 連接請求的
SYN 報(bào)文
垢油,其中報(bào)文中包含 seq 序列號,并且將報(bào)文中的 SYN 字段置為 1琅催,表示需要建立 TCP 連接居凶。(SYN=1,seq=x藤抡,x 為客戶端隨機(jī)生成)- 2侠碧、由服務(wù)端回復(fù)客戶端發(fā)送的 TCP 連接請求,并發(fā)送
SYN 報(bào)文
和ACK 報(bào)文
缠黍,其中包含 seq 序列號弄兜,并且將 SYN 置為 1,而且會(huì)產(chǎn)生 ack 字段嫁佳,ack 字段數(shù)值是在客戶端發(fā)送過來的 seq 序列號的基礎(chǔ)上加 1 進(jìn)行回復(fù)挨队。(SYN=1,seq=y蒿往,ack=x+1,y 為服務(wù)端隨機(jī)生成)- 3湿弦、客戶端收到服務(wù)端發(fā)送的 TCP 建立驗(yàn)證請求后瓤漏,發(fā)送
ACK 報(bào)文
,會(huì)使自己的 seq 序列號加 1 表示颊埃,并且再次回復(fù) ack 驗(yàn)證請求蔬充,在服務(wù)端發(fā)過來的 seq 上加 1 進(jìn)行回復(fù)。(SYN=1班利,ack=y+1饥漫,seq=x+1)至此 TCP 連接的 3 次握手過程完畢
2、四次揮手
四次揮手過程說明
- 1罗标、 客戶端發(fā)送斷開 TCP 連接請求庸队,并發(fā)送
FIN 報(bào)文
,其中報(bào)文中包含 seq 序列號闯割,是由發(fā)送端隨機(jī)生成的彻消,并且還將報(bào)文中的 FIN 字段置為 1,表示需要斷開 TCP 連接宙拉。(FIN=1宾尚,seq=x,x 由客戶端隨機(jī)生成)- 2谢澈、服務(wù)端會(huì)回復(fù)客戶端發(fā)送的 TCP 斷開請求煌贴,并發(fā)送
ACK 報(bào)文
御板,其包含 seq 序列號,是由回復(fù)端隨機(jī)生成的牛郑,而且會(huì)產(chǎn)生 ack 字段稳吮,ack 字段數(shù)值是在客戶端發(fā)過來的 seq 序列號基礎(chǔ)上加 1 進(jìn)行回復(fù),以便客戶端收到信息時(shí)井濒,知曉自己的 TCP 斷開請求已經(jīng)得到驗(yàn)證灶似。(ack=x+1,seq=y瑞你,y 由服務(wù)端隨機(jī)生成)- 3酪惭、服務(wù)端在回復(fù)完客戶端的 TCP 斷開請求后,不會(huì)馬上進(jìn)行 TCP 連接的斷開者甲,服務(wù)端會(huì)先確保斷開前春感,所有傳輸?shù)娇蛻舳说臄?shù)據(jù)是否已經(jīng)傳輸完畢,一旦確認(rèn)傳輸數(shù)據(jù)完畢虏缸,就會(huì)發(fā)送
FIN 報(bào)文
和ACK 報(bào)文
鲫懒, 將回復(fù)報(bào)文的 FIN 字段置 1,并且產(chǎn)生隨機(jī) seq 序列號刽辙,還會(huì)產(chǎn)生 ack 字段窥岩,ack 字段數(shù)值是在客戶端發(fā)過來的 seq 序列號基礎(chǔ)上加 1 進(jìn)行回復(fù)。(FIN=1宰缤,ack=x+1颂翼,seq=z,z由服務(wù)端隨機(jī)生成)- 4慨灭、客戶端收到服務(wù)端的 TCP 斷開請求后朦乏,會(huì)回復(fù)服務(wù)端的斷開請求,并發(fā)送
FIN 報(bào)文
和ACK 報(bào)文
氧骤,包含隨機(jī)生成的 seq 字段和 ack 字段呻疹,ack 字段會(huì)在服務(wù)端的 TCP 斷開請求的 seq 基礎(chǔ)上加 1,從而完成服務(wù)端請求的驗(yàn)證回復(fù)筹陵。(FIN=1刽锤,ack=z+1,seq=h惶翻,h為客戶端隨機(jī)生成)至此 TCP 斷開的 4 次揮手過程完畢
3姑蓝、11種狀態(tài)
LISTEN:等待從任何遠(yuǎn)端 TCP 和端口的連接請求
SYN_SENT:發(fā)送完一個(gè)連接請求后等待一個(gè)匹配的連接請求
SYN_RECEIVED:發(fā)送連接請求并且接收到匹配的連接請求以后等待連接請求確認(rèn)
ESTABLISHED:表示一個(gè)打開的連接,接收到的數(shù)據(jù)可以被投遞給用戶吕粗。連接的數(shù)據(jù)傳輸階段的正常狀態(tài)
FIN_WAIT_1:等待遠(yuǎn)端 TCP 的連接終止請求纺荧,或者等待之前發(fā)送的連接終止請求的確認(rèn)
FIN_WAIT_2:等待遠(yuǎn)端 TCP 的連接終止請求
CLOSE_WAIT:等待本地用戶的連接終止請求
CLOSING:等待遠(yuǎn)端 TCP 的連接終止請求確認(rèn)
LAST_ACK:等待先前發(fā)送給遠(yuǎn)端 TCP 的連接終止請求的確認(rèn)(包括它字節(jié)的連接終止請求的確認(rèn))
TIME_WAIT:等待足夠的時(shí)間過去以確保遠(yuǎn)端 TCP 接收到它的連接終止請求的確認(rèn)
TIME_WAIT 兩個(gè)存在的理由:
1.可靠的實(shí)現(xiàn) TCP 全雙工連接的終止
2.允許老的重復(fù)分節(jié)在網(wǎng)絡(luò)中消逝
CLOSED:不在連接狀態(tài)(這是為方便描述假想的狀態(tài),實(shí)際不存在)
- 1、一開始宙暇,建立連接之前客戶端和服務(wù)器的狀態(tài)都為
CLOSED狀態(tài)
输枯,表示沒有連接關(guān)系- 2、服務(wù)器創(chuàng)建 socket 后占贫,打開
監(jiān)聽(LISTEN)狀態(tài)
- 3桃熄、客戶端發(fā)送請求建立連接,向服務(wù)器發(fā)送 SYN 報(bào)文型奥,客戶端的狀態(tài)變?yōu)?
發(fā)送(SYN-SENT)狀態(tài)
- 4瞳收、服務(wù)器收到客戶端的報(bào)文后向客戶端發(fā)送 ACK 和 SYN 報(bào)文,此時(shí)服務(wù)器的狀態(tài)變?yōu)?
回復(fù)(SYN_RCVD)狀態(tài)
- 5厢汹、客戶端收到 ACK螟深、SYN,就向服務(wù)器發(fā)送 ACK烫葬,客戶端狀態(tài)變?yōu)?
穩(wěn)定連接(ESTABLISHED)狀態(tài)
- 6界弧、服務(wù)器端收到客戶端的 ACK 后變?yōu)?
穩(wěn)定連接(ESTABLISHED)狀態(tài)
。此時(shí)3次握手完成搭综,連接建立
由于 TCP 連接是全雙工的垢箕,斷開連接會(huì)比建立連接麻煩一點(diǎn)點(diǎn)
- 1、客戶端先向服務(wù)器發(fā)送 FIN 報(bào)文兑巾,請求斷開連接条获,其狀態(tài)變?yōu)?
FIN_WAIT1 狀態(tài)
- 2、服務(wù)器收到 FIN 后向客戶端發(fā)送 ACK闪朱,服務(wù)器的狀態(tài)變?yōu)?
CLOSE_WAIT 狀態(tài)
- 3月匣、客戶端收到 ack 后就進(jìn)入
FIN_WAIT2 狀態(tài)
,此時(shí)連接已經(jīng)斷開了一半了奋姿。如果服務(wù)器還有數(shù)據(jù)要發(fā)送給客戶端,就會(huì)繼續(xù)發(fā)送- 4素标、直到發(fā)完數(shù)據(jù)称诗,就會(huì)發(fā)送 FIN 報(bào)文,此時(shí)服務(wù)器進(jìn)入
LAST_ACK 狀態(tài)
- 5头遭、客戶端收到服務(wù)器的 FIN 后寓免,馬上發(fā)送 ack 給服務(wù)器,此時(shí)客戶端進(jìn)入
TIME_WAIT 狀態(tài)
- 6计维、再過了 2MSL 長的時(shí)間后進(jìn)入
CLOSED 狀態(tài)
袜香。服務(wù)器收到客戶端的 ack 就進(jìn)入CLOSED 狀態(tài)
- 至此,還有一個(gè)狀態(tài)沒有出來:
CLOSING 狀態(tài)
- CLOSING 狀態(tài)表示:客戶端發(fā)送了 FIN鲫惶,但是沒有收到服務(wù)器的 ack蜈首,卻收到了服務(wù)器的 FIN,這種情況發(fā)生在服務(wù)器發(fā)送的 ack 丟包的時(shí)候,因?yàn)榫W(wǎng)絡(luò)傳輸有時(shí)會(huì)有意外
四次揮手的 2MSL(TIME-WAIT)作用
2MSL 是主動(dòng)方在第四次揮手后進(jìn)入等待時(shí)間
首先弄清楚幾個(gè)概念:
1)RTT:客戶端到服務(wù)端的往返所花時(shí)間
2)RTO:超時(shí)重傳時(shí)間(與重傳機(jī)制掛鉤)
3)MSL:TCP報(bào)文在網(wǎng)絡(luò)中最長存活時(shí)間
設(shè)置 2MSL 的原因是:主要擔(dān)心主動(dòng)方第四次揮手的 ack 沒有被被動(dòng)方接收到欢策,那么被動(dòng)方在經(jīng)歷 1個(gè) MSL 時(shí)段后將重新發(fā)送第三次揮手 FIN 包吆寨,主動(dòng)方再次接收到 FIN 包時(shí)會(huì)再次發(fā)送 ack 包,直至 2MSL 時(shí)間終結(jié)踩寇,關(guān)閉連接
原文地址:https://blog.51cto.com/jinlong/2065461
原文地址:https://baijiahao.baidu.com/s?id=1693383134922615393&wfr=spider&for=pc