TCP 三次握手和四次揮手

2021-09-25 20:25:21 字數 2962 閱讀 8524

目錄

一 什麼是 tcp

二 tcp 的三次握手

2.1 三次握手的流程

2.2. 為什麼需要三次握手

三 tcp 四次揮手

3.1 四次揮手流程

3.2 為什麼需要四次揮手

3.3 為什麼客戶端最後還要等待2msl?

tcp(transmisson control protocol)提供面向連線的,可靠的資料傳輸服務,位於運輸層。

tcp的特點:

1. tcp 是面向連線的(就好像打**一樣,通話前需要先撥號建立連線,通話結束後要掛機釋放連線)。

2. 每一條 tcp 連線只能有兩個端點,每一條tcp連線只能是點對點的(一對一)。

3. tcp 提供可靠交付的服務。通過tcp連線傳送的資料,無差錯、不丟失、不重複、並且按序到達;

4. tcp 提供全雙工通訊。tcp 允許通訊雙方的應用程序在任何時候都能傳送資料。tcp 連線的兩端都設有傳送快取和接收快取,用來臨時存放雙方通訊的資料;

5. 面向位元組流。tcp 中的「流」(stream)指的是流入程序或從程序流出的位元組序列。「面向位元組流」的含義是:雖然應用程式和 tcp 的互動是一次乙個資料塊(大小不等),但 tcp 把應用程式交下來的資料僅僅看成是一連串的無結構的位元組流。

步驟0. 一開始客戶端和服務端都處於 closed(關閉) 狀態。

步驟1. 客戶端建立 tcb(傳輸控制模組),服務端建立 tcb,進入 listen(監聽) 狀態。

步驟2. 客戶端向服務端發出連線請求報文,該報文的首部內容為:同部位 syn=1,序列號 seq=x ,此時,客戶端進入了 syn-sent(同步已傳送狀態)狀態。tcp規定,syn報文段(syn=1的報文段)不能攜帶資料,但需要消耗掉乙個序號。

步驟3. 服務端收到請求報文後,同意連線,發出確認報文。確認報文中首部內容為: ack=1,syn=1,確認號 ack=x+1,自己的序列號 seq=y,此時,服務端進入了syn-rcvd(同步收到)狀態。同理,該報文為syn報文段,這個報文也不能攜帶資料,但是需要消耗乙個序號。

步驟4. 客戶端收到確認後,向服務端給出確認。確認報文的 ack=1,ack=y+1,自己的序列號seq=x+1,此時,tcp連線建立,客戶端進入established(建立連線)狀態。tcp 規定,ack 報文段可以攜帶資料,但是如果不攜帶資料則不消耗序號。

步驟5. 當服務端收到客戶端的確認後也進入 established 狀態,客戶端和服務端之間就可以進行通訊,傳輸資料了。

是為了讓客戶端和服務端確認自己和彼此的傳送、接收功能正常。

1. 上述步驟2為第一次握手

客戶端什麼都不能確認,服務端確認了客戶端傳送正常。

2. 上述步驟3為第二次握手

客戶端確認自己傳送、接收正常,服務端傳送、接收正常;服務端確認自己接收正常,客戶端傳送正常。

3. 上述步驟4為第三次握手

客戶端確認自己傳送、接收正常,服務端傳送、接收正常;服務端確認了自己傳送、接收正常,客戶端傳送、接收正常。

步驟0:客戶端發出連線釋放報文,並且停止傳送資料。釋放報文頭部內容:fin=1,seq=u(服務端傳送過來的資料最後乙個位元組的序號加1),此時客戶端進入fin-wait-1(終止等待1)狀態。tcp 規定,fin 報文即使不攜帶資料,也要消耗乙個序號。

步驟1:服務端收到連線釋放報文,發出確認報文,ack=1,ack=u+1,並且帶上自己的序列號 seq=v,服務端進入 close-wait(關閉等待)狀態。客戶端此時面向服務端的連線已經釋放,處於半關閉狀態,客戶端已經沒有資料要傳送給服務端了,服務端如果傳送資料,客戶端還是需要接受的。這種情況需要維持一段時間,也就是整個 close-wait 狀態持續時間。

步驟2:客戶端收到服務端的確認請求後,此時客戶端進入 fin-wait-2(終止等待2)狀態,等待服務端傳送連線釋放報文。

步驟3:服務端將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文,fin=1,ack=u+1,由於傳送了一些資料 seq 由 v 變成 w ,此時服務端進入 last-ack(最後確認)狀態。

步驟4:客戶端收到服務端連線釋放報文後,發出確認,ack=1,ack=w+1,序列號為 seq=u+1,此時,客戶端進入 time-wait(時間等待)狀態。此時 tcp 連線還沒有釋放,必須經過2*msl(最長報文段壽命)後且客戶端撤銷 tcb 之後,客戶端才進入 closed 狀態。

步驟5:服務端收到客戶端的確認,立即進入 closed 狀態。

客戶端和服務端都可以在資料傳送結束後發出連線釋放的通知,待對方確認後進入半關閉狀態。當另一方也沒有資料再傳送的

時候,則發出連線釋放通知,對方確認後就完全關閉了 tcp 連線。

msl(maximum segment lifetime),tcp 允許不同的實現可以設定不同的msl值。

第一,保證客戶端傳送的最後乙個 ack 報文能夠到達服務端,因為這個 ack 報文可能丟失,站在服務端的角度看來,我已經傳送了 fin+ack 報文請求斷開了,客戶端還沒有給我回應,應該是我傳送的請求斷開報文它沒有收到,於是伺服器又會重新傳送一次,而客戶端就能在這個 2msl 時間段內收到這個重傳的報文,接著給出回應報文,並且會重啟 2msl 計時器。

第二,防止類似與「三次握手」中提到了的「已經失效的連線請求報文段」出現在本連線中。客戶端傳送完最後乙個確認報文後,在這個 2msl 時間中,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣新的連線中不會出現舊連線的請求報文。

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...