golang 三次握手四次揮手總結

2022-10-10 18:42:09 字數 1590 閱讀 9377

當連線被建立或被終止,交換的報文段只包含tcp頭部,而沒有資料。

第一次握手:客戶端要向服務端發起連線請求,首先客戶端隨機生成乙個起始序列號isn(比如是100),那客戶端向服務端傳送的報文段包含syn標誌位(也就是syn=1),序列號seq=100。

第二次握手:服務端收到客戶端發過來的報文後,發現syn=1,知道這是乙個連線請求,於是將客戶端的起始序列號100存起來,並且隨機生成乙個服務端的起始序列號(比如是300)。然後給客戶端回覆一段報文,回覆報文包含syn和ack標誌(也就是syn=1,ack=1)、序列號seq=300、確認號ack=101(客戶端發過來的序列號+1)。

第三次握手:客戶端收到服務端的回覆後發現ack=1並且ack=101,於是知道服務端已經收到了序列號為100的那段報文;同時發現syn=1,知道了服務端同意了這次連線,於是就將服務端的序列號300給存下來。然後客戶端再回覆一段報文給服務端,報文包含ack標誌位(ack=1)、ack=301(服務端序列號+1)、seq=101(第一次握手時傳送報文是佔據乙個序列號的,所以這次seq就從101開始,需要注意的是不攜帶資料的ack報文是不佔據序列號的,所以後面第一次正式傳送資料時seq還是101)。當服務端收到報文後發現ack=1並且ack=301,就知道客戶端收到序列號為300的報文了,就這樣客戶端和服務端通過tcp建立了連線。

比如客戶端初始化的序列號isa=100,服務端初始化的序列號isa=300。tcp連線成功後客戶端總共傳送了1000個位元組的資料,服務端在客戶端發fin報文前總共回覆了2000個位元組的資料。

第一次揮手:當客戶端的資料都傳輸完成後,客戶端向服務端發出連線釋放報文(當然資料沒發完時也可以傳送連線釋放報文並停止傳送資料),釋放連線報文包含fin標誌位(fin=1)、序列號seq=1101(100+1+1000,其中的1是建立連線時佔的乙個序列號)。需要注意的是客戶端發出fin報文段後只是不能發資料了,但是還可以正常收資料;另外fin報文段即使不攜帶資料也要佔據乙個序列號。

第二次揮手:服務端收到客戶端發的fin報文後給客戶端回覆確認報文,確認報文包含ack標誌位(ack=1)、確認號ack=1102(客戶端fin報文序列號1101+1)、序列號seq=2300(300+2000)。此時服務端處於關閉等待狀態,而不是立馬給客戶端發fin報文,這個狀態還要持續一段時間,因為服務端可能還有資料沒發完。

第三次揮手:服務端將最後資料(比如50個位元組)傳送完畢後就向客戶端發出連線釋放報文,報文包含fin和ack標誌位(fin=1,ack=1)、確認號和第二次揮手一樣ack=1102、序列號seq=2350(2300+50)。

第四次揮手:客戶端收到服務端發的fin報文後,向服務端發出確認報文,確認報文包含ack標誌位(ack=1)、確認號ack=2351、序列號seq=1102。注意客戶端發出確認報文後不是立馬釋放tcp連線,而是要經過2msl(最長報文段壽命的2倍時長)後才釋放tcp連線。而服務端一旦收到客戶端發出的確認報文就會立馬釋放tcp連線,所以服務端結束tcp連線的時間要比客戶端早一些。

三次握手 四次揮手

1.tcp連線的建立 1 首先是伺服器初始化的過程,從 closed 關閉 狀態開始通過順序呼叫 socket bind listen 和accept 原語建立 socket 套接字,進入 listen 監聽 狀態,等待客戶端的 tcp傳輸連線請求。2 客戶端最開始也是從 closed 狀態開始呼叫...

三次握手,四次揮手

三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的 資料量是怎樣跟蹤進行協商使 資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。為了提供可靠的傳送,tcp在傳送...

三次握手 四次揮手

在tcp ip 協議中,tcp 協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1所示。1 第一次握手 建立連線時,客戶端a 傳送syn 包 syn j 到伺服器b 並進入syn send 狀態,等待伺服器b 確認。2 第二次握手 伺服器b 收到syn 包,必須確認客戶a 的syn ack j...