TCP/IP----TCP詳解

TCP/IP協議----是一個網絡通信模型,以及一整個網絡傳輸協議家族,爲互聯網的基礎通信架構。它常被通稱爲TCP/IP協議族(英語:TCP/IP Protocol Suite,或TCP/IP Protocols),簡稱TCP/IP。因爲該協議家族的兩個核心協議:TCP(傳輸控制協議)和IP(網際協議),爲該家族中最早通過的標準。

TCP(傳輸控制協議),其報頭如圖:

  • 源端口號/目的端口號: 表示數據從哪個進程來, 到哪個進程去.
  • 32位序號:4位首部長度: 表示該tcp報頭有多少個4字節(32個bit)、6位保留: 顧名思義, 先保留着, 以防萬一、6位標誌位
    • URG:標識緊急指針是否有效,如果URG爲1,表示本數據包中包含緊急數據。此時緊急數據指針表示的值有效,它表示在緊急數據之後的第一個字節的偏移值(即緊急數據的總長度)。若URG爲0,則緊急指針沒有意義。
    • ACK: 標識確認序號是否有效
    • PSH: 用來提示接收端應用程序立刻將數據從tcp緩衝區讀走;當設置爲1時,要求把數據儘快的交給應用層,不做處理。
      當兩個應用進程進行交互式的通信時,有時在一端的應用進程希望再鍵入一個命令後立即就能夠收到對方的響應。在這種情況下,TCP就可以使用推送操作。這時,發送方TCP把PSH置1,並立即創建一個報文段發送出去。接收方TCP收到PSH=1的報文段,就儘快交付接收應用進程,而不再等到整個緩存都填滿了再向上交付。 雖然應用進程可以選擇推送操作,但推送操作還是很少使用。
    • RST: 要求重新建立連接. 我們把含有RST標識的報文稱爲復位報文段
    • SYN: 請求建立連接. 我們把含有SYN標識的報文稱爲同步報文段
    • FIN: 通知對端, 本端即將關閉. 我們把含有FIN標識的報文稱爲結束報文段
  • 16位窗口大小:TCP通過滑動窗口的概念來進行流量控制。設想在發送端發送數據的速度很快而接收端接收速度卻很慢的情況下,爲了保證數據不丟失,顯然需要進行流量控制, 協調好通信雙方的工作節奏。所謂滑動窗口,可以理解成接收端所能提供的緩衝區大小。TCP利用一個滑動的窗口來告訴發送端對它所發送的數據能提供多大的緩 衝區。由於窗口由16位bit所定義,所以接收端TCP 能最大提供65535個字節的緩衝。由此,可以利用窗口大小和第一個數據的序列號計算出最大可接收的數據序列號。
  • 16位檢驗和: 由發送端填充, 檢驗形式有CRC校驗等. 如果接收端校驗不通過, 則認爲數據有問題. 此處的校驗和不光包含TCP首部, 也包含TCP數據部分.
  • 16位緊急指針: 用來標識哪部分數據是緊急數據

TCP三次握手建立連接

剛開始, 客戶端和服務器都處於 CLOSE 狀態.
此時, 客戶端向服務器主動發出連接請求, 服務器被動接受連接請求.

1, TCP服務器進程先創建傳輸控制塊TCB, 時刻準備接受客戶端進程的連接請求, 此時服務器就進入了 LISTEN(監聽)狀態
2, TCP客戶端進程也是先創建傳輸控制塊TCB, 然後向服務器發出連接請求報文,此時報文首部中的同步標誌位SYN=1, 同時選擇一個初始序列號 seq = x, 此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定, SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。
3, TCP服務器收到請求報文後, 如果同意連接, 則發出確認報文。確認報文中的 ACK=1, SYN=1, 確認序號是 x+1, 同時也要爲自己初始化一個序列號 seq = y, 此時, TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據, 但是同樣要消耗一個序號。
4, TCP客戶端進程收到確認後還, 要向服務器給出確認。確認報文的ACK=1,確認序號是 y+1,自己的序列號是 x+1.
5, 此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。當服務器收到客戶端的確認後也進入ESTABLISHED狀態,此後雙方就可以開始通信了。

TCP四次揮手斷開連接

1, 客戶端進程發出連接釋放報文,並且停止發送數據。
釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。
2, 服務器收到連接釋放報文,發出確認報文,ACK=1,確認序號爲 u+1,並且帶上自己的序列號seq=v,此時服務端就進入了CLOSE-WAIT(關閉等待)狀態。
TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
3, 客戶端收到服務器的確認請求後,此時客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最終數據)
4, 服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,確認序號爲v+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
5, 客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,確認序號爲w+1,而自己的序列號是u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
6, 服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

爲什麼建立連接是三次握手,關閉連接確是四次揮手呢?

建立連接的時候, 服務器在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。
而關閉連接時,服務器收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,而自己也未必全部數據都發送給對方了,所以己方可以立即關閉,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送,從而導致多了一次。
如果已經建立了連接, 但是客戶端突發故障了怎麼辦?

TCP設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設置爲2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以後每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉連接。
---------------------
參考原文:https://blog.csdn.net/sinat_36629696/article/details/80740678

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章