Netty之ChannelOption

小師兄.發表於2019-01-22

 

一、概述

  最近在寫一個分散式服務框架,打算用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真的很強大,也很好用,推薦大家學習一下。

相關文章