理解TCP/IP協議三次握手四次揮手

weixin_33807284發表於2017-06-25

之前學了計算機網路,但半年後就忘的差不多了,感覺TCP/IP協議的這個知識點很重要,整理一篇文章來鞏固一下。文章分為TCP的概念,TCP/UDP區別總結,三次握手四次揮手的過程,為什麼要這麼做的原因等四大部分來講解。

一 、 TCP協議的概念

TCP(transmission control protocal,傳輸控制協議),是面向連線的並具備順序控制、重發控制等機制的。所以它可以為應用提供可靠傳輸。工作在網路OSI的七層模型的第四層——傳輸層。ip在第三層——網路層。我們要知道資料從應用層發下來,會在每一層加上響應的頭部資訊,進行封裝然後再傳送到資料的接收端。每一層的作用和對應的協議如下:

4975863-4c845a1d5dde27b2.png

接下來介紹TCP協議的資料格式和頭部格式每個欄位的含義:

4975863-5e3c927649d3560b.png
  • Source Port和Destination Port:分別佔用16位,表示源埠號和目的埠號;用於區別主機中的不同程式,而IP地址是用來區分不同的主機的,源埠號和目的埠號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連線。
  • Sequence Number:用來標識從TCP發端向TCP收端傳送的資料位元組流,它表示在這個報文段中的的第一個資料位元組在資料流中的序號;主要用來解決網路報亂序的問題。
  • Acknowledgment Number:32位確認序列號包含傳送確認的一端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到資料位元組序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)為1時該確認序列號的欄位才有效。主要用來解決不丟包的問題。
  • Offset:給出首部中32 bit字的數目,需要這個值是因為任選欄位的長度是可變的。這個欄位佔4bit(最多能表示15個32bit的的字,即4*15=60個位元組的首部長度),因此TCP最多有60位元組的首部。然而,沒有任選欄位,正常的長度是20位元組。
  • TCP Flags:TCP首部中有6個標誌位元,它們中的多個可同時被設定為1,主要是用於操控TCP的狀態機的,依次為URGACKPSHRSTSYNFIN。每個標誌位的意思如下:
    * URG:此標誌表示TCP包的緊急指標域(後面馬上就要說到)有效,用來保證TCP連線不被中斷,並且督促中間層裝置要儘快處理這些資料
    * ACK:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP資料包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0
    * PSH:這個標誌位表示Push操作。所謂Push操作就是指在資料包到達接收端以後,立即傳送給應用程式,而不是在緩衝區中排隊
    * RST:這個標誌表示連線復位請求。用來複位那些產生錯誤的連線,也被用來拒絕錯誤和非法的資料包
    * SYN:表示同步序號,用來建立連線。SYN標誌位和ACK標誌位搭配使用,當連線請求的時候,SYN=1,ACK=0;連線被響應的時候,SYN=1,ACK=1;這個標誌的資料包經常被用來進行埠掃描。掃描者傳送一個只有SYN的資料包,如果對方主機響應了一個資料包回來 ,就表明這臺主機存在這個埠;但是由於這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連線嚴格的進行TCP的三次握手
    * FIN: 表示傳送端已經達到資料末尾,也就是說雙方的資料傳送完成,沒有資料可以傳送了,傳送FIN標誌位的TCP資料包後,連線將被斷開。這個標誌的資料包也經常被用於進行埠掃描
  • Window:視窗大小,也就是有名的滑動視窗,用來進行流量控制。

二、 TCP/UDP區別總結

TCP(Transmission Control Protocol)
UDP(User Datagram Protocol)

  • TCP面向連線(如打電話要先撥號建立連線),UDP是無連線的,即傳送資料之前不需要建立連線。
  • TCP提供可靠的服務,邏輯通訊通道是全雙工的可靠通道,也就是說通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達。UDP是不可靠通道盡最大努力交付,即不保證可靠交付。
  • TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流。UDP是面向報文的UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)。
  • 每一條TCP連線只能是點到點的,UDP支援一對一,一對多,多對一和多對多的互動通訊。
  • TCP首部開銷20位元組,UDP的首部開銷小,只有8個位元組。

三 、 三次握手四次揮手的過程

TCP是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。

4975863-20268f12043b2024.png
  • 第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認。
  • 第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態
  • 第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。

完成了三次握手,客戶端和伺服器端就可以開始傳送資料。


當客戶端和伺服器通過三次握手建立了TCP連線以後,當資料傳送完畢,要斷開TCP連線.對於TCP的斷開連線,這裡就有了神祕的“四次分手”。

  • 第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence NumberAcknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了。
  • 第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment NumberSequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求。
  • 第三次分手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入LAST_ACK狀態。
  • 第四次分手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連線;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,主機1也可以關閉連線了。

四、 相關問題

  • 1 為什麼要三次握手?
    感覺兩次就能完成連線,為什麼非要三次呢?引用謝希仁的《計算機網路》中的解釋

為了防止已失效的連線請求報文段突然又傳送到了伺服器端,因而產生錯誤。

就是防止伺服器端的一直等待而浪費了資源。

  • 2 為什麼要四次分手?
    TCP協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。TCP是全雙工模式,這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2,它的資料已經全部傳送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了FIN報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次TCP連線。
  • 3 為什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態?
  • 什麼是2MSL?MSL即Maximum Segment Lifetime,也就是報文最大生存時間,引用《TCP/IP詳解》中的話:“它(MSL)是任何報文段被丟棄前在網路內的最長時間。”那麼,2MSL也就是這個時間的2倍。其實我覺得沒必要把這個MSL的確切含義搞明白,你所需要明白的是,當TCP連線完成四個報文段的交換時,主動關閉的一方將繼續等待一定時間(2-4分鐘),即使兩端的應用程式結束。
  • 從以上TCP連線關閉的狀態轉換圖可以看出,主動關閉的一方在傳送完對對方FIN報文的確認(ACK)報文後,會進入TIME_WAIT狀態。TIME_WAIT狀態也稱為2MSL狀態。
  • 為什麼需要2MSL?根據《TCP/IP詳解》和《The TCP/IP Guide》中的說法,有兩個原因:

其一,保證傳送的ACK會成功傳送到對方,如何保證?我覺得可能是通過超時計時器傳送。這個就很難用程式碼演示了。

其二,報文可能會被混淆,意思是說,其他時候的連線可能會被當作本次的連線。直接引用《The TCP/IP Guide》的說法:The second is to provide a “buffering period” between the end of this connection and any subsequent ones. If not for this period, it is possible that packets from different connections could be mixed, creating confusion.

  • 4 常見的應用中有哪些是應用TCP協議的,哪些又是應用UDP協議的,為什麼它們被如此設計?
  • 多播的資訊一定要用UDP實現,因為TCP只支援一對一通訊。
  • 如果一個應用場景重效能甚於重完整性和安全性,那麼適合於UDP,比如多媒體應用,缺一兩幀不影響使用者體驗,但是需要流媒體到達的速度快,因此比較適合用UDP。
  • 以qq為例的一個說明
  • 登陸採用TCP協議和HTTP協議,你和好友之間傳送訊息,主要採用UDP協議,內網傳檔案採用了P2P技術。
  • 和好友發訊息,客戶端client採用UDP協議,但是需要通過伺服器轉發。騰訊為了確保傳輸訊息的可靠,採用上層協議來保證可靠傳輸。如果訊息傳送失敗,客戶端會提示訊息傳送失敗,並可重新傳送。
  • 如果是在內網裡面的兩個客戶端傳檔案,QQ採用的是P2P技術,不需要伺服器中轉。
4975863-ad39340c34e20930.png

參考文獻

http://blog.csdn.net/yipiankongbai/article/details/24435977
http://www.jellythink.com/archives/705
http://www.zhihu.com/question/20292749
謝希仁《計算機網路》《圖解tcp/ip》《tcp/ip詳解》

相關文章