標籤:
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串連的建立和釋放