淺談tcp socket的backlog參數


最近看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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

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



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