青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

aurain
技術(shù)文摘
posts - 137,  comments - 268,  trackbacks - 0

主要部分,四次握手:

斷開連接其實(shí)從我的角度看不區(qū)分客戶端和服務(wù)器端,任何一方都可以調(diào)用close(or closesocket)之類
的函數(shù)開始主動(dòng)終止一個(gè)連接。這里先暫時(shí)說正常情況。當(dāng)調(diào)用close函數(shù)斷開一個(gè)連接時(shí),主動(dòng)斷開的
一方發(fā)送FIN(finish報(bào)文給對(duì)方。有了之前的經(jīng)驗(yàn),我想你應(yīng)該明白我說的FIN報(bào)文時(shí)什么東西。也就是
一個(gè)設(shè)置了FIN標(biāo)志位的報(bào)文段。FIN報(bào)文也可能附加用戶數(shù)據(jù),如果這一方還有數(shù)據(jù)要發(fā)送時(shí),將數(shù)據(jù)附
加到這個(gè)FIN報(bào)文時(shí)完全正常的。之后你會(huì)看到,這種附加報(bào)文還會(huì)有很多,例如ACK報(bào)文。我們所要把握
的原則是,TCP肯定會(huì)力所能及地達(dá)到最大效率,所以你能夠想到的優(yōu)化方法,我想TCP都會(huì)想到。

當(dāng)被動(dòng)關(guān)閉的一方收到FIN報(bào)文時(shí),它會(huì)發(fā)送ACK確認(rèn)報(bào)文(對(duì)于ACK這個(gè)東西你應(yīng)該很熟悉了)。這里有個(gè)
東西要注意,因?yàn)門CP是雙工的,也就是說,你可以想象一對(duì)TCP連接上有兩條數(shù)據(jù)通路。當(dāng)發(fā)送FIN報(bào)文
時(shí),意思是說,發(fā)送FIN的一端就不能發(fā)送數(shù)據(jù),也就是關(guān)閉了其中一條數(shù)據(jù)通路。被動(dòng)關(guān)閉的一端發(fā)送
了ACK后,應(yīng)用層通常就會(huì)檢測到這個(gè)連接即將斷開,然后被動(dòng)斷開的應(yīng)用層調(diào)用close關(guān)閉連接。

我可以告訴你,一旦當(dāng)你調(diào)用close(or closesocket),這一端就會(huì)發(fā)送FIN報(bào)文。也就是說,現(xiàn)在被動(dòng)
關(guān)閉的一端也發(fā)送FIN給主動(dòng)關(guān)閉端。有時(shí)候,被動(dòng)關(guān)閉端會(huì)將ACK和FIN兩個(gè)報(bào)文合在一起發(fā)送。主動(dòng)
關(guān)閉端收到FIN后也發(fā)送ACK,然后整個(gè)連接關(guān)閉(事實(shí)上還沒完全關(guān)閉,只是關(guān)閉需要交換的報(bào)文發(fā)送
完畢),四次握手完成。如你所見,因?yàn)楸粍?dòng)關(guān)閉端可能會(huì)將ACK和FIN合到一起發(fā)送,所以這也算不上
嚴(yán)格的四次握手---四個(gè)報(bào)文段。


關(guān)于以上的四次握手,我補(bǔ)充下細(xì)節(jié):
1. 默認(rèn)情況下(不改變socket選項(xiàng)),當(dāng)你調(diào)用close( or closesocket,以下說close不再重復(fù))時(shí),如果
發(fā)送緩沖中還有數(shù)據(jù),TCP會(huì)繼續(xù)把數(shù)據(jù)發(fā)送完。


2. 發(fā)送了FIN只是表示這端不能繼續(xù)發(fā)送數(shù)據(jù)(應(yīng)用層不能再調(diào)用send發(fā)送),但是還可以接收數(shù)據(jù)。


3. 應(yīng)用層如何知道對(duì)端關(guān)閉?通常,在最簡單的阻塞模型中,當(dāng)你調(diào)用recv時(shí),如果返回0,則表示對(duì)端
關(guān)閉。在這個(gè)時(shí)候通常的做法就是也調(diào)用close,那么TCP層就發(fā)送FIN,繼續(xù)完成四次握手。如果你不調(diào)用
close,那么對(duì)端就會(huì)處于FIN_WAIT_2狀態(tài),而本端則會(huì)處于CLOSE_WAIT狀態(tài)。這個(gè)可以寫代碼試試。


4. 在很多時(shí)候,TCP連接的斷開都會(huì)由TCP層自動(dòng)進(jìn)行,例如你CTRL+C終止你的程序,TCP連接依然會(huì)正常關(guān)
閉,你可以寫代碼試試。

 

 

 

特別的TIME_WAIT狀態(tài):

從以上TCP連接關(guān)閉的狀態(tài)轉(zhuǎn)換圖可以看出,主動(dòng)關(guān)閉的一方在發(fā)送完對(duì)對(duì)方FIN報(bào)文的確認(rèn)(ACK)報(bào)文后,
會(huì)進(jìn)入TIME_WAIT狀態(tài)。TIME_WAIT狀態(tài)也稱為2MSL狀態(tài)。

什么是2MSL?MSL即Maximum Segment Lifetime,也就是報(bào)文最大生存時(shí)間,引用<TCP/IP詳解>中的話:“
它(MSL)是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時(shí)間。”那么,2MSL也就是這個(gè)時(shí)間的2倍。其實(shí)我覺得沒
必要把這個(gè)MSL的確切含義搞明白,你所需要明白的是,當(dāng)TCP連接完成四個(gè)報(bào)文段的交換時(shí),主動(dòng)關(guān)閉的
一方將繼續(xù)等待一定時(shí)間(2-4分鐘),即使兩端的應(yīng)用程序結(jié)束。你可以寫代碼試試,然后用netstat查看下。

為什么需要2MSL?根據(jù)<TCP/IP詳解>和<The TCP/IP Guide>中的說法,有兩個(gè)原因:
其一,保證發(fā)送的ACK會(huì)成功發(fā)送到對(duì)方,如何保證?我覺得可能是通過超時(shí)計(jì)時(shí)器發(fā)送。這個(gè)就很難用
代碼演示了。
其二,報(bào)文可能會(huì)被混淆,意思是說,其他時(shí)候的連接可能會(huì)被當(dāng)作本次的連接。直接引用<The TCP/IP Guide>
的說法:The second is to provide a “buffering period” between the end of this connection 
and any subsequent ones. If not for this period, it is possible that packets from different 
connections could be mixed, creating confusion.

TIME_WAIT狀態(tài)所帶來的影響:

當(dāng)某個(gè)連接的一端處于TIME_WAIT狀態(tài)時(shí),該連接將不能再被使用。事實(shí)上,對(duì)于我們比較有現(xiàn)實(shí)意義的
是,這個(gè)端口將不能再被使用。某個(gè)端口處于TIME_WAIT狀態(tài)(其實(shí)應(yīng)該是這個(gè)連接)時(shí),這意味著這個(gè)TCP
連接并沒有斷開(完全斷開),那么,如果你bind這個(gè)端口,就會(huì)失敗。

對(duì)于服務(wù)器而言,如果服務(wù)器突然crash掉了,那么它將無法再2MSL內(nèi)重新啟動(dòng),因?yàn)閎ind會(huì)失敗。解決這
個(gè)問題的一個(gè)方法就是設(shè)置socket的SO_REUSEADDR選項(xiàng)。這個(gè)選項(xiàng)意味著你可以重用一個(gè)地址。

對(duì)于TIME_WAIT的插曲:

當(dāng)建立一個(gè)TCP連接時(shí),服務(wù)器端會(huì)繼續(xù)用原有端口監(jiān)聽,同時(shí)用這個(gè)端口與客戶端通信。而客戶端默認(rèn)情況
下會(huì)使用一個(gè)隨機(jī)端口與服務(wù)器端的監(jiān)聽端口通信。有時(shí)候,為了服務(wù)器端的安全性,我們需要對(duì)客戶端進(jìn)行
驗(yàn)證,即限定某個(gè)IP某個(gè)特定端口的客戶端。客戶端可以使用bind來使用特定的端口。

對(duì)于服務(wù)器端,當(dāng)設(shè)置了SO_REUSEADDR選項(xiàng)時(shí),它可以在2MSL內(nèi)啟動(dòng)并listen成功。但是對(duì)于客戶端,當(dāng)使
用bind并設(shè)置SO_REUSEADDR時(shí),如果在2MSL內(nèi)啟動(dòng),雖然bind會(huì)成功,但是在windows平臺(tái)上connect會(huì)失敗。
而在linux上則不存在這個(gè)問題。(我的實(shí)驗(yàn)平臺(tái):winxp, ubuntu7.10)

要解決windows平臺(tái)的這個(gè)問題,可以設(shè)置SO_LINGER選項(xiàng)。SO_LINGER選項(xiàng)決定調(diào)用close時(shí),TCP的行為。
SO_LINGER涉及到linger結(jié)構(gòu)體,如果設(shè)置結(jié)構(gòu)體中l(wèi)_onoff為非0,l_linger為0,那么調(diào)用close時(shí)TCP連接
會(huì)立刻斷開,TCP不會(huì)將發(fā)送緩沖中未發(fā)送的數(shù)據(jù)發(fā)送,而是立即發(fā)送一個(gè)RST報(bào)文給對(duì)方,這個(gè)時(shí)候TCP連
接就不會(huì)進(jìn)入TIME_WAIT狀態(tài)。

如你所見,這樣做雖然解決了問題,但是并不安全。通過以上方式設(shè)置SO_LINGER狀態(tài),等同于設(shè)置SO_DONTLINGER
狀態(tài)。

斷開連接時(shí)的意外:
這個(gè)算不上斷開連接時(shí)的意外,當(dāng)TCP連接發(fā)生一些物理上的意外情況時(shí),例如網(wǎng)線斷開,linux上的TCP實(shí)現(xiàn)
會(huì)依然認(rèn)為該連接有效,而windows則會(huì)在一定時(shí)間后返回錯(cuò)誤信息。

這似乎可以通過設(shè)置SO_KEEPALIVE選項(xiàng)來解決,不過不知道這個(gè)選項(xiàng)是否對(duì)于所有平臺(tái)都有效。


posted on 2014-03-13 13:22 閱讀(1885) 評(píng)論(0)  編輯 收藏 引用 所屬分類: socket編程

<2014年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網(wǎng)絡(luò)開發(fā)

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 500846
  • 排名 - 37

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情欧美激情| 欧美色精品在线视频| 久久亚洲视频| 亚洲一区二区三区四区视频| 欧美日韩国产页| 亚洲视频国产视频| 亚洲天堂成人在线观看| 国产精品亚洲аv天堂网 | 国产精品一区在线观看| 亚洲精品中文在线| 一区二区国产精品| 国产精品一区二区在线观看网站| 国产精品r级在线| 午夜天堂精品久久久久 | 1000部精品久久久久久久久| 久热精品在线| 欧美精品成人91久久久久久久| 欧美精品在线极品| 亚洲一区一卡| 久久免费国产| 亚洲系列中文字幕| 久久精品国产欧美激情| 伊人久久亚洲美女图片| 一本久久综合| 激情五月婷婷综合| 99这里只有精品| 国产字幕视频一区二区| 亚洲人成绝费网站色www| 亚洲乱码国产乱码精品精天堂 | 欧美**人妖| 欧美日韩高清在线一区| 久久蜜桃av一区精品变态类天堂| 蜜桃视频一区| 欧美午夜视频在线| 男女视频一区二区| 国产日韩精品在线播放| 国产精品久久久99| 欧美在线观看视频在线| 欧美激情在线免费观看| 久久国产成人| 欧美日韩一区在线播放| 免费成人高清视频| 国产精品伦子伦免费视频| 亚洲电影第1页| 好男人免费精品视频| 亚洲国产高潮在线观看| 国内精品久久国产| 亚洲综合日韩在线| 中文一区字幕| 欧美激情va永久在线播放| 久久久久久精| 欧美日韩成人在线播放| 亚洲美女黄色| 久久精品国产精品| 欧美一区二区性| 欧美性猛片xxxx免费看久爱| 亚洲高清免费在线| 在线观看欧美成人| 欧美专区第一页| 久久精品国产清高在天天线| 欧美午夜激情小视频| 99在线观看免费视频精品观看| 久久精品国产亚洲一区二区三区| 国产日韩欧美黄色| 99国产精品久久久久久久| 99re热这里只有精品免费视频| 亚洲精品久久久一区二区三区| 欧美日本国产在线| 亚洲精品美女在线| 亚洲自拍偷拍麻豆| 亚洲欧美一级二级三级| 国产精品免费观看在线| 正在播放日韩| 久久国产精品99国产| 国产精品久久激情| 亚洲视频网在线直播| 午夜免费在线观看精品视频| 国产精品大片| 羞羞漫画18久久大片| 久久久久久久久久久成人| 国产综合第一页| 麻豆国产精品777777在线| 亚洲国产精品久久久| 一区二区三区免费网站| 国产精品久久久久国产精品日日| 久久全国免费视频| 亚洲第一狼人社区| 欧美日韩成人综合在线一区二区| 欧美一区二区三区日韩| 国产一区二区看久久| 欧美aaa级| 亚洲无亚洲人成网站77777 | 久久黄色级2电影| 老牛影视一区二区三区| 亚洲国产精品一区二区尤物区| 一区二区免费在线视频| 欧美国产日本| 亚洲人成网站999久久久综合| 亚洲视频一区在线观看| 久久精品欧洲| 亚洲第一黄色网| 欧美日韩ab片| 久久久久高清| 亚洲社区在线观看| 欧美18av| 午夜在线观看免费一区| 亚洲精品免费一区二区三区| 国产精品a级| 男同欧美伦乱| 欧美一级电影久久| 夜夜嗨av一区二区三区四区 | 亚洲国产视频a| 国产精品久久久久久久久动漫| 欧美二区在线播放| 亚洲一区免费观看| 亚洲日本成人网| 国产伪娘ts一区| 欧美午夜久久久| 欧美激情亚洲激情| 久久婷婷麻豆| 欧美伊久线香蕉线新在线| 一本综合精品| 一区二区三区黄色| 国产精品色一区二区三区| 麻豆国产va免费精品高清在线| 午夜在线成人av| 亚洲激情综合| 在线观看亚洲视频| 国产一区二区三区久久悠悠色av| 在线性视频日韩欧美| 老司机亚洲精品| 久久久蜜桃精品| 欧美一区二区成人| 亚洲欧美日韩一区二区在线| 亚洲美女毛片| 亚洲开发第一视频在线播放| 在线观看日韩av先锋影音电影院 | 亚洲福利视频一区二区| 国产欧美一区二区精品性| 国产精品mv在线观看| 亚洲欧美久久久| 久久天天躁狠狠躁夜夜爽蜜月| 国产欧美日韩一区二区三区在线| 亚洲国产欧美日韩另类综合| 香蕉免费一区二区三区在线观看| 亚洲香蕉网站| 一本色道久久综合亚洲精品小说| 中文日韩在线| 亚洲激情一区| 在线看欧美视频| 国产亚洲欧美日韩精品| 国产亚洲制服色| 国产欧美视频在线观看| 国产一区二区三区在线观看精品 | 欧美在线观看www| 亚洲在线中文字幕| 日韩视频在线一区二区| 在线视频你懂得一区二区三区| 亚洲欧美在线一区| 亚洲一线二线三线久久久| 亚洲欧美精品在线| 欧美亚洲一区三区| 久久久亚洲综合| 男人的天堂亚洲| 亚洲精选大片| 亚洲欧美中文另类| 亚洲欧美一区二区三区久久 | 久久午夜影视| 一区二区三区导航| 亚洲欧美一区二区精品久久久| 欧美激情一区二区三区高清视频| 亚洲国产日韩在线| 一二三区精品| 亚洲欧美日韩综合| 另类尿喷潮videofree| 欧美激情亚洲| 亚洲一区二区黄| 免费成人黄色av| 欧美日韩中文字幕在线| 狠狠色综合日日| 亚洲精品孕妇| 久久久精品国产免大香伊| 欧美激情一区二区三区| 一区二区日韩免费看| 久久国产夜色精品鲁鲁99| 免费欧美日韩国产三级电影| 国产精品毛片a∨一区二区三区| 欧美一区二区精品久久911| 小处雏高清一区二区三区| 欧美另类变人与禽xxxxx| 国产精品捆绑调教| 日韩视频在线观看| 欧美中文字幕在线| 亚洲毛片网站| 久久综合导航| 亚洲精品久久久一区二区三区| 欧美成人精品在线播放| 亚洲高清不卡在线| 欧美自拍偷拍午夜视频| 久久精品国产免费|