Java網絡編程之Netty服務端ChannelOption.SO_BACKLOG配置


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM