TCP的半連接與全連接佇列
- TCP連接佇列
- 半連接佇列
- 全連接佇列
- TCP全連接佇列策略
- 設定TCP全連接佇列
- TCP半佇列溢位
- 最大半佇列連接數
- 服務端處于SYN_RECV狀態的最大個數
- syncookies
TCP連接佇列
半連接佇列
服務端收到客戶端發起的 SYN 請求后,內核會把該連接存盤到半連接佇列(SYN佇列),并向客戶端回應 SYN+ACK,
全連接佇列
服務端收到第三次握手的ACK后,內核會把連接從半連接佇列移除,然后創建新的完全的連接,并將其添加到accept佇列,等待行程呼叫accept 函式時把連接取出來,

TCP全連接佇列策略
tcp_abort_on_overflow 共有兩個值分別是0和1,其分別表示
- 0:如果全連接佇列滿了,那么server扔掉client發過來的ack
- 1:如果全連接佇列滿了,server發送?個reset包給client,表示廢掉這個握手程序和這個連接
通常情況下,應當把tcp_abort_on_overflow設定為0,因為這樣更有利于應對突發當TCP全連接佇列滿導致服務器丟掉了ACK,與此同時,客戶端的連接狀態卻是ESTABLISHED,行程就在建立好的連接上發送請求,只要服務器沒有為請求回復ACK,請求就會被多次重發,如果服務器上的行程只是短暫的繁忙造成accept佇列滿,那么當TCP全連接佇列有空位時,再次接收到的請求報文由于含有 ACK, 仍然會觸發服務器端成功建立連接,所以tcp_abort_on_overflow設為0可以提高連接建立的成功率,只有你非常肯定 TCP全連接佇列會長期溢位時,才能設定為1以盡快通知客戶端,
設定TCP全連接佇列
TCP全連接佇列的最大值取決于somaxconn和backlog之間的最小值,也就是 min(somaxconn, backlog)
- somaxconn 是 Linux 內核的引數,默認值是 128,可以通過
/proc/sys/net/core/somaxconn來設定其值 - backlog是listen(int sockfd, int backlog)函式中的backlog大小,Nginx默認值是511,可以通過修改組態檔設定其長度
如果持續不斷地有連接因為 TCP 全連接佇列溢位被丟棄,就應該調? backlog 以及 somaxconn 引數,
TCP半佇列溢位
- 如果半連接佇列滿了,并且沒有開啟 tcp_syncookies,則會丟棄
- 若全連接佇列滿了,且沒有重傳SYN+ACK包的連接請求多于1個,則會丟棄
- 如果沒有開啟tcp_syncookies,并且max_syn_backlog減去當前半連接佇列長度小于(max_syn_backlog >> 2),則會丟棄
最大半佇列連接數
- 當 max_syn_backlog > min(somaxconn, backlog) 時, 半連接佇列最大值 max_qlen_log = min(somaxconn, backlog) * 2
- 當 max_syn_backlog < min(somaxconn, backlog) 時, 半連接佇列最大值 max_qlen_log = max_syn_backlog * 2
服務端處于SYN_RECV狀態的最大個數
- 如果當前半連接佇列沒超過理論半連接佇列最大值,但是超過 max_syn_backlog - (max_syn_backlog >> 2),那么處于 SYN_RECV 狀態的最大個數就是max_syn_backlog - (max_syn_backlog >> 2)
- 如果當前半連接佇列超過理論半連接佇列最大值,那么處于SYN_RECV狀態的最大個數就是理論半連接佇列最大值
syncookies
開啟 syncookies 功能就可以在不使用SYN半連接佇列的情況下成功建立連接,syncookies 是這么做的:服務器根據當前狀態計算出?個值,放在己方發出的SYN+ACK報文中發出,當客戶端回傳ACK報文時,取出該值驗證,如果合法,就認為連接建立成功,

syncookies 引數主要有以下三個值
- 0 值,表示關閉該功能
- 1 值,表示僅當 SYN 半連接佇列放不下時,再啟用它
- 2 值,表示無條件開啟功能
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333663.html
標籤:其他
上一篇:TCP/UDP面試題高頻詞匯詳解
