轉(zhuǎn)自:https://www.cnblogs.com/googlemeoften/p/6082785.html
一、概述
最近在寫(xiě)一個(gè)分布式服務(wù)框架,打算用netty框架做底層網(wǎng)絡(luò)通信拐云,關(guān)于netty的學(xué)習(xí)可以參考如下資料:
http://blog.csdn.net/column/details/enjoynetty.html
李林鋒的《Netty權(quán)威指南》
二咖祭、詳情
在用netty作為底層網(wǎng)絡(luò)通信的時(shí)候關(guān)于ChannelOption的參數(shù)讓我一直模糊不清楚充蓝,于是去看一下linux網(wǎng)絡(luò)編程君躺,發(fā)現(xiàn)ChannelOption的各種屬性在套接字選項(xiàng)中都有對(duì)應(yīng)
下面簡(jiǎn)單的總結(jié)一下ChannelOption的含義已及使用的場(chǎng)景
1犹撒、ChannelOption.SO_BACKLOG
ChannelOption.SO_BACKLOG對(duì)應(yīng)的是tcp/ip協(xié)議listen函數(shù)中的backlog參數(shù)横腿,函數(shù)listen(int socketfd,int backlog)用來(lái)初始化服務(wù)端可連接隊(duì)列颓屑,服務(wù)端處理客戶端連接請(qǐng)求是順序處理的,所以同一時(shí)間只能處理一個(gè)客戶端連接耿焊,多個(gè)客戶端來(lái)的時(shí)候揪惦,服務(wù)端將不能處理的客戶端連接請(qǐng)求放在隊(duì)列中等待處理,backlog參數(shù)指定了隊(duì)列的大小
2罗侯、ChannelOption.SO_REUSEADDR
ChanneOption.SO_REUSEADDR對(duì)應(yīng)于套接字選項(xiàng)中的SO_REUSEADDR器腋,這個(gè)參數(shù)表示允許重復(fù)使用本地地址和端口,比如钩杰,某個(gè)服務(wù)器進(jìn)程占用了TCP的80端口進(jìn)行監(jiān)聽(tīng)纫塌,此時(shí)再次監(jiān)聽(tīng)該端口就會(huì)返回錯(cuò)誤,使用該參數(shù)就可以解決問(wèn)題讲弄,該參數(shù)允許共用該端口措左,這個(gè)在服務(wù)器程序中比較常使用,比如某個(gè)進(jìn)程非正常退出避除,該程序占用的端口可能要被占用一段時(shí)間才能允許其他進(jìn)程使用怎披,而且程序死掉以后,內(nèi)核一需要一定的時(shí)間才能夠釋放此端口驹饺,不設(shè)置SO_REUSEADDR就無(wú)法正常使用該端口钳枕。
3缴渊、ChannelOption.SO_KEEPALIVE
Channeloption.SO_KEEPALIVE參數(shù)對(duì)應(yīng)于套接字選項(xiàng)中的SO_KEEPALIVE赏壹,該參數(shù)用于設(shè)置TCP連接,當(dāng)設(shè)置該選項(xiàng)以后衔沼,連接會(huì)測(cè)試鏈接的狀態(tài)蝌借,這個(gè)選項(xiàng)用于可能長(zhǎng)時(shí)間沒(méi)有數(shù)據(jù)交流的連接昔瞧。當(dāng)設(shè)置該選項(xiàng)以后,如果在兩小時(shí)內(nèi)沒(méi)有數(shù)據(jù)的通信時(shí)菩佑,TCP會(huì)自動(dòng)發(fā)送一個(gè)活動(dòng)探測(cè)數(shù)據(jù)報(bào)文自晰。
4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF
ChannelOption.SO_SNDBUF參數(shù)對(duì)應(yīng)于套接字選項(xiàng)中的SO_SNDBUF稍坯,ChannelOption.SO_RCVBUF參數(shù)對(duì)應(yīng)于套接字選項(xiàng)中的SO_RCVBUF這兩個(gè)參數(shù)用于操作接收緩沖區(qū)和發(fā)送緩沖區(qū)的大小酬荞,接收緩沖區(qū)用于保存網(wǎng)絡(luò)協(xié)議站內(nèi)收到的數(shù)據(jù),直到應(yīng)用程序讀取成功瞧哟,發(fā)送緩沖區(qū)用于保存發(fā)送數(shù)據(jù)混巧,直到發(fā)送成功。
5勤揩、ChannelOption.SO_LINGER
ChannelOption.SO_LINGER參數(shù)對(duì)應(yīng)于套接字選項(xiàng)中的SO_LINGER,Linux內(nèi)核默認(rèn)的處理方式是當(dāng)用戶調(diào)用close()方法的時(shí)候咧党,函數(shù)返回,在可能的情況下陨亡,盡量發(fā)送數(shù)據(jù)傍衡,不一定保證會(huì)發(fā)生剩余的數(shù)據(jù),造成了數(shù)據(jù)的不確定性负蠕,使用SO_LINGER可以阻塞close()的調(diào)用時(shí)間蛙埂,直到數(shù)據(jù)完全發(fā)送
6、ChannelOption.TCP_NODELAY
ChannelOption.TCP_NODELAY參數(shù)對(duì)應(yīng)于套接字選項(xiàng)中的TCP_NODELAY,該參數(shù)的使用與Nagle算法有關(guān)Nagle算法是將小的數(shù)據(jù)包組裝為更大的幀然后進(jìn)行發(fā)送遮糖,而不是輸入一次發(fā)送一次,因此在數(shù)據(jù)包不足的時(shí)候會(huì)等待其他數(shù)據(jù)的到了箱残,組裝成大的數(shù)據(jù)包進(jìn)行發(fā)送,雖然該方式有效提高網(wǎng)絡(luò)的有效負(fù)載止吁,但是卻造成了延時(shí)被辑,而該參數(shù)的作用就是禁止使用Nagle算法,使用于小數(shù)據(jù)即時(shí)傳輸敬惦,于TCP_NODELAY相對(duì)應(yīng)的是TCP_CORK盼理,該選項(xiàng)是需要等到發(fā)送的數(shù)據(jù)量最大的時(shí)候,一次性發(fā)送數(shù)據(jù)俄删,適用于文件傳輸宏怔。