溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

tcp協(xié)議報文和三次握手與四次揮手

發(fā)布時間:2020-06-25 17:56:48 來源:網(wǎng)絡(luò) 閱讀:891 作者:攻城獅趙峰 欄目:建站服務(wù)器

tcp協(xié)議

tcp是面向連接、可靠的進(jìn)程到進(jìn)程之間的協(xié)議。tcp提供全雙工服務(wù):即:數(shù)據(jù)可在同一時間雙向傳輸。

tcp報文段首部格式:

tcp協(xié)議報文和三次握手與四次揮手

各字段含義:

源端口號:16位字段,為發(fā)送端進(jìn)程對應(yīng)的端口號

目標(biāo)端口:16位字段,為接收端進(jìn)程對應(yīng)的端口號,接收方接收到數(shù)據(jù)包之后根據(jù)這個字段確定將數(shù)據(jù)發(fā)送給對應(yīng)程序來處理

序號:32位字段,當(dāng)tcp從進(jìn)程中接收到數(shù)據(jù)之后,就會把他存儲在發(fā)送緩存中。并對每一個字節(jié)進(jìn)行編號,形成的序列號。特點如下:

 會生成一個隨機數(shù)作為第一個字節(jié)的編號,成為序列號(ISN),范圍是:0-(232-1)

 tcp每個方向的編號都是相互獨立的

 當(dāng)字節(jié)都被編上號之后,tcp就給每個報文段指定一個序號,序號就是該報文段中第一個字節(jié)的編號

確認(rèn)號:32位字段,確認(rèn)號是對發(fā)送端的確認(rèn)信息,用它來告訴發(fā)送端這個序號之前的數(shù)據(jù)段都已經(jīng)收到,如確認(rèn)號是x,那么表示收到前x-1個數(shù)據(jù)段

首部長度:用它可以確定首部數(shù)據(jù)結(jié)構(gòu)的字節(jié)長度,一般情況下tcp的首部長度是20字節(jié),但是首部長度最長可以擴展至60字節(jié)

保留:保留作為擴展使用。

控制位:tcp的連接和斷開都受這六個控制位指揮。含義如下:

  URG:緊急指針有效位

  ACK:只有當(dāng)ACK=1時,確認(rèn)序列號字段才有效,當(dāng)ACK=0時,確認(rèn)號字段無效。

  PSH:標(biāo)志位為1時要求接收方盡快將數(shù)據(jù)段送達(dá)應(yīng)用層。

  RST:當(dāng)RST的值為1的時候通知重新建立tcp連接。

  SYN:同步序號為,tcp需要建立連接時將這個值設(shè)為1。

  FIN:發(fā)送端完成發(fā)送任務(wù),當(dāng)tcp完成數(shù)據(jù)傳輸需要斷開連接時,提出斷開連接方,將此控制位設(shè)置成1。

窗口值:本地可接受數(shù)據(jù)段的數(shù)目,這個值的大小隨著網(wǎng)絡(luò)是可變的。當(dāng)網(wǎng)絡(luò)暢通時,值變大可加快傳輸速度,網(wǎng)絡(luò)不穩(wěn)定時,值變小可保證傳輸數(shù)據(jù)的可靠性;tcp協(xié)議中的流量控制就是更改窗口值來實現(xiàn)的

校驗和:用來做差錯控制,發(fā)送tcp報文前計算一遍校驗和。當(dāng)接收端收到數(shù)據(jù)后再做一次校驗,當(dāng)兩個值一致時,說明數(shù)據(jù)是沒問題的。

緊急指針:和URG配合使用,當(dāng)URG=1時有效;

選項:在tcp首部可以有多達(dá)40字節(jié)的可選信息。

tcp的連接與斷開:

在數(shù)據(jù)通信之前,發(fā)送端與接收端要建立連接;等數(shù)據(jù)發(fā)送結(jié)束后,雙方在斷開連接。tcp連接的每一方都是由一個IP和端口組成的、

三次握手與四次揮手如圖:

tcp協(xié)議報文和三次握手與四次揮手

假設(shè)服務(wù)器監(jiān)聽80端口。由客戶端進(jìn)行訪問

三次握手過程:

第一次:

客戶端使用隨機的端口向服務(wù)器的80端口發(fā)起連接請求,此過程中典型的標(biāo)志就是tcp的SYN控制位為1.其他五個控制位全為0;

第二次:

由兩部分完成:

1、服務(wù)端收到客戶端發(fā)送的連接請求,向客戶端回復(fù)確認(rèn)信息。此過程中典型的標(biāo)志就是TCP的ACK控制位為1,其他五個控制位全為0,而且序列號是客戶端初始序列號+1;

2、服務(wù)端同時也向客戶端發(fā)送一個連接請求,此過程中典型的標(biāo)志位與第一次握手中一樣。即TCP的SYN控制位是1,其他五個控制位為0。

為提高通信效率,這兩部分是在同一個數(shù)據(jù)包中實現(xiàn)。

第三次:

客戶端收到服務(wù)端的回復(fù)(確認(rèn)和請求),也需要向服務(wù)端發(fā)送一個確認(rèn)信息;此過程的典型標(biāo)志就是tcp的ACK控制位為1,其他五個控制位全為0;確認(rèn)序列號為服務(wù)端的初始序列號+1

三次握手完成,tcp連接建立成功。使用命令netstat -an 命令可查看狀態(tài)為:ESTABLISHED

三次握手狀態(tài)監(jiān)控:

服務(wù)器創(chuàng)建socket后開始監(jiān)聽,變?yōu)長ISTEN狀態(tài)??蛻舳苏埱蠼⑦B接,向服務(wù)器發(fā)送SYN報文,客戶端的狀態(tài)變?yōu)镾YN_SENT。服務(wù)器收到客戶端的報文后向客戶端發(fā)送ACK和SYN報文,此時服務(wù)器的狀態(tài)變?yōu)镾YN_RCVD。然后,客戶端收到ACK、SYN,就向服務(wù)器發(fā)送ACK,客戶端狀態(tài)變?yōu)镋STABLISHED,服務(wù)器收到客戶端的ACK后也變?yōu)镋STABLISHED。此時,3次握手完成,連接建立!

四次揮手過程:

第一次:

客戶端向服務(wù)器發(fā)送控制位FIN和ACK位置為1的tcp報文

第二次:

服務(wù)器向客戶端返回控制位ACK為1的tcp報文

此時處于一個半關(guān)閉的狀態(tài),客戶端終止發(fā)送數(shù)據(jù),只回復(fù)ACK確認(rèn)報文,不再發(fā)送數(shù)據(jù)報文,但是扔然可以接收數(shù)據(jù)。當(dāng)服務(wù)器發(fā)送完數(shù)據(jù)之后,向客戶端發(fā)送FIN報文并收到ACK確認(rèn),這樣就完全關(guān)閉了這個tcp連接

第三次:

服務(wù)器向客戶端發(fā)送控制位FIN和ACK位置為1的tcp報文

第四次:

客戶端向服務(wù)器返回控制位ACK為1的tcp報文

四次揮手狀態(tài)監(jiān)控:

由于tcp連接是全雙工的,斷開連接會比建立連接麻煩一點點。客戶端先向服務(wù)器發(fā)送FIN報文,請求斷開連接,其狀態(tài)變?yōu)镕IN_WAIT1。服務(wù)器收到FIN后向客戶端發(fā)生ACK,服務(wù)器狀態(tài)變?yōu)镃LOSE_WAIT??蛻舳耸盏紸CK后就進(jìn)入FIN_WAIT2狀態(tài)。此時連接已經(jīng)斷開了一半了。如果服務(wù)器還有數(shù)據(jù)要發(fā)送給客戶端,就會繼續(xù)發(fā)送。直到發(fā)完了,就發(fā)送FIN報文,此時服務(wù)器進(jìn)入LAST_ACK狀態(tài)??蛻舳耸盏椒?wù)器的FIN后,馬上發(fā)送ACK給服務(wù)器,此時客戶端進(jìn)入TIME_WAIT狀態(tài),再過了2MSL長的時間后進(jìn)入CLOSED狀態(tài)。服務(wù)器收到客戶端的ACK就進(jìn)入CLOSED狀態(tài)。

至此,還有一個狀態(tài)沒有提及:CLOSING狀態(tài)。CLOSING狀態(tài)表示客戶端發(fā)生了FIN,但沒有收到服務(wù)器的ACK,卻收到了服務(wù)器的FIN。這種情況發(fā)生在服務(wù)器發(fā)送的ACK丟包的時候,因為網(wǎng)絡(luò)傳輸有時會有意外。


使用命令查看tcp網(wǎng)絡(luò)連接狀態(tài):

netstat -n |grep 端口  | awk '/^tcp/ {++a[$NF]} END {for (v in a) print v,a[v]}'

狀態(tài)詳解:

listen:偵聽客戶端的連接請求

syn_send:客戶端發(fā)送連接請求等待確認(rèn)連接

syn_recv :服務(wù)端收到一個連接請求,給對方響應(yīng)確認(rèn)(syn+ack同時為1)時的狀態(tài)

established:一個連接的打開,數(shù)據(jù)正常傳輸?shù)臓顟B(tài)

fin_wait1:客戶端主動發(fā)出fin關(guān)閉連接請求之后等待確認(rèn)

fin_wait2:客戶端接收到關(guān)閉連接的ACK確認(rèn)之后狀態(tài)(半關(guān)閉狀態(tài))只接受數(shù)據(jù)并發(fā)送ACK確認(rèn),不發(fā)送數(shù)據(jù)

close_wait:服務(wù)器接受到FIN后,發(fā)出ACK以回應(yīng)FIN請求之后等待本地發(fā)起連接中斷請求的狀態(tài)

closing:主動關(guān)閉端發(fā)送FIN請求之后等待對方對連接中斷的確認(rèn),(正常是看不到此狀態(tài))

last_ack:被動關(guān)閉端,接收到文件結(jié)束符之后向主動關(guān)閉端發(fā)送fin請求等待ACK時的狀態(tài)

time_wait:(2MSK狀態(tài))主動關(guān)閉端接收到FIN后,發(fā)送ACK進(jìn)入time-wait狀態(tài)。防止對方?jīng)]有收到最后的ACK確認(rèn)報文,確保雙方都可以正常結(jié)束。這個期間可以重啟啟動服務(wù)連接但不能發(fā)送數(shù)據(jù)

closed:被動關(guān)閉端接受到ACK包之后的狀態(tài)。代表連接結(jié)束。

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI