一 首先我們看下TCP報(bào)文頭
說(shuō)明:
1 源端口號(hào)(16位):標(biāo)識(shí)發(fā)送端端口號(hào)
2 目的端口號(hào)(16位):標(biāo)識(shí)目的端口號(hào)
3 序列號(hào):表示發(fā)送數(shù)據(jù)的位置侦另,字段長(zhǎng)為32位尉共。每發(fā)送一次數(shù)據(jù)硫麻,就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小
序列號(hào)并非從0開(kāi)始,而是由發(fā)送端生成一個(gè)隨機(jī)數(shù)發(fā)送給目標(biāo)機(jī)器,然后再將每轉(zhuǎn)發(fā)過(guò)去的字節(jié)數(shù)累加到初始值上表示數(shù)據(jù)的位置浇辜。
4 確認(rèn)應(yīng)答號(hào):表示下一次應(yīng)該收到的數(shù)據(jù)的序列號(hào)唾戚,字段長(zhǎng)為32字節(jié)。發(fā)送端收到這個(gè)確認(rèn)應(yīng)答以后可以認(rèn)為在這個(gè)序號(hào)以前的數(shù)據(jù)都已經(jīng)被正常接收熊镣。
PS:序號(hào)的優(yōu)點(diǎn)如下
(1)保證報(bào)文按序到達(dá)募书。
(2)保證可靠性。
(3)保證效率鬼吵。
(4)精準(zhǔn)的報(bào)告哪些報(bào)文已經(jīng)收到篮赢,哪些需要重傳
5 首部長(zhǎng)度:該字段長(zhǎng)度為4位,單位為4字節(jié)(32位)涣脚。TCP首部長(zhǎng)度不包括選項(xiàng)的話寥茫,是20個(gè)字節(jié),20/4=5妙同,5的二進(jìn)制序列:0101膝迎,報(bào)頭長(zhǎng)度也叫數(shù)據(jù)偏移,所以該字段可以設(shè)置為5芒涡,選項(xiàng)字段最大的是40字節(jié),所以赠群,TCP首部長(zhǎng)度為最大為20+40=60字節(jié)旱幼,該字段可以設(shè)置的最大長(zhǎng)度為60/4=15。
6 保留:該字段主要是為了以后擴(kuò)展時(shí)使用冬三,其長(zhǎng)度為4位缘缚。一般設(shè)置為0,即使收到的包在該字段不為0窝爪,此包也不會(huì)丟棄
7控制位:字段長(zhǎng)為6齐媒,每一位從左到右分別為:URG、ACK啃勉、PSH双妨、RST、SYN泣特、FIN挑随。當(dāng)對(duì)應(yīng)的值為1,表示有具體含義膏孟。
字段|含義
—|:—
URG|緊急指針是否有效拌汇。為1,表示某一位需要被優(yōu)先處理魁淳。
ACK|確認(rèn)號(hào)是否有效,一般置為1昆稿。
PSH|提示接收端應(yīng)用程序立即從TCP緩沖區(qū)把數(shù)據(jù)讀走息拜。
RST|對(duì)方要求重新建立連接,復(fù)位岛抄。
SYN|請(qǐng)求建立連接狈茉,并在其序列號(hào)的字段進(jìn)行序列號(hào)的初始值設(shè)定掸掸。建立連接扰付,設(shè)置為1.
FIN|希望斷開(kāi)連接。
8 窗口大杏疠骸:接收緩沖區(qū)的大小盐固,TCP不允許發(fā)送超過(guò)此處所示大小的數(shù)據(jù)
9 校驗(yàn)和:發(fā)送端填充,CRC校驗(yàn)志电,接收校驗(yàn)不通過(guò)蛔趴,則認(rèn)為數(shù)據(jù)有問(wèn)題。和UDP的區(qū)別是鱼蝉,UDP校驗(yàn)的是數(shù)據(jù)本身箫荡,TCP校驗(yàn)的不僅包含TCP首部,而且包含TCP數(shù)據(jù)部分吉挣。
我們?cè)谥刂v一下在三次握手和四次揮手中的用到序列號(hào)、確認(rèn)號(hào)及標(biāo)志位终吼。
序列號(hào)seq
占4個(gè)字節(jié)氯哮,用來(lái)標(biāo)記數(shù)據(jù)段的順序,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個(gè)序號(hào)姆打,第一個(gè)字節(jié)的編號(hào)由本地隨機(jī)產(chǎn)生肠虽,給字節(jié)編上序號(hào)后税课,就給每一個(gè)報(bào)文段指派一個(gè)序號(hào),序列號(hào)seq就是這個(gè)報(bào)文段中的第一個(gè)字節(jié)的數(shù)據(jù)編號(hào)垒玲。確認(rèn)號(hào)ack
占4個(gè)字節(jié)找颓,期待收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào),序列號(hào)表示報(bào)文段攜帶數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào)佛析,而確認(rèn)號(hào)指的是期望接受到下一個(gè)字節(jié)的編號(hào)帘不,因此擋墻報(bào)文段最后一個(gè)字節(jié)的編號(hào)+1即是確認(rèn)號(hào)。
3. 確認(rèn)ACK
占1個(gè)比特位储狭,僅當(dāng)ACK=1捣郊,確認(rèn)號(hào)字段才有效呛牲。ACK=0,確認(rèn)號(hào)無(wú)效着茸。
同步SYN
連接建立時(shí)用于同步序號(hào)。當(dāng)SYN=1猜绣,ACK=0表示:這是一個(gè)連接請(qǐng)求報(bào)文段敬特。若同意連接,則在響應(yīng)報(bào)文段中使用SYN=1辣之,ACK=1.因此皱炉,SYN=1表示這是一個(gè)連接請(qǐng)求,或連接接收?qǐng)?bào)文奏夫,SYN這個(gè)標(biāo)志位只有在TCP建立連接才會(huì)被置為1历筝,握手完成后SYN標(biāo)志位被置為0.終止FIN
用來(lái)釋放一個(gè)
6 TCP/IP 三次握手過(guò)程:
三次握手的過(guò)程
step1:第一次握手
建立連接時(shí)梳猪,客戶端發(fā)送SYN包到服務(wù)器蒸痹,其中包含客戶端的初始序號(hào)seq=x叠荠,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)逃呼。(其中者娱,SYN=1,ACK=0推姻,表示這是一個(gè)TCP連接請(qǐng)求數(shù)據(jù)報(bào)文框沟;序號(hào)seq=x增炭,表明傳輸數(shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)是x)隙姿。
step2:第二次握手
服務(wù)器收到請(qǐng)求后防症,必須確認(rèn)客戶的數(shù)據(jù)包。同時(shí)自己也發(fā)送一個(gè)SYN包饲嗽,即SYN+ACK包奈嘿,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)裙犹。(其中確認(rèn)報(bào)文段中,標(biāo)識(shí)位SYN=1袄膏,ACK=1掺冠,表示這是一個(gè)TCP連接響應(yīng)數(shù)據(jù)報(bào)文,并含服務(wù)端的初始序號(hào)seq(服務(wù)器)=y斥黑,以及服務(wù)器對(duì)客戶端初始序號(hào)的確認(rèn)號(hào)ack(服務(wù)器)=seq(客戶端)+1=x+1)眉厨。
step3:第三次握手
客戶端收到服務(wù)器的SYN+ACK包憾股,向服務(wù)器發(fā)送一個(gè)序列號(hào)(seq=x+1),確認(rèn)號(hào)為ack(客戶端)=y+1耻姥,此包發(fā)送完畢有咨,客戶端和服務(wù)器進(jìn)入ESTAB_LISHED(TCP連接成功)狀態(tài),完成三次握手婉商。
未連接隊(duì)列
在三次握手協(xié)議中,服務(wù)器維護(hù)一個(gè)未連接隊(duì)列盯捌,該隊(duì)列為每個(gè)客戶端的SYN包(syn=j)開(kāi)設(shè)一個(gè)條目蘑秽,該條目表明服務(wù)器已收到SYN包肠牲,并向客戶發(fā)出確認(rèn),正在等待客戶的確認(rèn)包時(shí)渡嚣,刪除該條目肥印,服務(wù)器進(jìn)入ESTAB_LISHED狀態(tài)
7 斷開(kāi)連接TCP/IP
step1:第一次揮手
首先深碱,客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送种蘸,然后等待服務(wù)器的確認(rèn)竞膳。其中終止標(biāo)志位FIN=1坦辟,序列號(hào)seq=u章办。
step2:第二次揮手
服務(wù)器收到這個(gè)FIN,它發(fā)送一個(gè)ACK挪蹭,確認(rèn)ack為收到的序號(hào)加一休偶。
step3:第三次揮手
關(guān)閉服務(wù)器到客戶端的連接,發(fā)送一個(gè)FIN給客戶端词顾。
step4:第四次揮手
客戶端收到FIN后肉盹,并發(fā)回一個(gè)ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)seq設(shè)置為收到序號(hào)加一骤肛。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉窍蓝,而另一方執(zhí)行被動(dòng)關(guān)閉。
客戶端發(fā)送FIN后秕豫,進(jìn)入終止等待狀態(tài)混移,服務(wù)器收到客戶端連接釋放報(bào)文段后侮穿,就立即給客戶端發(fā)送確認(rèn),服務(wù)器就進(jìn)入CLOSE_WAIT狀態(tài)回铛,此時(shí)TCP服務(wù)器進(jìn)程就通知高層應(yīng)用進(jìn)程克锣,因而從客戶端到服務(wù)器的連接就釋放了袭祟。此時(shí)是“半關(guān)閉狀態(tài)”,即客戶端不可以發(fā)送給服務(wù)器您没,服務(wù)器可以發(fā)送給客戶端胆绊。
此時(shí),如果服務(wù)器沒(méi)有數(shù)據(jù)報(bào)發(fā)送給客戶端仆抵,其應(yīng)用程序就通知TCP釋放連接肢础,然后發(fā)送給客戶端連接釋放數(shù)據(jù)報(bào),并等待確認(rèn)剩盒】埽客戶端發(fā)送確認(rèn)后,進(jìn)入TIME_WAIT狀態(tài)跟匆,但是此時(shí)TCP連接還沒(méi)有釋放玛臂,然后經(jīng)過(guò)等待計(jì)時(shí)器設(shè)置的2MSL后封孙,才進(jìn)入到CLOSED狀態(tài)。
2.為什么需要2MSL時(shí)間泡徙?
首先堪藐,MSL即Maximum Segment Lifetime挑围,就是最大報(bào)文生存時(shí)間,是任何報(bào)文在網(wǎng)絡(luò)上的存在的最長(zhǎng)時(shí)間模捂,超過(guò)這個(gè)時(shí)間報(bào)文將被丟棄∪ⅲ《TCP/IP詳解》中是這樣描述的:MSL是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間寓搬。RFC 793中規(guī)定MSL為2分鐘,實(shí)際應(yīng)用中常用的是30秒镣典、1分鐘、2分鐘等澎剥。
TCP的TIME_WAIT需要等待2MSL哑姚,當(dāng)TCP的一端發(fā)起主動(dòng)關(guān)閉芜茵,三次揮手完成后發(fā)送第四次揮手的ACK包后就進(jìn)入這個(gè)狀態(tài),等待2MSL時(shí)間主要目的是:防止最后一個(gè)ACK包對(duì)方?jīng)]有收到绞佩,那么對(duì)方在超時(shí)后將重發(fā)第三次握手的FIN包品山,主動(dòng)關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個(gè)ACK應(yīng)答包躬贡。在TIME_WAIT狀態(tài)時(shí)兩端的端口不能使用拂玻,要等到2MSL時(shí)間結(jié)束才可以繼續(xù)使用。當(dāng)連接處于2MSL等待階段時(shí)任何遲到的報(bào)文段都將被丟棄魄懂。
3.為什么是四次揮手闯第,而不是三次或是五次咳短、六次?
雙方關(guān)閉連接要經(jīng)過(guò)雙方都同意篡腌。所以勾效,首先是客服端給服務(wù)器發(fā)送FIN,要求關(guān)閉連接杨伙,服務(wù)器收到后會(huì)發(fā)送一個(gè)ACK進(jìn)行確認(rèn)限匣。服務(wù)器然后再發(fā)送一個(gè)FIN,客戶端發(fā)送ACK確認(rèn)睛约,并進(jìn)入TIME_WAIT狀態(tài)哲身。等待2MSL后自動(dòng)關(guān)閉勘天。
總結(jié):
(1)為了保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)服務(wù)器。即最后一個(gè)確認(rèn)報(bào)文可能丟失商膊,服務(wù)器會(huì)超時(shí)重傳晕拆,然后服務(wù)器發(fā)送FIN請(qǐng)求關(guān)閉連接材蹬,客戶端發(fā)送ACK確認(rèn)实幕。一個(gè)來(lái)回是兩個(gè)報(bào)文生命周期。
如果沒(méi)有等待時(shí)間堤器,發(fā)送完確認(rèn)報(bào)文段就立即釋放連接的話昆庇,服務(wù)器就無(wú)法重傳,因此也就收不到確認(rèn)闸溃,就無(wú)法按步驟進(jìn)入CLOSED狀態(tài)整吆,即必須收到確認(rèn)才能close。
(2)防止已經(jīng)失效的連接請(qǐng)求報(bào)文出現(xiàn)在連接中辉川。經(jīng)過(guò)2MSL表蝙,在這個(gè)連續(xù)持續(xù)的時(shí)間內(nèi),產(chǎn)生的所有報(bào)文段就可以都從網(wǎng)絡(luò)消失乓旗。
源文章地址:https://blog.csdn.net/ZWE7616175/article/details/80432486 轉(zhuǎn)載