Netty之ChannelOption
一、概述
最近在寫一個分散式服務框架,打算用netty框架做底層網路通訊,關於netty的學習可以參考如下資料:
http://blog.csdn.net/column/details/enjoynetty.html
李林鋒的《Netty權威指南》
二、詳情
在用netty作為底層網路通訊的時候關於ChannelOption的引數讓我一直模糊不清楚,於是去看一下linux網路程式設計,發現ChannelOption的各種屬性在套接字選項中都有對應
下面簡單的總結一下ChannelOption的含義已及使用的場景
1、ChannelOption.SO_BACKLOG
ChannelOption.SO_BACKLOG對應的是tcp/ip協議listen函式中的backlog引數,函式listen(int socketfd,int backlog)用來初始化服務端可連線佇列,
服務端處理客戶端連線請求是順序處理的,所以同一時間只能處理一個客戶端連線,多個客戶端來的時候,服務端將不能處理的客戶端連線請求放在佇列中等待處理,backlog引數指定了佇列的大小
2、ChannelOption.SO_REUSEADDR
ChanneOption.SO_REUSEADDR對應於套接字選項中的SO_REUSEADDR,這個參數列示允許重複使用本地地址和埠,
比如,某個伺服器程式佔用了TCP的80埠進行監聽,此時再次監聽該埠就會返回錯誤,使用該引數就可以解決問題,該引數允許共用該埠,這個在伺服器程式中比較常使用,
比如某個程式非正常退出,該程式佔用的埠可能要被佔用一段時間才能允許其他程式使用,而且程式死掉以後,核心一需要一定的時間才能夠釋放此埠,不設定SO_REUSEADDR
就無法正常使用該埠。
3、ChannelOption.SO_KEEPALIVE
Channeloption.SO_KEEPALIVE引數對應於套接字選項中的SO_KEEPALIVE,該引數用於設定TCP連線,當設定該選項以後,連線會測試連結的狀態,這個選項用於可能長時間沒有資料交流的
連線。當設定該選項以後,如果在兩小時內沒有資料的通訊時,TCP會自動傳送一個活動探測資料包文。
4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF
ChannelOption.SO_SNDBUF引數對應於套接字選項中的SO_SNDBUF,ChannelOption.SO_RCVBUF引數對應於套接字選項中的SO_RCVBUF這兩個引數用於操作接收緩衝區和傳送緩衝區
的大小,接收緩衝區用於儲存網路協議站內收到的資料,直到應用程式讀取成功,傳送緩衝區用於儲存傳送資料,直到傳送成功。
5、ChannelOption.SO_LINGER
ChannelOption.SO_LINGER引數對應於套接字選項中的SO_LINGER,Linux核心預設的處理方式是當使用者呼叫close()方法的時候,函式返回,在可能的情況下,儘量傳送資料,不一定保證
會發生剩餘的資料,造成了資料的不確定性,使用SO_LINGER可以阻塞close()的呼叫時間,直到資料完全傳送
6、ChannelOption.TCP_NODELAY
ChannelOption.TCP_NODELAY引數對應於套接字選項中的TCP_NODELAY,該引數的使用與Nagle演算法有關
Nagle演算法是將小的資料包組裝為更大的幀然後進行傳送,而不是輸入一次傳送一次,因此在資料包不足的時候會等待其他資料的到了,組裝成大的資料包進行傳送,雖然該方式有效提高網路的有效
負載,但是卻造成了延時,而該引數的作用就是禁止使用Nagle演算法,使用於小資料即時傳輸,於TCP_NODELAY相對應的是TCP_CORK,該選項是需要等到傳送的資料量最大的時候,一次性傳送
資料,適用於檔案傳輸。
三、總結
最近使用netty感覺netty真的很強大,也很好用,推薦大家學習一下。
相關文章
- netty系列之:netty初探Netty
- netty系列之:netty架構概述Netty架構
- netty系列之:NIO和netty詳解Netty
- netty系列之:netty對marshalling的支援Netty
- netty系列之:netty中的Channel詳解Netty
- netty系列之:netty中的ByteBuf詳解Netty
- netty系列之:在netty中使用proxy protocolNettyProtocol
- netty系列之:在netty中處理CORSNettyCORS
- netty系列之:netty對SOCKS協議的支援Netty協議
- netty系列之:netty中的frame解碼器Netty
- netty系列之:在netty中使用protobuf協議Netty協議
- netty系列之:使用netty搭建websocket客戶端NettyWeb客戶端
- netty系列之:使用netty搭建websocket伺服器NettyWeb伺服器
- netty系列之:Bootstrap,ServerBootstrap和netty中的實現NettybootServer
- netty系列之:請netty再愛UDT一次Netty
- netty系列之:netty中的核心解碼器jsonNettyJSON
- netty系列之:EventExecutor,EventExecutorGroup和netty中的實現Netty
- netty系列之:channel,ServerChannel和netty中的實現NettyServer
- netty系列之:netty中的核心MessageToMessage編碼器Netty
- netty系列之:netty中的核心MessageToByte編碼器Netty
- netty系列之:EventLoop,EventLoopGroup和netty的預設實現NettyOOP
- netty系列之:netty中的自動解碼器ReplayingDecoderNetty
- netty系列之:在netty中使用native傳輸協議Netty協議
- Netty原始碼分析之LengthFieldBasedFrameDecoderNetty原始碼
- netty 之 telnet HelloWorld 詳解Netty
- Netty之資料解碼Netty
- netty系列之:channelHandlerContext詳解NettyContext
- netty系列之:channelPipeline詳解Netty
- netty系列之:channel和channelGroupNetty
- Netty之非阻塞處理Netty
- netty系列之:中國加油Netty
- Netty 系列之 Netty 百萬級推送服務設計要點Netty
- netty系列之:JVM中的Reference count原來netty中也有NettyJVM
- netty系列之:netty中常用的物件編碼解碼器Netty物件
- netty系列之:netty中常用的字串編碼解碼器Netty字串編碼
- netty系列之:netty中常用的xml編碼解碼器NettyXML
- netty系列之:netty中的懶人編碼解碼器Netty
- netty系列之:netty中的核心編碼器bytes陣列Netty陣列