在cs模式的tcp連線建立過程中,客戶端與伺服器端流程如下:
客戶端流程:傳送請求->接收伺服器端確認->傳送對伺服器端確認的確認。
伺服器端流程:接收客戶端的連線建立請求->傳送確認->接收客戶端傳送的對確認的確認。
1、剛開始客戶端和服務端都處於closed狀態,服務端開始監聽某個埠,進入listen狀態。
2、客戶端傳送連線請求報文,其中包含syn=1,ack=0,初始序列號x,進入syn-sent狀態。
3、伺服器端接受請求報文後,向客戶端傳送確認報文,其中包含syn=1,ack=1,確認號x+1,自己的初始序列號y,之後伺服器會進入syn-rcvd狀態。
4、客戶端收到 伺服器端的確認報文後,會傳送乙個確認報文給伺服器,表明已經接收到伺服器傳送的確認報文。該報文中包含ack=1,確認號y+1,序列號x+1。同時客戶端會進入established狀態。
5、伺服器收到上述報文後會進入established狀態。此時客戶端與伺服器的tcp連線建立完成。
為什麼tcp連線不是兩次握手?即為什麼客戶端最後會向伺服器傳送確認報文。
1:假設只有兩次握手,客戶端發出了乙個連線請求報文a。但是由於網路原因,a並未及時到達伺服器。之後客戶端傳送了連線請求報文b,並到達了伺服器,隨後雙方建立連線,傳輸資料,最後斷開連線。此時客戶端進入closed狀態,伺服器進入listen狀態。隨後a報文到達伺服器,由於伺服器處於listen狀態,故伺服器向客戶端傳送確認報文後進入established狀態並等待客戶端傳送資料。但是客戶端此時處於closed狀態。收到伺服器的確認報文後會丟棄該報文。伺服器一直等待客戶端傳輸資料,會造成副**的資源浪費。
2:tcp的可靠傳輸要求通訊雙方判斷自己傳送的資料是否被接收到。tcp依靠的就是tcp報文中的序號和確認號。因此當tcp連線建立時雙方均需要確認對方的初始序列號。而第三次握手則是客戶端對伺服器端的初始序列號的確認。因此第三次握手是必須的,否則無法保證伺服器端到客戶端的可靠傳輸。
為什麼tcp連線不是4次握手?
三次握手已經能夠證明客戶端與伺服器端之間的通道是可用的。再增加一次握手無非就是增加一點通道的可靠性,但是無論多少次握手都無法使通道100%可靠,因此也沒有必要增加一次握手。
tcp斷開連線的過程
1、客戶端停止傳送資料並傳送連線釋放請求報文,報文含有fin=1,seq=u,並且進入fin-wait-1狀態。
2、伺服器端接收到該報文後,返回乙個連線釋放確認報文。包含ack=1,seq=v,ack=u+1,並進入close-wait狀態,此狀態下伺服器端可能還會向客戶端傳送資料。
3、客戶端收到確認報文後,進入fin-wait-2狀態,等待伺服器傳送連線釋放請求報文,並接收伺服器端可能傳送的資料。
4、伺服器端傳送完所有資料之後,會傳送連線請求釋放報文。報文包含fin=1,ack=1,seq=w,ack=u+1,。之後伺服器進入last-wait狀態,等待客戶端發來的連線釋放確認報文。
5、客戶端收到伺服器的連線釋放報文後,返回,ack=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了time-wait(時間等待)狀態,tcp連線此時未釋放,因為不確定伺服器端是否還有資料沒有到達客戶端。因此必須經過2msl(最大報文生存時間)後,才進入closed狀態。
6、伺服器只要收到了客戶端發出的連線釋放確認報文,立即進入closed狀態。
TCP連線建立與斷開
重點關注標記 三次握手確認建立雙向連線 男 我們談朋友吧!syn 女 談朋友,好的!syn ack 男 好的!ack ps 如男方後悔了另謀物件,沒有第三次確認,那麼女方就是單方面確認談朋友,建立了髒連線。四次揮手確認斷開連線 男 我們分手吧!fin 女 好的,等我收拾完東西發訊息給你 此時男不能再...
TCP詳解 連線建立與斷開
一 報文結構介紹 在開始講tcp連線過程時,還是先看看tcp報文的格式如圖1所示。ip資料報此時由ip頭部 tcp頭部 tcp資料組成。不帶選項的tcp頭部是20位元組長,而帶選項的,tcp頭部最長可達60位元組。常見的選項包括最大的大小 mss 時間戳 傳輸控制時使用 視窗縮放 流量控制時使用 選...
TCP連線與斷開
a機器與b機器三次握手檢驗雙方報文收發正常 第一次握手 a請求連線 syn 1,seq x b正常接收 ab a能發報 b能收報 第二次握手 syn 1,ack 1,seq y,ack x 1 a a能發報 收報,b能發報 收報 b a能發報 b能收報 第三次握手 ack 1,seq x 1,ack...