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

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

主要部分,四次握手:

斷開(kāi)連接其實(shí)從我的角度看不區(qū)分客戶(hù)端和服務(wù)器端,任何一方都可以調(diào)用close(or closesocket)之類(lèi)
的函數(shù)開(kāi)始主動(dòng)終止一個(gè)連接。這里先暫時(shí)說(shuō)正常情況。當(dāng)調(diào)用close函數(shù)斷開(kāi)一個(gè)連接時(shí),主動(dòng)斷開(kāi)的
一方發(fā)送FIN(finish報(bào)文給對(duì)方。有了之前的經(jīng)驗(yàn),我想你應(yīng)該明白我說(shuō)的FIN報(bào)文時(shí)什么東西。也就是
一個(gè)設(shè)置了FIN標(biāo)志位的報(bào)文段。FIN報(bào)文也可能附加用戶(hù)數(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)門(mén)CP是雙工的,也就是說(shuō),你可以想象一對(duì)TCP連接上有兩條數(shù)據(jù)通路。當(dāng)發(fā)送FIN報(bào)文
時(shí),意思是說(shuō),發(fā)送FIN的一端就不能發(fā)送數(shù)據(jù),也就是關(guān)閉了其中一條數(shù)據(jù)通路。被動(dòng)關(guān)閉的一端發(fā)送
了ACK后,應(yīng)用層通常就會(huì)檢測(cè)到這個(gè)連接即將斷開(kāi),然后被動(dòng)斷開(kāi)的應(yīng)用層調(diào)用close關(guān)閉連接。

我可以告訴你,一旦當(dāng)你調(diào)用close(or closesocket),這一端就會(huì)發(fā)送FIN報(bào)文。也就是說(shuō),現(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í)上還沒(méi)完全關(guān)閉,只是關(guān)閉需要交換的報(bào)文發(fā)送
完畢),四次握手完成。如你所見(jiàn),因?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,以下說(shuō)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)閉?通常,在最簡(jiǎ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è)可以寫(xiě)代碼試試。


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

 

 

 

特別的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)也稱(chēng)為2MSL狀態(tài)。

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

為什么需要2MSL?根據(jù)<TCP/IP詳解>和<The TCP/IP Guide>中的說(shuō)法,有兩個(gè)原因:
其一,保證發(fā)送的ACK會(huì)成功發(fā)送到對(duì)方,如何保證?我覺(jué)得可能是通過(guò)超時(shí)計(jì)時(shí)器發(fā)送。這個(gè)就很難用
代碼演示了。
其二,報(bào)文可能會(huì)被混淆,意思是說(shuō),其他時(shí)候的連接可能會(huì)被當(dāng)作本次的連接。直接引用<The TCP/IP Guide>
的說(shuō)法: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)所帶來(lá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
連接并沒(méi)有斷開(kāi)(完全斷開(kāi)),那么,如果你bind這個(gè)端口,就會(huì)失敗。

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

對(duì)于TIME_WAIT的插曲:

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

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

要解決windows平臺(tái)的這個(gè)問(wèn)題,可以設(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ì)立刻斷開(kāi),TCP不會(huì)將發(fā)送緩沖中未發(fā)送的數(shù)據(jù)發(fā)送,而是立即發(fā)送一個(gè)RST報(bào)文給對(duì)方,這個(gè)時(shí)候TCP連
接就不會(huì)進(jìn)入TIME_WAIT狀態(tài)。

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

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

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


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

<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(17)

隨筆分類(lèi)(138)

隨筆檔案(137)

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

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502271
  • 排名 - 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>
            麻豆精品传媒视频| 久久综合中文字幕| 欧美日韩免费一区二区三区| 亚洲国产日韩在线一区模特| 欧美成人午夜剧场免费观看| 久久综合激情| 亚洲精品国产欧美| 亚洲精品男同| 欧美日韩国产一级片| 亚洲在线观看视频网站| 亚洲欧美激情视频在线观看一区二区三区| 国产精品www994| 久久久久久自在自线| 久久久久看片| 中文av字幕一区| 亚洲欧美一区二区三区在线| 伊人激情综合| 中国女人久久久| 一区二区在线观看av| 亚洲国产日韩一区二区| 国产精品拍天天在线| 欧美jizz19hd性欧美| 欧美日韩国产色视频| 久久精品在线播放| 欧美激情视频在线播放| 欧美一二三区精品| 六月婷婷久久| 欧美一区三区三区高中清蜜桃| 久久手机免费观看| 亚洲一级黄色片| 久久蜜桃资源一区二区老牛| 亚洲视频一区| 久久亚洲精品一区二区| 性色av一区二区三区红粉影视| 久久婷婷麻豆| 欧美一区二区视频网站| 欧美日韩不卡合集视频| 久久久之久亚州精品露出| 欧美老女人xx| 欧美成年人视频网站| 国产精品久久久久永久免费观看| 免费中文字幕日韩欧美| 国产欧美一级| 一区二区电影免费在线观看| 亚洲国产欧美久久| 午夜精品久久久久久久99热浪潮| 日韩视频在线一区| 久久久久这里只有精品| 欧美与黑人午夜性猛交久久久| 欧美激情综合五月色丁香小说| 久久一区二区三区av| 国产精品嫩草影院av蜜臀| 亚洲人成毛片在线播放女女| 今天的高清视频免费播放成人 | 亚洲午夜免费福利视频| 久久精品毛片| 久久久久久久国产| 国产精品永久入口久久久| aa级大片欧美| 一区二区福利| 欧美极品aⅴ影院| 亚洲高清免费| 亚洲日本电影| 欧美电影免费观看| 亚洲高清视频的网址| 亚洲国产欧洲综合997久久| 久久精品国产免费| 久久中文在线| 在线免费不卡视频| 免费成人黄色片| 91久久中文字幕| 中文av一区特黄| 国产精品国产一区二区| 亚洲色图自拍| 久久精品一二三| 在线国产精品播放| 欧美丰满高潮xxxx喷水动漫| 91久久久久久国产精品| 在线一区日本视频| 国产精品福利在线观看| 亚洲欧美日韩成人高清在线一区| 性欧美大战久久久久久久久| 国产一本一道久久香蕉| 久久久久免费| 亚洲乱码国产乱码精品精天堂| 中日韩在线视频| 国产日韩欧美中文| 久久夜色精品国产欧美乱| 亚洲经典视频在线观看| 午夜国产精品视频| 国产在线日韩| 欧美精品日韩综合在线| 亚洲无限乱码一二三四麻| 久久婷婷人人澡人人喊人人爽| 亚洲黄色视屏| 国产精品青草久久| 久久阴道视频| 亚洲特级片在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 91久久精品www人人做人人爽| 欧美日韩一区二区三区四区在线观看 | 99re6热只有精品免费观看| 亚洲砖区区免费| 亚洲成人资源网| 国产精品国产三级国产普通话99| 欧美一区二区三区四区在线 | 99亚洲一区二区| 欧美在线一区二区| 亚洲国产精品成人综合色在线婷婷| 欧美激情二区三区| 欧美在线二区| 亚洲精品自在在线观看| 久久精品一区蜜桃臀影院| av成人免费观看| 狠狠爱综合网| 国产精品毛片a∨一区二区三区|国 | 欧美高清日韩| 久久国产欧美精品| 亚洲特级片在线| 亚洲国产精品成人综合| 国产欧美日韩精品专区| 欧美日韩国产在线一区| 久久久久久久久久久成人| 亚洲天堂视频在线观看| 最新69国产成人精品视频免费| 久久精品视频在线| 亚洲婷婷在线| 99成人免费视频| 亚洲激情欧美激情| 精品粉嫩aⅴ一区二区三区四区| 国产精品毛片| 欧美视频在线观看免费| 欧美极品在线播放| 欧美成人亚洲成人| 老牛嫩草一区二区三区日本| 欧美一区二区三区的| 亚洲一级免费视频| 一区二区三区精品久久久| 亚洲精品国精品久久99热| 亚洲成人中文| 亚洲电影下载| 亚洲经典三级| 亚洲精品午夜精品| 最新亚洲激情| 日韩亚洲综合在线| 日韩视频一区二区三区在线播放免费观看| 亚洲第一福利社区| 亚洲国产精品va在线看黑人| 欧美激情一区二区三区成人| 欧美风情在线观看| 亚洲高清一区二区三区| 亚洲第一搞黄网站| 亚洲精品韩国| 亚洲一区二区三区777| 亚洲一级一区| 欧美在线观看天堂一区二区三区 | 欧美激情小视频| 亚洲人成小说网站色在线| 91久久国产综合久久| 亚洲精品一二三| 亚洲视频999| 久久国产精品久久久| 美女91精品| 欧美色另类天堂2015| 国产日产亚洲精品| 亚洲国产高清一区二区三区| 亚洲美女电影在线| 欧美亚洲自偷自偷| 麻豆亚洲精品| 妖精成人www高清在线观看| 亚洲午夜影视影院在线观看| 久久成人免费日本黄色| 欧美成年视频| 国产精品一区二区男女羞羞无遮挡| 国模 一区 二区 三区| 亚洲片在线观看| 亚洲欧美日韩精品久久亚洲区| 久久五月天婷婷| 亚洲日本va午夜在线影院| 亚洲欧美日韩精品久久奇米色影视| 久久九九全国免费精品观看| 欧美日韩网站| 亚洲国产精品久久久久秋霞影院| av不卡在线观看| 久久一日本道色综合久久| 亚洲欧洲一二三| 久久大综合网| 欧美午夜精品久久久久久浪潮| 国内自拍亚洲| 亚洲欧美日韩久久精品| 麻豆精品精品国产自在97香蕉| 亚洲精品一区二区三区不| 欧美一区日本一区韩国一区| 欧美精品在线极品| 一区二区三区在线视频免费观看| 亚洲欧美国产精品桃花| 欧美黄色aa电影| 欧美一区亚洲| 国产精品vvv| 99视频精品|