tcp三次握手
所謂三次握手(three-way handshake),是指建立乙個tcp連線時,需要客戶端和伺服器總共傳送3個包。
三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊.在socket程式設計中,客戶端執行connect()時。將觸發三次握手。
(兩張都是三次握手)
第一次握手:
客戶端傳送乙個tcp的syn標誌位置1的包指明客戶打算連線的伺服器的埠,以及初始序號x,儲存在包頭的序列號(sequence number)欄位裡。客戶端並進入syn_send狀態,等待伺服器確認。
第二次握手:
伺服器發回確認包(ack)應答。即syn標誌位和ack標誌位均為1同時,將確認序號(acknowledgement number)設定為客戶的isn加1以.即x+1。此時伺服器進入syn_recv狀態。
第三次握手.
客戶端再次傳送確認包(ack), syn標誌位為0,ack標誌位為1.並且把伺服器發來ack的序號欄位+1,放在確定欄位中傳送給對方.並且在資料段放寫isn的+1。此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送資料。
tcp四次揮手
tcp的連線的拆除需要傳送四個包,因此稱為四次揮手。客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。
由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(兩張都是四次揮手)
(1)客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送(報文段4)。隨後客戶端進入fin-wait-1階段,即半關閉階段。
(2)伺服器b收到這個fin,隨後伺服器端結束established階段,進入close-wait階段(半關閉狀態),它發回乙個ack,確認序號為收到的序號加1(報文段5)。和syn一樣,乙個fin將占用乙個序號。客戶端a收到ack,隨後客戶端結束fin-wait-1階段,進入fin-wait-2階段。
(3)伺服器端自從發出ack確認報文之後,經過closed-wait階段,做好了釋放伺服器端到客戶端方向上的連線準備,向客戶端傳送fin+ack,隨後伺服器端結束close-wait階段,進入last-ack階段。並且停止在伺服器端到客戶端的方向上傳送資料,但是伺服器端仍然能夠接收從客戶端傳輸過來的資料。
(4)客戶端收到從伺服器端發出的tcp報文,確認了伺服器端已做好釋放連線的準備,結束fin-wait-2階段,進入time-wait階段,並向伺服器端傳送ack報文確認,並將確認序號設定為收到序號加1。
注意:如果伺服器在收到客戶端關閉的fin包後,傳送緩衝區中還有資料,伺服器會在傳送完ack包後(即第二步之後),將資料傳送出去,然後再執行傳送fin+ack.。
參見wireshark抓包,實測的抓包結果並沒有嚴格按揮手時序。估計是時間間隔太短造成。
注意上面的字段標號地段和傳送接收的內容序號,可能有個有錯,記不住哪個了,後頭要細看看。
**:tcp三次握手與四次揮手網上有很多寫的很好的文章,請自己去找吧,例如:
菜鳥一枚,記錄成長,可能有錯~
Tcp三次握手與四次揮手
tcp三次握手 四次揮手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次...
TCP三次握手與四次揮手
也許三次握手你會經常聽到,但你知道三次握手的真正意義嗎,為什麼需要三次握手呢?首先我們必須明白tcp是面向連線的協議,無論哪乙個方向在傳送資料之前,都必須先在雙方之間建立連線。這一點與udp協議是不一樣的,udp在傳送資料報之前是不需要建立連線的。建立tcp連線的過程中,通訊的雙方需要互相發報文進行...
tcp三次握手與四次揮手
一.tcp三次握手 簡述 a傳送乙個請求給b,b發回確認,然後a再加以確認,來回共3次 1 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認。2 第二次握手 伺服器收到syn包之後,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn syn...