TCP 三次握手和四次揮手

2021-10-01 15:35:32 字數 2451 閱讀 5033

目錄

1、tcp 的頭部報文結構

2、tcp 三次握手過程

3、tcp 四次揮手過程

4、為什麼要三次握手

5、為什麼要四次揮手

tcp(transmission control protocol,傳輸控制協議):tcp 在傳輸資料之前必須先建立乙個連線。tcp 做了很多任務作來提供可靠的資料傳輸,包括建立、管理和終止連線,確認和重傳。同時 tcp 還提供分段和重組,流量控制(flow control)等。

(1)tcp 協議層是不關心 ip 的,具體 ip 的定位是由網路層來決定的,但是 tcp 層需要確定埠號,所以它會攜帶 source 和destination 的 port 資訊,以便能找到對應的埠號;

(2)sequence number 實際中使用的 seq,也就是序號,這個序號起了很重要的作用,我們都知道 tcp 和 udp 最大的區別在於 tcp 是穩定並且有序的,其中 seq 就可以保證有序,當 a 向 b 傳送乙個資料報的時候,seq 會疊加,每乙個傳輸方在傳送資料的時候都會帶上這個資訊,另一端能按照這個序號來排序收到資訊的順序,從未保證了資訊的傳遞是有序的,也能通過它來確認有沒有出現丟包的情況;另外要注意的是當有資料需要傳送的時候,seq 會隨該序列號為原點,對自己將要傳送的每個位元組的資料進行編號,比如當前 seq =10,本次要傳送的資料報大小是200位元組,那麼實際傳送的時候會更新 seq =210,以便保證傳輸的資料的順序;

(3)acknowledge number,實際中使用的ack,是另一端對對方 seq 的乙個回應,一般會把對方給的 seq +1然後下一次發包的時候帶上,這樣的話對方就知道我們是收到前面的訊息的;

(4)windown代表的是滑動視窗,實際中用 win 來表示,win 的大小很重要,win 越大的傳輸越快,因為 win 的大小直接決定了某一端一次可以同時傳送多少個資料報,而不用等待對方的應答 ack 回來,但是 win 會隨著每乙個資料報的傳送而變小

(5)reserved 是 tcp 傳輸很重要的角色,標誌位,響應方會根據對方給的訊號執行對應的操作,比如執行斷開連線的時候一般都是使用 fin 標誌位

我們都知道 tcp 是 可靠的資料傳輸協議,udp是不可靠傳輸,那麼tcp它是怎麼保證可靠傳輸的呢?那我們就不得不提 tcp 的三次握手和四次揮手。

詳細資料可以參考: 《tcp 為什麼是三次握手,而不是兩次或四次?》

《tcp 的三次握手與四次揮手》

因為 tcp 連線是全雙工的,也就是說通訊的雙方都可以向對方傳送和接收訊息,所以斷開連線需要雙方的確認。

tcp 使用四次揮手的原因是因為 tcp 的連線是全雙工的,所以需要雙方分別釋放到對方的連線,單獨一方的連線釋放,只代 表不能再向對方傳送資料,連線處於的是半釋放的狀態。

最後一次揮手中,客戶端會等待一段時間再關閉的原因,是為了防止傳送給伺服器的確認報文段丟失或者出錯,從而導致伺服器 端不能正常關閉。

詳細資料可以參考:《前端面試之道》

為什麼要三次握手,tcp 建立連線,其實通過兩次握手就可以建立連線了,為什麼要三次呢?是不是多此一舉呢?

(1)《計算機網路》中是這樣說的:

為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。

在書中同時舉了乙個例子,如下:已失效的連線請求報文段」的產生在這樣一種情況下:client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是乙個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的乙個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用「三次握手」,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。」

(2)網路故障

tcp協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。tcp是全雙工模式,這就意味著,當 client 發出fin報文段時,只是表示 client 已經沒有資料要傳送了,client 告訴 server,它的資料已經全部傳送完畢了;但是,這個時候 client 還是可以接受來自 server 的資料;當 server 返回ack報文段時,表示它已經知道 client 沒有資料傳送了,但是 server 還是可以傳送資料到 client 的;當 server 也傳送了fin報文段時,這個時候就表示 server 也沒有資料要傳送了,就會告訴 client ,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次tcp連線。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。

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後,它必須通知應用層另一端已經終止了那個方向的資料傳...