三次握手與四次揮手

2022-09-03 01:30:11 字數 3487 閱讀 3792

三次握手:

第一次握手:

客戶端:首先客戶端發起連線,在tcp層封裝的包內設定標誌位syn,同時產生乙個隨機32位序號(舉例為1000),傳送給伺服器端。

服務端:伺服器端接受後,首先檢測標誌位syn是否為1,若為1則說明接受成功。

第二次握手:

服務端:服務端也往回傳送乙個包,在包的tcp層設定標誌位ack為1,作為對客戶端請求連線傳送的包的應答。同時也設定該包內的標誌位syn位上為1。伺服器往回送的包的標誌位已經設定完了,隨後在設定32位確認序號值(注意不是32位序號值)(舉例為1001),這個值是客戶端請求連線所傳送的包中的32位序號值+1.。設定完32位確認序號後,還要在設定乙個32位序號值(舉例為2000),在將這個包傳送給客戶端。

客戶端:接收到服務端傳送的包後,首先檢測ack標誌位是否為1。然後根據自己第一次握手時所發出的32位序號值檢測服務端傳送的包的32位確認訊號值,是否相差為1。

第三次握手:

客戶端:傳送乙個確認資料報,該資料報首先設定標誌位ack為1,然後將第二次握手時傳送的32位序號值+1後放入32位確認序號值中(舉例為2001)。

服務端:接受到客戶端的確認資料報,首先檢測標誌位ack是否為1,然後校驗32位確認序號值是否為第二次握手中服務端所傳送的32位序號值(2000)加1後的值(2001)。

ack所回應32位確認序號值的意義:以1000為例,ack為1001代表 發過來的32位序號值(1000)+syn標誌位值(1)+攜帶資料值(0)=1000+1+0

加上syn標誌位值1,是為了告訴對端,你傳送的包為syn包這一點我已知曉。

如果攜帶了資料10個位元組,則應ac返回1011,即代表在32位序號值的基礎上,我已經接受到了所傳送的10個位元組,並且檢測到了syn標誌位為1。

mss:最大資料長度,用於告訴對端,以後連線進行資料傳輸時所傳送的資料最大值不能超過mss這個最大值。

資料傳輸階段:

客戶端:向伺服器傳送乙個請求資料報,其中攜帶有資料。首先在這個包中設定32位序號值,該值為上一次對端傳送ack時所攜帶的32位確認訊號值。在圖里,上一次對端傳送ack是發生在第二次握手時服務端對第一次握手中,客戶端所傳送包的確認,該值為1001。在這裡因為沒有設定syn為1,所以該值不用再+1。同時設定ack為1,並傳送乙個32位確認序號值8001,從圖里看,這是第一次兩個端間進行資料交流,為什麼還要重複在傳送乙個32位確認序號8001呢?這是為了服務端往客戶端傳送包時設定32位序號值考慮,因為服務端往客戶端傳送包時也要填入32位序號值,這個值也與對端上次最後傳送ack時攜帶的32位確認序號值相等。

服務端:接受到客戶端傳送的請求資料報後,首先處理資料,然後將處理後的資料封入tcp層的資料中。然後設定32位訊號值,這個值與上次最後一次對端傳送ack的32位確認訊號值相等,同時設定ack值為1,並填入32位確認序號值,這個值是上次對端傳送的包的32位序號值加上所接受到的資料大小(1021:1001+接受到20個位元組)的值。

客戶端:接受到服務端返回的包,首先檢查32位確認序號值,這是為了檢測上次傳送的包的資料是否被對面接受,如果值該32位確認序號值不為1021,而為1001,則代表該部分資料都丟失了,因此需要重傳一次。如果確認該值等於1021,代表接受成功。然後處理對端所傳送過來的資料,這裡圖中有10個位元組。之後需要告訴對端,客戶端已經成功接受到你們所發過來的資料,返回乙個資料報,設定ack位為1,並設定32位確認訊號值為8011,這代表上乙個對端傳送的32位訊號值加上所接收到的資料大小(8011:8001+接受到10個位元組)的值。

tcp的安全性體現在此,每次資料傳輸,都會告訴對端自己是否已經接受到了你說封裝的資料。

四次揮手:

不同於三次握手只能由客戶端發起,四次揮手既可以通過客戶端發起,也可以通過服務端發起。

以客戶端發起斷開為例:

第一次揮手:

客戶端:傳送乙個請求斷開的資料報。首先設定fin標誌位為1,然後填入32位序號值,該值也是與最近一次對端傳送ack時的32位確認訊號的值。在然後設定ack為1,填入32位確認序號值,該值與上一次客戶端傳送的ack中的32位確認序號值相等,只是為了讓對端在往回傳送資料報時填32位序號值。

第二次揮手:

服務端:首先校驗對端傳送的請求斷開的資料報的fin標誌位是否為1,然後向對端傳送乙個ack包,並設定32位確認序號值,該值為對端所傳送的請求斷開資料報中,32位序號值加上1,這個加1代表fin標誌位的值,即告訴對端,你發過來的資料報是請求斷開的資料報這一點我已知曉。如果客戶端傳送fin包時攜帶了資料,該確認序號值還要加上傳送的攜帶資料的大小。

客戶端:檢測對端傳送的資料報的ack位是否為1,然後在檢測32位確認序號值的大小是否滿足要求。

第三次揮手:

服務端:服務端向對端傳送乙個fin包,告訴對端我請求與你斷開連線。首先設定資料報內fin標誌位為1,然後填入32位序號值,該值與上一次對端傳送的ack包的32位確認序號值相等,然後設定ack標誌位為1,填入32位確認訊號值,該值與上一次對端傳送的包中32位序號值加上接受到的fin值加上所攜帶的資料值相等,或者說是重複上一次服務端傳送的ack值而已。

客戶端:檢測資料,首先校驗fin標誌位,然後檢驗32位序號值。然後校驗ack標誌位,然後檢驗32位確認序號值。

第四次揮手:

客戶端:傳送乙個ack包,首先設定ack標誌位為1,然後設定32位確認序號值,該值為上一次對端傳送的fin包的32位序號值加上fin標誌位的值1在加上所攜帶的資料(這裡為0)。

三次握手與四次揮手

1 三次握手是怎麼個意思?三次握手的是為了是建立可靠的通訊通道,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。這個三次握手只能是客戶端去發起,伺服器端接收確認的。正常來說伺服器是一直在監聽的,客戶端上線後去請求伺服器端,然後通過tcp協議進行連線。沒...

三次握手與四次揮手

三次握手與四次揮手分別對應tcp連線建立過程與斷開過程,先上tcp報文格式 三次握手過程 問題1 為什麼要三次握手?答 三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。第一次握手 client什麼都不能確認...

三次握手與四次揮手

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