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