ChannelOption.SO_BACKLOG對應的是tcp/ip協議listen函數中的backlog參數,函數listen(int socketfd,int backlog)用來初始化服務端可連接隊列,服務端處理客戶端連接請求是順序處理的,所以同一時間只能處理一個客戶端連接,多個客戶端來的時候,服務端將不能處理的客戶端連接請求放在隊列中等待處理,backlog參數指定了隊列的大小
BACKLOG用於構造服務端套接字ServerSocket對象,標識當服務器請求處理線程全滿時,用於臨時存放已完成三次握手的請求的隊列的最大長度。如果未設置或所設置的值小於1,Java將使用默認值50。
TCP的連接狀態 (SYN, FIN, ACK, PSH, RST, URG)
1、SYN表示建立連接
2、FIN表示關閉連接
3、ACK表示響應
4、PSH表示有 DATA數據傳輸
5、RST表示連接重置。
網絡連接
服務器TCP內核 內維護了兩個隊列,稱為A隊列和B 隊列
1、第一次握手,客戶端向服務器端發送SYN標志的包
建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
2、第二次握手,服務器端,向客戶端發送 SYN 和ACK的包
服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態
3、第三次握手,客戶端向服務器端 ,收到服務端發送的SYN和ACK包,確認正確后,給服務器發送發送ACK的包
客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據
如果A+B的長度大於Backlog時,新的連接就會唄TCP內核拒絕掉
所以,如果backlog過小,就可能出現Accept的速度跟不上,A,B隊列滿了,就會導致客戶端無法建立連接
需要注意的是,backlog對程序的連接數沒影響,但是影響的是還沒有被accept取出的連接
轉自:https://blog.csdn.net/yelllowcong/article/details/78173255