您好,登錄后才能下訂單哦!
tcp協議:
tcp是面向連接、可靠的進程到進程之間的協議。tcp提供全雙工服務:即:數據可在同一時間雙向傳輸。
tcp報文段首部格式:
各字段含義:
源端口號:16位字段,為發送端進程對應的端口號
目標端口:16位字段,為接收端進程對應的端口號,接收方接收到數據包之后根據這個字段確定將數據發送給對應程序來處理
序號:32位字段,當tcp從進程中接收到數據之后,就會把他存儲在發送緩存中。并對每一個字節進行編號,形成的序列號。特點如下:
會生成一個隨機數作為第一個字節的編號,成為序列號(ISN),范圍是:0-(232-1)
tcp每個方向的編號都是相互獨立的
當字節都被編上號之后,tcp就給每個報文段指定一個序號,序號就是該報文段中第一個字節的編號
確認號:32位字段,確認號是對發送端的確認信息,用它來告訴發送端這個序號之前的數據段都已經收到,如確認號是x,那么表示收到前x-1個數據段
首部長度:用它可以確定首部數據結構的字節長度,一般情況下tcp的首部長度是20字節,但是首部長度最長可以擴展至60字節
保留:保留作為擴展使用。
控制位:tcp的連接和斷開都受這六個控制位指揮。含義如下:
URG:緊急指針有效位
ACK:只有當ACK=1時,確認序列號字段才有效,當ACK=0時,確認號字段無效。
PSH:標志位為1時要求接收方盡快將數據段送達應用層。
RST:當RST的值為1的時候通知重新建立tcp連接。
SYN:同步序號為,tcp需要建立連接時將這個值設為1。
FIN:發送端完成發送任務,當tcp完成數據傳輸需要斷開連接時,提出斷開連接方,將此控制位設置成1。
窗口值:本地可接受數據段的數目,這個值的大小隨著網絡是可變的。當網絡暢通時,值變大可加快傳輸速度,網絡不穩定時,值變小可保證傳輸數據的可靠性;tcp協議中的流量控制就是更改窗口值來實現的
校驗和:用來做差錯控制,發送tcp報文前計算一遍校驗和。當接收端收到數據后再做一次校驗,當兩個值一致時,說明數據是沒問題的。
緊急指針:和URG配合使用,當URG=1時有效;
選項:在tcp首部可以有多達40字節的可選信息。
tcp的連接與斷開:
在數據通信之前,發送端與接收端要建立連接;等數據發送結束后,雙方在斷開連接。tcp連接的每一方都是由一個IP和端口組成的、
三次握手與四次揮手如圖:
假設服務器監聽80端口。由客戶端進行訪問
三次握手過程:
第一次:
客戶端使用隨機的端口向服務器的80端口發起連接請求,此過程中典型的標志就是tcp的SYN控制位為1.其他五個控制位全為0;
第二次:
由兩部分完成:
1、服務端收到客戶端發送的連接請求,向客戶端回復確認信息。此過程中典型的標志就是TCP的ACK控制位為1,其他五個控制位全為0,而且序列號是客戶端初始序列號+1;
2、服務端同時也向客戶端發送一個連接請求,此過程中典型的標志位與第一次握手中一樣。即TCP的SYN控制位是1,其他五個控制位為0。
為提高通信效率,這兩部分是在同一個數據包中實現。
第三次:
客戶端收到服務端的回復(確認和請求),也需要向服務端發送一個確認信息;此過程的典型標志就是tcp的ACK控制位為1,其他五個控制位全為0;確認序列號為服務端的初始序列號+1
三次握手完成,tcp連接建立成功。使用命令netstat -an 命令可查看狀態為:ESTABLISHED
三次握手狀態監控:
服務器創建socket后開始監聽,變為LISTEN狀態。客戶端請求建立連接,向服務器發送SYN報文,客戶端的狀態變為SYN_SENT。服務器收到客戶端的報文后向客戶端發送ACK和SYN報文,此時服務器的狀態變為SYN_RCVD。然后,客戶端收到ACK、SYN,就向服務器發送ACK,客戶端狀態變為ESTABLISHED,服務器收到客戶端的ACK后也變為ESTABLISHED。此時,3次握手完成,連接建立!
四次揮手過程:
第一次:
客戶端向服務器發送控制位FIN和ACK位置為1的tcp報文
第二次:
服務器向客戶端返回控制位ACK為1的tcp報文
此時處于一個半關閉的狀態,客戶端終止發送數據,只回復ACK確認報文,不再發送數據報文,但是扔然可以接收數據。當服務器發送完數據之后,向客戶端發送FIN報文并收到ACK確認,這樣就完全關閉了這個tcp連接
第三次:
服務器向客戶端發送控制位FIN和ACK位置為1的tcp報文
第四次:
客戶端向服務器返回控制位ACK為1的tcp報文
四次揮手狀態監控:
由于tcp連接是全雙工的,斷開連接會比建立連接麻煩一點點。客戶端先向服務器發送FIN報文,請求斷開連接,其狀態變為FIN_WAIT1。服務器收到FIN后向客戶端發生ACK,服務器狀態變為CLOSE_WAIT。客戶端收到ACK后就進入FIN_WAIT2狀態。此時連接已經斷開了一半了。如果服務器還有數據要發送給客戶端,就會繼續發送。直到發完了,就發送FIN報文,此時服務器進入LAST_ACK狀態。客戶端收到服務器的FIN后,馬上發送ACK給服務器,此時客戶端進入TIME_WAIT狀態,再過了2MSL長的時間后進入CLOSED狀態。服務器收到客戶端的ACK就進入CLOSED狀態。
至此,還有一個狀態沒有提及:CLOSING狀態。CLOSING狀態表示客戶端發生了FIN,但沒有收到服務器的ACK,卻收到了服務器的FIN。這種情況發生在服務器發送的ACK丟包的時候,因為網絡傳輸有時會有意外。
使用命令查看tcp網絡連接狀態:
netstat -n |grep 端口 | awk '/^tcp/ {++a[$NF]} END {for (v in a) print v,a[v]}'
狀態詳解:
listen:偵聽客戶端的連接請求
syn_send:客戶端發送連接請求等待確認連接
syn_recv :服務端收到一個連接請求,給對方響應確認(syn+ack同時為1)時的狀態
established:一個連接的打開,數據正常傳輸的狀態
fin_wait1:客戶端主動發出fin關閉連接請求之后等待確認
fin_wait2:客戶端接收到關閉連接的ACK確認之后狀態(半關閉狀態)只接受數據并發送ACK確認,不發送數據
close_wait:服務器接受到FIN后,發出ACK以回應FIN請求之后等待本地發起連接中斷請求的狀態
closing:主動關閉端發送FIN請求之后等待對方對連接中斷的確認,(正常是看不到此狀態)
last_ack:被動關閉端,接收到文件結束符之后向主動關閉端發送fin請求等待ACK時的狀態
time_wait:(2MSK狀態)主動關閉端接收到FIN后,發送ACK進入time-wait狀態。防止對方沒有收到最后的ACK確認報文,確保雙方都可以正常結束。這個期間可以重啟啟動服務連接但不能發送數據
closed:被動關閉端接受到ACK包之后的狀態。代表連接結束。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。