1. 程式人生 > >python-網路-tcp的幾種狀態介紹(一)

python-網路-tcp的幾種狀態介紹(一)

本文作者:黎智煊,叩丁狼高階講師。原創文章,轉載請註明出處。

之前介紹了很多的udp的原理和例子,現在稍微總結一下之前的tcp和udp的區別,以便更好地接下來的tcp介紹.

tcp和udp的小區別

  1. TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線

  2. TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付

  3. TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的

UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)

  1. 每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊

  2. TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組

  3. TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道

由上面的可見,tcp有這麼多的功能,是建立在很多的理論之上,現在就可以介紹tcp的多種狀態.


tcp的三次握手

首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連線就建立了。

image.png

通俗講解三次握手協議

  1. 第一次握手:客戶端要和服務端進行通訊,首先要告知服務端一聲,遂發出一個SYN=1的連線請求訊號,”服務端哥哥,我想給你說說話”。

  2. 第二次握手:當服務端接收到客戶端的連線請求,此時要給客戶端一個確認資訊,”我知道了(ACK),我這邊已經準備好了,你現在能連嗎(SYN)”。

  3. 第三次握手:當客戶端收到了服務端的確認連線資訊後,要禮貌的告知一下服務端,“好的,咱們開始聯通吧(ACK)”。

到此整個建立連線的過程已經結束,接下來就是雙方你一句我一句甚至同時交流傳遞資訊的過程了。

詳細的握手協議

  • 最初兩端的TCP程序都處於CLOSED關閉狀態,A主動開啟連線,而B被動開啟連線。
  • (A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已傳送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B連線已建立狀態ESTABLISHED)
  • B的TCP伺服器程序先建立傳輸控制塊TCB,準備接受客戶程序的連線請求。然後伺服器程序就處於LISTEN(收聽)狀態,等待客戶的連線請求。若有,則作出響應。
  1. 第一次握手:A的TCP客戶程序也是首先建立傳輸控制塊TCB,然後向B發出連線請求報文段,(首部的同步位SYN=1,初始序號seq=x),(SYN=1的報文段不能攜帶資料)但要消耗掉一個序號,此時TCP客戶程序進入SYN-SENT(同步已傳送)狀態。
  2. 第二次握手:B收到連線請求報文段後,如同意建立連線,則向A傳送確認,在確認報文段中(SYN=1,ACK=1,確認號ack=x+1,初始序號seq=y),測試TCP伺服器程序進入SYN-RCVD(同步收到)狀態;
  3. 第三次握手:TCP客戶程序收到B的確認後,要向B給出確認報文段(ACK=1,確認號ack=y+1,序號seq=x+1)(初始為seq=x,第二個報文段所以要+1),ACK報文段可以攜帶資料,不攜帶資料則不消耗序號。TCP連線已經建立,A進入ESTABLISHED(已建立連線)。
    當B收到A的確認後,也進入ESTABLISHED狀態。

想獲取更多技術乾貨,請前往叩丁狼官網:http://www.wolfcode.cn/all_article.html