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)

一、SYN表示創建鏈接 
二、FIN表示關閉鏈接 
三、ACK表示響應 
四、PSH表示有 DATA數據傳輸 
五、RST表示鏈接重置。socket

網絡鏈接

服務器TCP內核 內維護了兩個隊列,稱爲A隊列和B 隊列 
一、第一次握手,客戶端向服務器端發送SYN標誌的包 
      創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認; 
二、第二次握手,服務器端,向客戶端發送 SYN 和ACK的包 
      服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態 
三、第三次握手,客戶端向服務器端 ,收到服務端發送的SYN和ACK包,確認正確後,給服務器發送發送ACK的包 
      客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據tcp

若是A+B的長度大於Backlog時,新的鏈接就會唄TCP內核拒絕掉 
因此,若是backlog太小,就可能出現Accept的速度跟不上,A,B隊列滿了,就會致使客戶端沒法創建鏈接 
須要注意的是,backlog對程序的鏈接數沒影響,可是影響的是尚未被accept取出的鏈接
函數

 

轉自:https://blog.csdn.net/yelllowcong/article/details/78173255spa

相關文章
相關標籤/搜索