Linux - Tcp連接建立和釋放的三次握手四次揮手

一、TCP報文段首部格式    
    源端口/目的端口:各佔2個字節,分別寫入源端口和目的端口,端口是傳輸層與應用層的服務接口
    序號:佔4個字節,TCP連接中傳送的數據流中每一個字節都有一個序號,序號字段指本報文段所發送的數據的第一個字節的序號
    確認號:佔4個字節,是期望收到對方下一個報文的第一個數據字節的序號
    數據偏移:佔4個字節,它指出TCP報文的數據距離TCP報文段的起始處有多遠
    保留:佔6個字節,保留今後使用,但目前應都位0
    標誌URG:緊急置位,當URG=1時告訴系統此報文段中有緊急數據
    標誌ACK:響應確認,TCP規定在連接建立後所有報文的傳輸都必須把ACK置爲1;
    標誌PSH:數據推送,當一端的應用進程希望在鍵入一個命令後立即就能收到對方的響應時將PSH置爲1
    標誌RST:連接重置,當RST=1時表明TCP連接中出現嚴重差錯,必須釋放連接然後再重新建立連接
    標誌SYN:建立連接,用來同步序號,當SYN=1和ACK=0時表明是連接請求報文,若同意連接則響應報文中應該使SYN=1和ACK=1
    標誌FIN:關閉連接,當FIN=1時表明此報文的發送方的數據已經發送完畢並且要求釋放
    窗口:佔2個字節,指的是通知接收方,發送本報文你需要有多大的空間來接受
    檢驗和:佔2個字節,校驗首部和數據這兩部分
    緊急指針:佔2個字節,指出本報文段中的緊急數據的字節數
    選項:長度可變,定義一些其他的可選的參數
    填充: 這是爲了使整個首部長度是4字節的整數倍的字段

    
二、TCP連接建立(三次握手) 
    服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;
    客戶進程也是先創建傳輸控制塊TCB,然後向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。
    服務器收到請求報文後,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要爲自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。
    客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。
    服務器收到客戶端的ACK確認信息並校驗後也進入ESTABLISHED狀態,此時再返回信息,而此後雙方就進入了數據通信階段。
 
  #客戶端發送一個SYN報文連接服務器的端口,客戶端初始序號爲4637811,同時報告窗口大小和MSS值
  17:43:47.475512 IP 192.168.3.43.51843 > 192.168.2.222.8080: S 4637811:4637811(0) win 64240 <mss 1460,nop,wscale 8,nop,nop,sackOK>
  #服務器返回包含服務器初始序號即653770253的SYN報文作爲應答,同時將確認序號設置爲客戶端序號+1即4637812以對客戶端SYN報文進行確認
  17:43:47.475562 IP 192.168.2.222.8080 > 192.168.3.43.51843: S 653770253:653770253(0) ack 4637812 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
  #客戶端發送將服務器初始序號+1即653770254的ACK報文作爲應答。這裏的標誌位"."表示SFRP四個標識位都是0,當然此時的ACK標識位是1        
  17:43:47.475935 IP 192.168.3.43.51843 > 192.168.2.222.8080: . ack 653770254 win 2053
三、TCP連接的釋放(四次揮手)
    客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。
    服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
    客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。
    服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
    客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
    服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

    #客戶端發起關閉請求,發送一個FIN報文,客戶端報文序號爲653770398
    17:43:51.064361 IP 192.168.2.222.8080 > 192.168.3.43.51843: F 653770398:653770398(0) ack 4637815 win 46
    #服務端接受到信息後,首先返回ACK報文,表明自己已經收到消息,確認序號爲客戶端報文需要+1即653770399
    17:43:51.065064 IP 192.168.3.43.51843 > 192.168.2.222.8080: . ack 653770399 win 2052
    #服務端在準備好關閉之前,最後發送給客戶端一個FIN報文,詢問客戶端是否已經準備好關閉,服務器端報文序號4637815
    17:43:51.066797 IP 192.168.3.43.51843 > 192.168.2.222.8080: F 4637815:4637815(0) ack 653770399 win 2052
    #客戶端接受到服務端發送的消息後,返回一個ACK報文,報文序號爲服務器報文序號+1即4637816
    17:43:51.066816 IP 192.168.2.222.8080 > 192.168.3.43.51843: . ack 4637816 win 46 

四、Tcp連接中的端口狀態轉換

    1、客戶端端口狀態轉換

       

    2、服務端端口狀態轉換    
       
    

     


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