TCP相關問題1
1.TCP主動斷開連接方為什么需要等待2MSL
如上圖所示:在被動鏈接方調用close,發送FIN時進入LAST_ACK狀態,但未收到主動連接方的ack確認,需要被動連接方重新發送一個FIN,而為什么是2MSL,一般認為丟失ack在網絡中生存的時間是1MSL,重傳FIN也需要1MSL,所以需要等待2MSL時間。
2.SYN什么時候被丟棄?
-
TCP的半連接隊列和全連接隊列滿了,造成SYN被丟棄
-
開啟tcp_tw_recycle參數,并且在NAT環境下,造成SYN被丟棄
a.TCP中linux 內核維持兩個隊列,半連接隊列和全連接隊列
三次握手過程 :
- 服務端收到客戶端SYN請求請求后,內核會把該連接存儲到半連接隊列,并向客戶端響應SYN+ACK。
- 接著客戶端會返回ACK,服務端收到第三次握手的ACK后,內核會把連接從半連接隊列(listen)移除。
- 然后創建新的完全連接,并將其添加到accept完全隊列,等待進程調用accept函數時把連接取出來。
-
半連接隊列滿了:大量SYN同時道道服務端,導致SYN被丟棄,會造成SYN泛洪攻擊。
-
解決方案:
? 1.增加半連接隊列。
? 2.開啟tcp_syncookies
? 3.減少syn+ack重傳次數
-
-
全連接隊列滿了:在服務端并發處理大量請求,如果accept隊列過小時或者應用程序accept不及時,會造成accept隊列滿了,這是之后的連接會被丟棄,這樣會造成服務端請求數量上不去的問題。
-
解決方案:
? 1.調大accept隊列最大長度,通過accept 的backlog參數以及samaconnect參數
? 2.檢查系統或者程序代碼為什么accept不及時。
-
b.開啟tcp_tw_recycle參數,并且在NAT環境下,造成SYN被丟棄
? 2.前因
? TCP四次揮手過程中主動斷開方會有一個TIME_WAIT狀態,這個狀態會有2MSL等待時間變為CLOSE狀態。
-
前因1:在linux操作系統中,TIME_WAIT等待時間2MSL為60s。主動斷開方需要等待2MSL時間端口才能被釋放。
-
前因2:客戶端主動斷開連接并且大量主動斷開連接。客戶端一直占用連接,2MSL時間內端口一直被占用,一般開啟的端口號為32768~61000,資源有限。如果客戶端發起大量連接,并且斷開進入TIME_WAIT狀態,端口被占用導致后面其他客戶端無端口可用。
小結:TCP要解決當前沒有端口可用,客戶端還要建立連接,所以誕生了tcp_tw_recycle
-
前因3:
- tcp_tw_recycle,如果選項開啟的話,允許處于TIME_WAIT狀態的連接被快速回收。
- tcp_tw_reuse,如果選項開啟的話,在調用connect函數時,如果內核選擇到的端口已經被相同的四元組占用時,就會判斷是否處于TIME_WAIT狀態,如果狀態處于TIME_WAIT,并且狀態持續時間超過了1s,那么就會重用這個連接,然后可以正常使用這個端口了,只使用于連接發起方
-
前因4:開啟了recycle和timestamp選項,觸發PAWS機制(per-host的PAWS機制)
-
作用防止TCP中的序號發生繞回
使用tcp協議進行數據傳輸時,tcp都包含一個32位的序號,用于表示報文段中的數據在整個數據流中的位置,TCP序號的最大值為2^32,是一個無符號整數,到達最大值時序號會循環變為0,這個現象叫做"序號繞回"
-
-
經過同一NAT轉換來自不同的client的數據流,在服務端看來是于同一host打交道
客戶端用的NAT網關,不同客戶端經過同一NAT之后,轉換為同一個公網IP,在服務端看來好像跟同一個客戶端打交道
-
雖然經過同一個NAT轉化,但不同客戶端各自攜帶自己的timestamp,經過NAT轉換后無法保證數據包帶的timestamp值嚴格遞增。
-
當服務端的per-host PAWS機制被觸發后,會丟棄timestamp值不符合遞增條件的包。
例如:
? a.當客戶端A經過NAT網關和服務端建立TCP連接,然后服務端主動關閉并快速回收TIME_WAIT狀態連接后,客戶端B 也通過NAT和服務器建立連接,由于客戶端A和B經過同一個NAT轉換,所以相同的IP地址服務端認為是一個客戶端發送過來的,客戶端B發送的timestamp較小,由于服務端的PAWS機制,服務端會丟棄客戶端B發送的較小timestap的SYN包
-
tcp_tw_recyle在linux4.12版本后,直接取消了這一參數。
mestap的SYN包
- tcp_tw_recyle在linux4.12版本后,直接取消了這一參數。
參考連接:https://www.bilibili.com/video/BV1Pw411U7TA?spm_id_from=333.788.videopod.sections&vd_source=4a32de7f18a719e139c5f65d7ba504d1