建立TCP連線時的三次握手與四次揮手問題

2021-09-28 17:18:43 字數 1705 閱讀 2451

1.1 狀態字段

1.2 傳輸中的涉及字段(重點字段)

注意

不要將確認序號 ack 與標誌位中的 ack 搞混了

確認方ack=發起方req+1,兩端配對

2.1 原理

剛開始客戶端處於 closed 的狀態,服務端處於 listen 狀態。

第二次握手:伺服器收到客戶端的 syn 報文之後,會以自己的 syn 報文作為應答,並且也是指定了自己的初始化序列號 isn(s) ,同時會把客戶端的 isn + 1 作為 ack 的值,表示自己已經收到了客戶端的 syn,此時伺服器處於syn_rcvd的狀態。

第三次握手:客戶端收到 syn 報文之後,會傳送乙個 ack 報文,當然,也是一樣把伺服器的 isn + 1 作為 ack 的值,表示已經收到了服務端的 syn 報文,此時客戶端處於established狀態。伺服器收到 ack 報文之後,也處於established狀態,此時,雙方已建立起了鏈結。

2.2 作用

(1)確認雙方的接受能力、傳送能力是否正常。

(2)指定自己的初始化序列號,為後面的可靠傳送做準備。

(3)如果是 https 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密金鑰的生成。

2.3 涉及問題

為什麼需要三次握手,兩次不行嗎?

第三次握手的必要性

(isn)是固定的嗎?

什麼是半連線佇列?

三次握手過程中可以攜帶資料嗎?

如果第三次握手丟失了,客戶端服務端會如何處理?

syn攻擊

什麼是syn攻擊(syn flood)?如何檢測syn攻擊?如何防禦syn攻擊?

3.1 原理

剛開始雙方都處於established狀態,假如是客戶端先發起關閉請求

第一次揮手:客戶端傳送乙個 fin 報文,報文中會指定乙個序列號。此時客戶端處於fin_wait1狀態。

第二次揮手:服務端收到 fin 之後,會傳送 ack 報文,且把客戶端的序列號值 +1 作為 ack 報文的序列號值,表明已經收到客戶端的報文了,此時服務端處於close_wait狀態。

第三次揮手:如果服務端也想斷開連線了,和客戶端的第一次揮手一樣,發給 fin 報文,且指定乙個序列號。此時服務端處於last_ack的狀態。

第四次揮手:客戶端收到 fin 之後,一樣傳送乙個 ack 報文作為應答,且把服務端的序列號值 +1 作為自己 ack 報文的序列號值,此時客戶端處於time_wait狀態。

需要過一陣子以確保服務端收到自己的 ack 報文之後,就處於關閉連線了,進入closed狀態。

3.2 涉及問題

(time wait)為什麼客戶端傳送 ack 之後不直接關閉,而是要等一陣子才關閉?

揮手為什麼需要四次?

四次揮手釋放連線時,等待 2msl 的意義?

為什麼 time_wait 狀態需要經過2msl(最大報文段生存時間)才能返回到 close 狀態?

TCP建立連線時的三次握手

tcp建立連線時的三次握手 在網際網路協議族 internet protocol suite 中,tcp層是位於ip層之上,應用層之下的運輸層。不同主機的應用層之間經常需要可靠的 像管道一樣的連線,但是ip層不提供這樣的流機制,而是提供不可靠的包交換。應用層向tcp層傳送用於網間傳輸的 用8位位元組...

TCP連線建立時三次握手詳解

1 概述 tcp連線建立過程中要解決以下三個問題 1 要使每一方能夠確知對方的存在。2 要允許雙方協商一些引數 如最大報文段長度,最大視窗大小,服務質量等 3 能夠對運輸實體資源 如快取大小,連線表中的專案等 進行分配。tcp 連線的建立都是採用客戶伺服器方式。主動發起連線建立的應用程序叫做客戶 c...

三次握手 TCP建立連線

在tcp ip 中,tcp協議提供可靠的連線服務 採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端 傳送syn 包 syn j 到伺服器 並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次握手 伺服器 收到syn...