您好,登錄后才能下訂單哦!
tcp協(xié)議:
tcp是面向連接、可靠的進(jìn)程到進(jìn)程之間的協(xié)議。tcp提供全雙工服務(wù):即:數(shù)據(jù)可在同一時間雙向傳輸。
tcp報文段首部格式:
各字段含義:
源端口號: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和端口組成的、
三次握手與四次揮手如圖:
假設(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é)束。
免責(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)容。