文章目錄
- (1) 三次握手各狀態
- CLOSE狀態
- SYN_SENT狀態
- SYN_RECV狀態
- ESTABLISHED狀態
- (2) 為什么握手時的seqnum是隨機值,以及acknum的功能
- (3) 三次握手中的半連接隊列(SYN隊列)和全連接隊列(ACCEPT隊列)
- 半連接隊列
- 全連接隊列
- (4) 怎么緩解SYN泛洪
- (5) TCP實現P2P
- (6) 為什么需要三次握手?

(1) 三次握手各狀態
CLOSE狀態
發起連接和listen之前的初始狀態
SYN_SENT狀態
第一次握手,客戶端向服務器發起連接請求,發送一個SYN數據包,該數據包中包含了客戶端的初始序列號等信息,用于請求與服務器建立TCP連接
SYN_SENT: 初始狀態發送SYN報文后,即進入到了SYN_SENT狀態,并等待服務端的發送三次握手中的第2個報文。
SYN_RECV狀態
第二次握手,服務器接著會向客戶端發送一個SYN+ACK數據包,這是對客戶端SYN請求的響應。該數據包包含了服務器的初始序列號以及對客戶端SYN包的確認信息,表示服務器同意與客戶端建立連接。
SYN_RCVD: 這個狀態表示LISTEN狀體時接受到了SYN報文,在正常情況下,這個狀態是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態
ESTABLISHED狀態
第三次握手,客戶端收到服務器的SYN+ACK包后,會 向服務器發送一個ACK數據包 ,用于確認收到了服務器的SYN+ACK包。這個ACK包標志著客戶端和服務器之間的TCP連接已經基本建立成功,此時連接處于ESTABLISHED狀態。
當服務端收到收到ack包以后會進入ESTABLISHED狀態。
(2) 為什么握手時的seqnum是隨機值,以及acknum的功能
在第一次握手的時候,tcp包頭部的Sequence number是一個隨機值,就算自己隨便設置一個值后續的TCP連接也是可以正常運作的(上圖的seqnum = 1234),但是在第二次握手回復的TCP包中的acknum會比第一次握手的Sequence number多一(acknum 1235),這里的1235表示表示 1235以前的所有包都收到了,作用:保證了tcp包的不丟失,不重復
包括第二次握手時服務端發出的seqnum也是隨機值(4567),但是第三次握手時的acknum是seqnum+1(4568)
作用:避免被抓包以后被別人知道之前發過多少個包
(3) 三次握手中的半連接隊列(SYN隊列)和全連接隊列(ACCEPT隊列)
半連接隊列
當服務器收到客戶端發送的 SYN 報文段時,會創建一個半連接節點并放進半連接隊列,該節點記錄了該連接的相關信息,如客戶端的 IP 地址、端口號等,此時連接處于半連接狀態,
SYN隊列的作用:在服務器處理能力有限的情況下,SYN 隊列可以暫時緩存客戶端的連接請求,避免因為同時處理過多連接請求而導致系統崩潰。
全連接隊列
服務器收到客戶端的ACK包后,會檢查這個ACK包的合法性和有效性,如確認序列號是否正確等。如果檢查通過,服務器會將對應的連接從SYN隊列中取出,并放入accept隊列。Accept 隊列用于存放已經完成三次握手的 TCP 連接,此時,應用程序就可以通過調用accept系統調用從accept隊列中獲取已經建立好的連接,開始進行數據傳輸等操作。
Accept隊列的作用:
(1)Accept 隊列將網絡層已經建立好的連接與應用層的處理隔離開來。應用層可以按照自己的節奏從 Accept 隊列中獲取連接,而不會受到網絡層連接建立速度的直接影響。
(2)緩沖連接數據:在應用程序暫時無法處理新連接時,Accept 隊列可以作為一個緩沖區域,存儲這些已經建立的連接,避免連接因為等待處理時間過長而出現問題。
(4) 怎么緩解SYN泛洪
(1)net.ipv4.tcp_max_syn_backlog:在 Linux 系統中,該參數用于設置 SYN 隊列的最大長度。默認值通常為 1024 或 2048,可以根據服務器的性能和實際需求進行調整。
通過限制 SYN 隊列的長度,可以在一定程度上抵御 SYN Flood 攻擊。當 SYN 隊列已滿時,服務器會丟棄新的 SYN 請求,從而避免被大量偽造的 SYN 報文淹沒。
(2)somaxconn:這是系統級別的參數,用于限制 Accept 隊列的最大長度。在不同的操作系統中,默認值可能不同。例如在 Linux 中,默認值通常為 128。
listen(int socketfd, int backlog):在網絡編程中,listen 函數的 backlog 參數用于設置服務器端監聽套接字的 Accept 隊列長度。它會覆蓋系統默認的 somaxconn 值,但通常不能超過 somaxconn。
當 Accept 隊列已滿時,服務器會拒絕新的 SYN 請求,從而避免服務器因處理大量的 SYN 請求而耗盡資源,在一定程度上可以緩解 SYN 泛洪攻擊對服務器造成的影響。
(5) TCP實現P2P
P2P中沒有客戶端和服務端的概念
(6) 為什么需要三次握手?
三次握手的主要目的是為了確認服務器端和客戶端的發送和接受能力是否正常
-
第一次握手:客戶端發送網絡包,服務端收到了。 這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。
-
第二次握手:服務端發包,客戶端收到了。 這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常。
-
第三次握手:客戶端發包,服務端收到了。 這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。
假設只有兩次握手。
當客戶端發送第一個SYN,但由于網絡延遲或其他原因,第一個SYN沒有及時到達服務端,于是客戶端又發送一次SYN,這次的SYN成功到達了服務端,在連接結束后,第一個SYN終于到了服務端,此時服務端以為客戶端再次發起連接請求,于是回復ACK+SYN導致再次連接再次建立,浪費資源