TCP首部
-
源端口和目的端口
用于確定發(fā)送端和接收端的應(yīng)用進(jìn)程遏乔。
{ 客戶(hù)IP:客戶(hù)端口,服務(wù)IP:服務(wù)端口 }
四元組唯一確定互聯(lián)網(wǎng)中的每一個(gè)TCP連接雙方。- 服務(wù)端最大并發(fā)數(shù)是多少?
理論上是這個(gè)4元組的所有數(shù)量。
- 服務(wù)端最大并發(fā)數(shù)是多少?
序號(hào)
用來(lái)標(biāo)識(shí)從TCP發(fā)送端向TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流瞭空,表示這個(gè)報(bào)文段中的第N個(gè)數(shù)據(jù)字節(jié)。范圍 0 ~ (2^32-1)確認(rèn)序號(hào)
發(fā)送端所期望收到的下一字節(jié)序號(hào)。確認(rèn)序號(hào)應(yīng)該是 上次已成功收到的數(shù)據(jù)字節(jié)序+14位首部長(zhǎng)度
包括TCP首部長(zhǎng)度咆畏,為什么要只包括首部長(zhǎng)度而不是像UDP中包括首部和數(shù)據(jù)的總長(zhǎng)度南捂?因?yàn)門(mén)CP首部長(zhǎng)度是不固定的,而UDP的首部長(zhǎng)度是固定的旧找。-
標(biāo)志位
- URG 緊急指針有效
- ACK 確認(rèn)序號(hào)有效
- PSH 接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層
- RST 重建連接
- SYN 同步序號(hào)用來(lái)發(fā)起一個(gè)連接
- FIN 發(fā)送端完成發(fā)送任務(wù)
窗口大小
用于流量控制溺健,參考TCP流量控制。
- 選項(xiàng)
最常見(jiàn)的可選字段是最長(zhǎng)報(bào)文大小钮蛛,又稱(chēng)為MSS(Maximum Segment Size)鞭缭,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(SYN報(bào)文)中指明這個(gè)選項(xiàng),它指明本端所能接收的最大長(zhǎng)度的報(bào)文段魏颓,這樣做岭辣,通常是為了避免報(bào)文分段。
TCP完整狀態(tài)遷移圖
TCP連接建立
客戶(hù)發(fā)送一個(gè)SYN報(bào)文段指明客戶(hù)打算連接的服務(wù)器的端口甸饱,以及初始序號(hào)ISN沦童。
服務(wù)器發(fā)回包含服務(wù)器的初始序號(hào)的SYN報(bào)文段作為應(yīng)答,同時(shí)將確認(rèn)序號(hào)設(shè)置為客戶(hù)的ISN+1以對(duì)客戶(hù)的SYN報(bào)文段進(jìn)行確認(rèn)叹话。所以1個(gè)SYN報(bào)文將用一個(gè)字節(jié)序偷遗。
-
客戶(hù)發(fā)回一個(gè)確認(rèn)序號(hào)為服務(wù)器的ISN加1的ACK報(bào)文對(duì)服務(wù)器的SYN報(bào)文進(jìn)行確認(rèn)。
-
TCP連接為什么需要3次握手驼壶,為什么不是2次或者4次氏豌?
總的來(lái)說(shuō)是為了防止已失效的的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯(cuò)誤辅柴。
假設(shè)client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失箩溃,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了瞭吃,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server碌嘀。
本來(lái)這是一個(gè)早已失效的報(bào)文段。但server收到此失效的連接請(qǐng)求報(bào)文段后歪架,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求股冗。于是就向client發(fā)出確認(rèn)報(bào)文段,同意建立連接和蚪。假設(shè)不采用“三次握手”止状,那么只要server發(fā)出確認(rèn),新的連接就建立了攒霹。由于現(xiàn)在client并沒(méi)有發(fā)出建立連接的請(qǐng)求怯疤,因此不會(huì)理睬server的確認(rèn),也不會(huì)向server發(fā)送數(shù)據(jù)催束。但server卻以為新的運(yùn)輸連接已經(jīng)建立集峦,并一直等待client發(fā)來(lái)數(shù)據(jù)。這樣,server的很多資源就白白浪費(fèi)掉了塔淤。
采用 "三次握手" 的辦法可以防止上述現(xiàn)象發(fā)生摘昌。例如剛才那種情況,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)高蜂。server由于收不到確認(rèn)聪黎,就知道client并沒(méi)有要求建立連接。
連接建立超時(shí)
當(dāng)服務(wù)器
半打開(kāi)連接
TCP連接的一端異常崩潰备恤,或者在未通知對(duì)端的情況下關(guān)閉連接稿饰。比如一個(gè)常見(jiàn)的情況是TCP連接的一端異常斷電,就會(huì)導(dǎo)致TCP的半開(kāi)連接露泊。如果沒(méi)有數(shù)據(jù)傳輸湘纵,對(duì)端就不會(huì)知道本端的異常而一直處于ESTABLISHED狀態(tài)(TCP也可以自己配置keepalive選項(xiàng)實(shí)現(xiàn)心跳)。此時(shí)如果發(fā)生數(shù)據(jù)傳輸滤淳,會(huì)產(chǎn)生RST梧喷。
注意區(qū)分半打開(kāi)連接和半關(guān)閉連接。
同時(shí)打開(kāi)
對(duì)于TCP脖咐,同時(shí)打開(kāi)铺敌,它僅僅建立一條連接而不是2條。同時(shí)是4次握手
TCP連接的終止
因?yàn)門(mén)CP的連接是一個(gè)全雙工的屁擅,所以每一個(gè)方向必須單獨(dú)關(guān)閉偿凭。
當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)就發(fā)送一個(gè)FIN給對(duì)方來(lái)終止這個(gè)方向上的連接。收到一個(gè)FIN只是意味著在這一方向上沒(méi)有數(shù)據(jù)流動(dòng)派歌。
1弯囊、客戶(hù)端發(fā)送一個(gè)FIN,用來(lái)終結(jié)客戶(hù)到服務(wù)端的連接胶果。
2匾嘱、服務(wù)端收到這個(gè)FIN,它發(fā)回一個(gè)確認(rèn)客戶(hù)的ACK報(bào)文早抠,和SYN一樣霎烙,F(xiàn)IN也將占用一個(gè)字節(jié)序列。
3蕊连、服務(wù)端也向客戶(hù)發(fā)送一個(gè)FIN報(bào)文悬垃。
4、客戶(hù)發(fā)回一個(gè)確認(rèn)已收到服務(wù)端的FIN報(bào)文的ACK報(bào)文甘苍。
-
2MSL等待狀態(tài)
TIME_WAIT狀態(tài)也稱(chēng)為2MSL狀態(tài)尝蠕。
而MSL是指任何報(bào)文段在被丟棄前在網(wǎng)絡(luò)內(nèi)最長(zhǎng)時(shí)間。為什么需要等待2MSL载庭?
- 當(dāng)TCP執(zhí)行主動(dòng)關(guān)閉看彼,并發(fā)送最后一個(gè)ACK扇谣,在TIME_WAIT狀態(tài)停留的時(shí)間為2倍的MSL,這樣可以讓TCP可以有時(shí)間再次發(fā)送最后一個(gè)ACK闲昭,防止丟失(另一端超時(shí)并重發(fā)最后的FIN)
- 在發(fā)送完ACK報(bào)文段后罐寨,再經(jīng)過(guò)2MSL時(shí)間,就可以使本連接持續(xù)的時(shí)間所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失序矩。這樣就可以使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求的報(bào)文段
處于2MSL等待期間鸯绿,插口中使用的本地端口在默認(rèn)情況下不再使用,所以任何處于2MSL等待時(shí)簸淀,任何遲到的報(bào)文將被丟棄瓶蝴。
FIN_WAIT_2狀態(tài)
在FIN_WAIT_2狀態(tài)我們已經(jīng)發(fā)出了FIN,并且另一端已對(duì)它進(jìn)行確認(rèn)租幕。但只有當(dāng)另一端的進(jìn)程完成關(guān)閉(對(duì)端發(fā)送FIN)舷手,我們這端才會(huì)從FIN_WAIT_2狀態(tài)進(jìn)入TIME_WAIT狀態(tài)。這意味著我們這端可能永遠(yuǎn)保持這一狀態(tài)劲绪,另一端也就處于CLOSE_WAIT狀態(tài)男窟。
異常關(guān)閉
終止一個(gè)連接的正常方式是一方發(fā)送FIN。有時(shí)這種也稱(chēng)為有序釋放贾富,因?yàn)樵谒信抨?duì)數(shù)據(jù)都已發(fā)送之后才發(fā)送FIN歉眷,正常情況下沒(méi)有任何數(shù)據(jù)丟失。
但也有可能發(fā)送一個(gè)RST報(bào)文段而不是FIN來(lái)中途釋放一個(gè)連接颤枪,這被稱(chēng)為異常釋放汗捡。
收到RST報(bào)文段不會(huì)產(chǎn)生任何響應(yīng),也不會(huì)進(jìn)行確認(rèn)畏纲。收到RST的一方將終止該連接扇住,并通知應(yīng)用層連接復(fù)位。
半關(guān)閉
TCP 提供了連接的一端在結(jié)束它的發(fā)送后還能接收來(lái)自另一端數(shù)據(jù)的能力盗胀,這就是所謂的半關(guān)閉艘蹋。
同時(shí)關(guān)閉
參考資料
《TCP/IP詳解 卷1:協(xié)議》[美] W.Richard Stevens