netty 常規option配置總結
ServerBootstrap b = new ServerBootstrap();
b.option(ChannelOption.SO_BACKLOG, Integer.valueOf(1024));
伺服器端TCP核心模組維護有2個佇列,我們稱之為A,B吧,客戶端向服務端connect的時候,傳送帶有SYN標誌的包(第一次握手),服務端收到客戶端發來的SYN時,向客戶端傳送SYN ACK 確認(第二次握手),此時TCP核心模組把客戶端連線加入到A佇列中,然後伺服器收到客戶端發來的ACK時(第三次握手)TCP把客戶端連線從A佇列移到B佇列,連線完成,應用程式的accept會返回,也就是說accept從B佇列中取出完成三次握手的連線,A佇列和B佇列的長度之和是backlog,當A,B佇列的長之和大於backlog時,新連線將會被TCP核心拒絕,所以,如果backlog過小,可能會出現accept速度跟不上,A.B 佇列滿了,導致新客戶端無法連線,要注意的是,backlog對程式支援的連線數並無影響,backlog影響的只是還沒有被accept 取出的連線
b.option(ChannelOption.SO_REUSEADDR, true);
引數表示允許重複使用本地地址和埠, 比如,某個伺服器程序佔用了TCP的80埠進行監聽,此時再次監聽該埠就會返回錯誤,
使用該引數就可以解決問題,該引數允許共用該埠,這個在伺服器程式中比較常使用,
比如某個程序非正常退出,該程式佔用的埠可能要被佔用一段時間才能允許其他程序使用,而且程式死掉以後,核心一需要一定的時間才能夠釋放此埠,不設定SO_REUSEADDR 就無法正常使用該埠
b.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT); ChannelOption.SO_RCVBUF AND ChannelOption.SO_SNDBUF
定義接收或者傳輸的系統緩衝區buf的大小,
b.option(ChannelOption.TCP_NODELAY, Boolean.valueOf(true));
在TCP/IP協議中,無論傳送多少資料,總是要在資料前面加上協議頭,同時,對方接收到資料,也需要傳送ACK表示確認。為了儘可能的利用網路頻寬,TCP總是希望儘可能的傳送足夠大的資料。這裡就涉及到一個名為Nagle的演算法,該演算法的目的就是為了儘可能傳送大塊資料,避免網路中充斥著許多小資料塊。
TCP_NODELAY就是用於啟用或關於Nagle演算法。如果要求高實時性,有資料傳送時就馬上傳送,就將該選項設定為true關閉Nagle演算法;如果要減少傳送次數減少網路互動,就設定為false等累積一定大小後再發送。預設為false。