最近看netty源碼碰到ChannelOption.SO_BACKLOG
參數,通過跟蹤代碼發現其實是用於設置底層tcp socket的backlog參數,由於不了解這個參數,有必要徹底的理解一下。
底層
backlog參數主要用於底層方法int listen(int sockfd, int backlog)
, 在解釋backlog參數之前,我們先了解下tcp在內核的請求過程,其實就是tcp的三次握手:

1、client發送SYN到server,將狀態修改為SYN_SEND,如果server收到請求,則將狀態修改為SYN_RCVD,並把該請求放到syns queue隊列中。
2、server回復SYN+ACK給client,如果client收到請求,則將狀態修改為ESTABLISHED,並發送ACK給server。
3、server收到ACK,將狀態修改為ESTABLISHED,並把該請求從syns queue中放到accept queue。
在linux系統內核中維護了兩個隊列:syns queue和accept queue
syns queue
用於保存半連接狀態的請求,其大小通過/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默認值是512,不過這個設置有效的前提是系統的syncookies功能被禁用。互聯網常見的TCP SYN FLOOD惡意DOS攻擊方式就是建立大量的半連接狀態的請求,然后丟棄,導致syns queue不能保存其它正常的請求。
accept queue
用於保存全連接狀態的請求,其大小通過/proc/sys/net/core/somaxconn指定,在使用listen函數時,內核會根據傳入的backlog參數與系統參數somaxconn,取二者的較小值。
如果accpet queue隊列滿了,server將發送一個ECONNREFUSED錯誤信息Connection refused到client。
應用層
在netty實現中,backlog默認通過NetUtil.SOMAXCONN指定。

當然也可以通過option方法自定義backlog的大小。

backlog設置注意點
前面已經提到過,內核會根據somaxconn和backlog的較小值設置accept queue的大小,如果想擴大accept queue的大小,必須要同時調整這兩個參數。
作者:占小狼
鏈接:https://www.jianshu.com/p/e6f2036621f4
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。