個人對TCP3次握手和4次揮手的理解

2022-08-30 19:54:13 字數 1955 閱讀 3061

首先syn這個標誌位是用於發起tcp連線的,所以第一次握手,a-》b的時候syn=1,同時第二次握手b-》a的時候,因為要接受其tcp連線,所以其syn也=1.

也就是前兩次握手 syn都=1

然後就可以討論下seq(資料序號)和ack(確認序號)這兩個概念

seq是指 當前 資料報在整個資料報中的位置

ack是指 希望下個資料發過來的首資料的位置

比如0-700的資料接收完了,下乙個想接受的是701開始的資料,所以這時候ack就為701

然後再詳細說下tcp3次握手中他們的變化

首先是第一次握手a-》b,因為是第一次握手,所以 當前資料報 在 整個資料報的位置為 0 

所以此時seq=0

又因為對方沒有傳過任何資料,所以期望對方傳的資料報首位也是在0的

所以此時ack也=0

然後是第二次握手b-》a,因為這是b第一次傳送資料,所以傳送的資料和上面第一次傳送資料中所期望的一樣,首位資料位為 0

所以此時seq=0

又因為a已經發過一次seq=0的資料了,所以b期望a傳送接下來的資訊是從位置1開始的

所以此時ack=1

然後是第三次握手a-》b,如上面第二次b所期待的一樣,這次傳送的資訊是從第1位開始的 所以

seq=1

又同時上次b傳送過0位置開始的資料報了,所以期待下次的傳送資料的位置是1

所以ack=1

到這裡 tcp的3次握手就完成了

但為什麼tcp的連線需要的是3次握手呢?

因為本質上,雙方都需要確定乙個資訊:對方能收到我的訊息

所以三次握手就分別有任務了

第一次握手,a傳送給b,a想要知道b能不能收到自己的訊息,所以這時候需要b乙個回覆,這就是第二次握手的意義——讓a知道了b能收到他的訊息

第二次握手,b傳送給a,是為了回應a告訴他自己(b)可以收到a的訊息

但與此同時,b也要確認a能收到自己傳送的訊息,所以需要乙個回覆,這就是第三次握手的意義

第三次握手,a傳送給b,這時候發過去b一但收到,雙方都知道自己和對方的通訊莫得問題了,於是就可以開始傳資料了

所以一般下乙個資料報就是含有資料的資料報了

這時候再說下tcp的4次揮手

因為一般來說 tcp連線在不斷傳輸資料,一但有其中一方要發起斷開連線,雙方也都有要確認的事——

對方都沒有資料需要傳了

同時需要知道一點,tcp中是利用fin 這個終止標誌位(就如發起連線時的syn一樣)來標識乙個斷開連線的請求的

這時候就可以開始說4次揮手的過程了

首先是其中一方,稱為主動方,主動發起了斷開連線的請求a-》b,

這是第一次揮手,其fin=1,seq=x,ack=y(代表任意)

這時候有可能被動方還有資料要傳送,所以下一次揮手不能直接傳送fin=1來斷開連線,這也是和握手之間的區別

但是同時第二次揮手也要發出「我知道你要斷開連線了,讓我先傳了這個資料報」

所以第二次揮手,b-》a,此時因為b還有資料要傳,傳的開始的位置是第一次揮手中ack的值,所以此時seq=y

同時,所以ack要等於第一次揮手其資料報位置seq+1的值,也就是x+1

然後就開始了第三次揮手,這時候終於傳完了資料,b-》a再發了乙個資料,並且fin標識=1,代表b也完事了,同時發乙個檔期資料位置seq=z ,這時候這個z是第二次揮手時候資料報位置y加上第二次揮手傳輸資料的長度=z,因為不知道資料長度,所以這裡也只能用z來表示。同時ack=第一次揮手的時候,a的當前資料報位置x,因為b已經知道a要斷連了,所以不期待更新的資料報了,所以ack也就只到x為止了。

然後就是a-》b的第四次揮手,讓b知道a也收到了你的fin結束訊息,a也不期待有下乙個新的b資料報了,所以ack也不動了,設定為了第三次揮手時b傳送的資料報位置z了,同時自己的seq也還是x,沒有新的資料所以不變了

這就是對tcp3次握手和4次揮手的理解

TCP 3次握手和4次揮手

3次握手 3次握手指的是tcp 建立連線 階段 1.client service syn sequence number a 2.client service syn ack sequence number b acknowledge number a 1 3.client service ack ...

TCP3次握手與4次揮手

3次握手過程狀態 listen 這個也是非常容易理解的乙個狀態,表示伺服器端的某個socket處於監聽狀態,可以接受連線了。syn sent 當客戶端socket執行connect連線時,它首先傳送syn報文,因此也隨即它會進入到了syn sent狀態,並等待服務端的傳送三次握手中的第2個報文。sy...

TCP 3次握手4次揮手 複習

學習自 握手syn syn ack ack未連線佇列 服務端維護乙個未連線佇列,當客戶端發來ack時,伺服器會入佇列乙個相應的標識,那個標識是已接收ack狀態,然後會發syn ack,當客戶端再次傳送ack後,出佇列那個相應的標識,正式建立連線 為何要3次握手?假如客戶端傳送syn,但是莫名滯留了,...