1. 程式人生 > 實用技巧 >TCP/IP協議 -- 三次握手和四次揮手

TCP/IP協議 -- 三次握手和四次揮手

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網際協議)

​ 是指能夠在多個不同網路間實現資訊傳輸的協議簇。TCP/IP協議不僅僅指的是TCPIP兩個協議,而是指一個由FTPSMTP、TCP、UDP、IP等協議構成的協議簇,TCP/IP傳輸協議是嚴格來說是一個四層的體系結構,應用層、傳輸層、網路層和資料鏈路層都包含其中。 只是因為在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱為TCP/IP協議。。

​ TCP/IP協議的四個層次。

  1. 應用層:TCP/IP協議的第一層,直接為應用程序提供服務。
    • 對不同種類的應用程式根據它們自己的需求來使用應用層的不同協議,例如郵件傳輸使用SMTP協議,全球資訊網應用使用HTTP協議,遠端登入服務應用使用TELNET協議;
    • 應用層還能加密,解密,格式化資料;
    • 應用層可以建立或解除與其他節點的聯絡,可以充分節省網路資源。
  2. 傳輸層:第二層,起中流砥柱的作用;
  3. 網路層:第三次,可以進行網路連線的建立和終止以及IP地址的尋找;
  4. 網路介面層:第四層,兼併了物理層和資料鏈路層,所以這一層為網路層提供了一條準確無誤的線路。

TCP即傳輸控制協議,是一種面向連線的、可靠的、基於位元組流的通訊協議。位於傳輸層,簡單來說TCP就是有確認機制的UDP協議,每發出一個數據包都要求確認,如果有一個數據包丟失,就收不到確認,傳送方就必須重發這個資料包。為了保證傳輸的可靠性,TCP協議在UDP基礎之上建立了三次對話的確認機制,即在正式收發資料前,必須和對方建立可靠的連線。TCP資料包和UDP一樣,都是由首部和資料兩部分組成,唯一不同的是,TCP資料包沒有長度限制,理論上可以無限長,但是為了保證網路的效率,通常TCP資料包的長度不會超過IP資料包的長度,以確保單個TCP資料包不必再分割。

​ 傳輸層的主要工作是定義,標識應用程式身份,實現埠到埠的通訊,TCP協議可以保證資料傳輸的可靠性。

三次握手:

​ 建立TCP連線,需要客戶端和服務端總共傳送三個包來確認連線的建立,這一過程由客戶端執行connect觸發,流程如下:

第一次握手:客戶端(Client)傳送連線請求報文段,將標誌位SYN(同步標誌)置為1,隨機產生一個值Sequence Number=J, 並將該資料包傳送給伺服器(Server),客戶端進入SYN_SENT狀態,等待伺服器確認。

第二次握手:伺服器(Server)收到客戶端(Client)報文段後,得到標誌位SYN=1,伺服器將標誌位SYN和ACK(確認標誌)都置為1,ack=J+1, 同時並隨機產生一個值seq=K, 同時並將上述所有資訊(SYN+ACK)放到一個報文段,一併傳送給客戶端,伺服器進入SYN_RCVD狀態。

第三次握手:客戶端(Client)收到伺服器SYN+ACK報文段後,檢查ack是否=J+1, ACK是否=1, 如果正確則將標誌位ACK置為1,ack=K+1,並將該報文段傳送給伺服器(Server),伺服器檢查報文段ack是否=K+1,ACK是否=1,如果正確則連線建立成功,客戶端和伺服器進入ESTABLISHEN狀態,完成三次握手,隨後客戶端和伺服器之間就可以開始傳輸資料了。

簡單來說,就是

1、建立連線時,客戶端傳送SYN包(SYN=i)到伺服器,並進入到SYN-SEND狀態,等待伺服器確認

2、伺服器收到SYN包,必須確認客戶的SYN(ack=i+1),同時自己也傳送一個SYN包(SYN=k),即SYN+ACK包,此時伺服器進入SYN-RECV狀態

3、客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認報ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手,客戶端與伺服器開始傳送資料

SYN攻擊:

在三次握手過程中,Server傳送SYN-ACK之後,收到Client的ACK之前的TCP連線稱為半連線(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地傳送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間佔用未連線佇列,導致正常的SYN請求因為佇列滿而被丟棄,從而引起網路堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連線狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

#netstat -nap | grep SYN_RECV

四次揮手:

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

第一次分手:主機1(可以是客戶端,也可以是伺服器端),設定Sequence Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;

第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number(確認號)為Sequence 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也可以關閉連線了。

SYN:同步標誌。表明同步序列編號欄有效。該標誌僅在三次握手建立TCP連線時有效。它提示TCP連線的服務端檢查序列編號,該序列編號為TCP連線初始端(一般是客戶端)的初始序列編號。

ACK:確認標誌。表明確認編號欄有效。大多數情況下該標誌位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有資料。

FIN:結束標誌
為什麼要等待2MSL?

MSL:報文段最大生存時間,它是任何報文段被丟棄前在網路內的最長時間。原因有二:

  • 保證TCP協議的全雙工連線能夠可靠關閉
  • 保證這次連線的重複資料段從網路中消失

為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?

​ TCP是全雙工模式,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2,它的資料已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了FIN報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次TCP連線。。

優點:

  1. 協議標準是完全開放的,可以供使用者免費使用,並且獨立於特定的計算機硬體作業系統
  2. 獨立於網路硬體系統,可以執行在廣域網,更適合於網際網路
  3. 網路地址統一分配,網路中每一裝置和終端都具有一個唯一地址。
  4. 高層協議標準化,可以提供多種多樣可靠網路服務。

缺點:

  1. 該模型沒有明顯地區分服務、介面和協議的概念。因此,對於使用新技術來設計新網路,TCP/IP模型不是一個太好的模板。
  2. TCP/IP模型完全不是通用的,並且不適合描述除TCP/IP模型之外的任何協議棧
  3. 鏈路層並不是通常意義上的一層。它是一個介面,處於網路層和資料鏈路層之間。介面和層間的區別是很重要的。
  4. TCP/IP模型不區分物理層和資料鏈路層。這兩層完全不同,物理層必須處理銅纜、光纖和無線通訊的傳輸特徵;而資料鏈路層的工作是確定幀的開始和結束,並且按照所需的可靠程度把幀從一端傳送到另一端。