電腦網路(11)-----TCP串連的建立和釋放

來源:互聯網
上載者:User

標籤:

TCP串連的建立和釋放概述

  TCP運輸串連的建立和釋放是每一次連線導向的通訊中必不可少的過程,運輸串連有三個階段:串連建立資料傳送串連釋放

TCP串連的建立

  

  ,假定A主機是用戶端程式,B主機是服務端程式。最初兩端的TCP進程都是出於CLOSED(關閉)狀態。

  (1)B的TCP伺服器處理序先建立傳輸控制塊TCB(transmission Control Block),準備接受客戶進程的串連請求。然後伺服器就進入LISTEN(監聽)狀態,等待用戶端的串連請求。

  (2)A的TCP客戶進程也是首先建立傳輸控制塊TCB,然後向B發出串連請求報文段,這是首部中的同步位SYN=1,同時選擇一個初始序號seq=x。TCP規定,SYN報文段不能攜帶資料,但是要消耗掉一個序號。這是TCP客戶進程進入SYN-SENT(同步已發送)狀態

  (3)B收到串連請求報文段後,如果同意建立串連,則向A發送確認。在確認報文段中應把SYN位和ACK位都置1,確認號ack=x+1,同時也為自己選擇一個初始序號seq=y。這個報文段也不能攜帶資料,但同樣要消耗掉一個序號。這時TCP伺服器進入SYN-RCVD(同步收到)狀態

  (4)TCP客戶京城收到B的確認後,還要向B給出確認。確認報文段的ACK置1,確認號ack=y+1,而自己的序號seq=x+1。TCP標準規定,ACK報文段可以攜帶資料,但如果不攜帶資料則不消耗序號,在這種情況下,下一個資料報文段的序號仍是seq=x+1。這時TCP串連已經建立了,A進入ESTABLISHED(已建立串連)狀態。

  疑問:

    為什麼A還要發送一次確認呢?

    假定出現這樣一種情況,即A發出第一個串連請求報文段在某些網路節點長時間滯留了,以致延誤到串連釋放以後的某個時間才達到B。本來這是一個早已失效的報文段。但B收到此失效的串連請求報文段後,就誤認為是A又發出一次新的串連請求。於是就向A發出確認報文段,同意建立串連。假定不採用三向交握,那麼只要B發出確認,新的串連就建立了。

TCP串連的釋放

  

  ,資料轉送結束後,通訊雙方都可釋放串連。現在A和B都處於ESTABLISHED狀態。

  (1)A的應用進程先向其TCP發出串連釋放報文段,並停止再發送資料,主動關閉TCP串連。A把串連釋放報文段首部的終止控制位FIN置1,其序號seq=u,它等於前面已傳送過的資料的最後一個位元組的序號加1。這時A進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。TCP規定,FIN報文段即使不攜帶,也要消耗一個序號

  (2)B收到串連釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於B前面已傳送過的資料的最後一個位元組的序號加1。然後B就進入CLOSE-WAIT(關閉等待)狀態。TCP伺服器處理序這時應通知高層應用進程,因而從A到B這個方向的串連就釋放了,這時的TCP出於半關閉(half-close)狀態,即A已經沒有資料要發送了,但B若發送資料,A仍要接收。也就是說,從B到A這個方向的串連並未關閉,這個狀態可能會持續一段時間。

  (3)A收到來自B的確認後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的串連釋放報文段。

  (4)若B已經沒有要向A發送的資料,其應用進程就通知TCP釋放串連。這時B發出的串連釋放報文段必須使FIN=1。假定B的序號為w(在半關閉狀態可能又發送了一些資料)。B還必須重複上次已發送過的確認號ack=u+1。這時B就進入LAST-ACK(最後確認)狀態,等待A的確認。

  (5)A在收到B的串連釋放報文段後,必須對此發出確認。在確認報文段中把ACK置1,確認號ack=w+1,而自己的序號是seq=u+1,然後進入到TIME-WAIT(時間等待狀態)。此時,串連並沒有釋放,必須經過時間等待計時器(TIME-WAIT timer)設定的時間2MSL後,A才進入到CLOSED狀態時間MSL叫做最長報文段壽命

  疑問

    為什麼A在TIME-WAIT狀態必須等待2MSL時間呢?

    (1)為了保證A發送的最後一個ACK報文段能夠達到B。這個ACK報文段有可能丟失,因而使處在LASK-ACK狀態的B收不到對己方發送的FIN+ACK報文段的確認。B會逾時重傳這個FIN+ACK報文段,而A就能在2MSL時間內收到這個重傳的FIN+ACK報文段。接著A重傳一次確認,重新啟動2MSL計時器。最後,A和B都正常進入到CLOSED狀態。

    (2)防止已失效的串連請求報文段,A在發送完最後一個ACK報文段後,再經過時間2MSL,就可以使本串連持續的時間內所產生的所有報文段都從網路中消失。

  保活計時器(keepalive timer)

  用戶端的主機突然出了故障。線程,伺服器以後修不能再接受客戶發來的資料。伺服器不能白白等下去。這就是使用保活計時器。伺服器每收到一次客戶的資料,就重新設定保活計時器,時間的設定通常是2個小時。若兩個小時沒有收到客戶的資料,就每隔75分鐘發送一次探測報文段。若發送10個探測報文段後扔無反應,服務端就認為是用戶端出了問題,接著就關閉了這個串連。

TCP串連測試

  測試載入器:Linux伺服器,Tomcat伺服器,瀏覽器用戶端。

  測試結果及分析:

    (1)Linux伺服器啟動Tomcat伺服器,Tomcat伺服器預設監聽8080連接埠。

    

    (2)使用Tcpdump -X TCP port 8080 對8080連接埠進行監聽

    

    (3)在對TCP開始分析之前,先貼出TCP報文段的頭部格式

    

 

    (4)使用瀏覽器訪問Tomcat伺服器,對TCP進行分析,第一次握手

   

    對於上述頭部分析:seq序號為9ee1 38a3,此時的ack確認號為0,資料位移(TCO首部長度)+保留+標記位為a002,轉換為二進位得1010000000000010,對照上面的首部格式,可以分析出SYN同步位置1,其餘標記位都為0.

    (5)第二次握手 

    此時,seq序號為3d36 f797,ack確認號為9ee1 38a4,對於上一次的請求x=seq,這次的確認號ack=x+1。資料位移(TCO首部長度)+保留+標記位為a012,轉換為二進位得1010000000010010,可以分析得ACK=1,SYN=1。

    (6)第三向交握

    

    此時,seq序號為9ee1 38a4,ack確認號為3d36 f798,對於上一次的請求y=seq,這次的確認號ack=y+1,而這次的seq還是為x+1。資料位移(TCO首部長度)+保留+標記位為8010,轉換為二進位得1000000000010000,可以分析得只有ACK還在置1。

 

電腦網路(11)-----TCP串連的建立和釋放

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.