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

aurain
技術文摘
posts - 137,  comments - 268,  trackbacks - 0

主要部分,四次握手:

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

當被動關閉的一方收到FIN報文時,它會發送ACK確認報文(對于ACK這個東西你應該很熟悉了)。這里有個
東西要注意,因為TCP是雙工的,也就是說,你可以想象一對TCP連接上有兩條數據通路。當發送FIN報文
時,意思是說,發送FIN的一端就不能發送數據,也就是關閉了其中一條數據通路。被動關閉的一端發送
了ACK后,應用層通常就會檢測到這個連接即將斷開,然后被動斷開的應用層調用close關閉連接。

我可以告訴你,一旦當你調用close(or closesocket),這一端就會發送FIN報文。也就是說,現在被動
關閉的一端也發送FIN給主動關閉端。有時候,被動關閉端會將ACK和FIN兩個報文合在一起發送。主動
關閉端收到FIN后也發送ACK,然后整個連接關閉(事實上還沒完全關閉,只是關閉需要交換的報文發送
完畢),四次握手完成。如你所見,因為被動關閉端可能會將ACK和FIN合到一起發送,所以這也算不上
嚴格的四次握手---四個報文段。


關于以上的四次握手,我補充下細節:
1. 默認情況下(不改變socket選項),當你調用close( or closesocket,以下說close不再重復)時,如果
發送緩沖中還有數據,TCP會繼續把數據發送完。


2. 發送了FIN只是表示這端不能繼續發送數據(應用層不能再調用send發送),但是還可以接收數據。


3. 應用層如何知道對端關閉?通常,在最簡單的阻塞模型中,當你調用recv時,如果返回0,則表示對端
關閉。在這個時候通常的做法就是也調用close,那么TCP層就發送FIN,繼續完成四次握手。如果你不調用
close,那么對端就會處于FIN_WAIT_2狀態,而本端則會處于CLOSE_WAIT狀態。這個可以寫代碼試試。


4. 在很多時候,TCP連接的斷開都會由TCP層自動進行,例如你CTRL+C終止你的程序,TCP連接依然會正常關
閉,你可以寫代碼試試。

 

 

 

特別的TIME_WAIT狀態:

從以上TCP連接關閉的狀態轉換圖可以看出,主動關閉的一方在發送完對對方FIN報文的確認(ACK)報文后,
會進入TIME_WAIT狀態。TIME_WAIT狀態也稱為2MSL狀態。

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

為什么需要2MSL?根據<TCP/IP詳解>和<The TCP/IP Guide>中的說法,有兩個原因:
其一,保證發送的ACK會成功發送到對方,如何保證?我覺得可能是通過超時計時器發送。這個就很難用
代碼演示了。
其二,報文可能會被混淆,意思是說,其他時候的連接可能會被當作本次的連接。直接引用<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狀態所帶來的影響:

當某個連接的一端處于TIME_WAIT狀態時,該連接將不能再被使用。事實上,對于我們比較有現實意義的
是,這個端口將不能再被使用。某個端口處于TIME_WAIT狀態(其實應該是這個連接)時,這意味著這個TCP
連接并沒有斷開(完全斷開),那么,如果你bind這個端口,就會失敗。

對于服務器而言,如果服務器突然crash掉了,那么它將無法再2MSL內重新啟動,因為bind會失敗。解決這
個問題的一個方法就是設置socket的SO_REUSEADDR選項。這個選項意味著你可以重用一個地址。

對于TIME_WAIT的插曲:

當建立一個TCP連接時,服務器端會繼續用原有端口監聽,同時用這個端口與客戶端通信。而客戶端默認情況
下會使用一個隨機端口與服務器端的監聽端口通信。有時候,為了服務器端的安全性,我們需要對客戶端進行
驗證,即限定某個IP某個特定端口的客戶端。客戶端可以使用bind來使用特定的端口。

對于服務器端,當設置了SO_REUSEADDR選項時,它可以在2MSL內啟動并listen成功。但是對于客戶端,當使
用bind并設置SO_REUSEADDR時,如果在2MSL內啟動,雖然bind會成功,但是在windows平臺上connect會失敗。
而在linux上則不存在這個問題。(我的實驗平臺:winxp, ubuntu7.10)

要解決windows平臺的這個問題,可以設置SO_LINGER選項。SO_LINGER選項決定調用close時,TCP的行為。
SO_LINGER涉及到linger結構體,如果設置結構體中l_onoff為非0,l_linger為0,那么調用close時TCP連接
會立刻斷開,TCP不會將發送緩沖中未發送的數據發送,而是立即發送一個RST報文給對方,這個時候TCP連
接就不會進入TIME_WAIT狀態。

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

斷開連接時的意外:
這個算不上斷開連接時的意外,當TCP連接發生一些物理上的意外情況時,例如網線斷開,linux上的TCP實現
會依然認為該連接有效,而windows則會在一定時間后返回錯誤信息。

這似乎可以通過設置SO_KEEPALIVE選項來解決,不過不知道這個選項是否對于所有平臺都有效。


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

<2013年10月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502447
  • 排名 - 37

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            正在播放亚洲| 另类专区欧美制服同性| 欧美性猛片xxxx免费看久爱| 日韩午夜电影av| 亚洲精品久久久一区二区三区| 欧美aaa级| 国产精品99久久久久久人| 999亚洲国产精| 国产欧美精品| 欧美成人午夜剧场免费观看| 欧美xxx成人| 亚洲欧美激情视频在线观看一区二区三区 | 午夜精品美女自拍福到在线| 国产一区二区三区免费不卡| 欧美h视频在线| 欧美日在线观看| 久久久久久97三级| 欧美精品aa| 久久国产精品久久久| 嫩草伊人久久精品少妇av杨幂| 一本色道久久加勒比88综合| 亚洲欧美国产精品va在线观看| 在线看欧美日韩| 一区二区欧美在线观看| 在线观看欧美日韩国产| 亚洲精选久久| 精品成人在线| 亚洲视频一区二区| 亚洲国产精品久久久久婷婷884| 夜夜狂射影院欧美极品| 在线播放亚洲一区| 亚洲一级在线观看| 亚洲日产国产精品| 久久国产福利| 香港久久久电影| 欧美日韩国产美女| 鲁大师成人一区二区三区| 欧美视频在线观看一区二区| 免费成人黄色片| 国产精品免费网站| 亚洲免费av观看| 亚洲国产精品va在线观看黑人 | 欧美与欧洲交xxxx免费观看 | 欧美综合国产| 亚洲欧美日韩国产综合精品二区| 久久视频国产精品免费视频在线| 亚洲欧美在线另类| 欧美日韩精品免费观看视频| 美日韩精品视频免费看| 国产麻豆一精品一av一免费| 日韩视频精品| 亚洲麻豆国产自偷在线| 久久亚洲综合色| 老鸭窝毛片一区二区三区 | 欧美精品一区二区三| 女女同性精品视频| 韩国亚洲精品| 欧美在线视频免费播放| 久久精品卡一| 国产亚洲日本欧美韩国| 亚洲欧美在线视频观看| 午夜在线视频一区二区区别| 国产精品成人一区二区艾草| 亚洲精品自在在线观看| 一区二区国产在线观看| 欧美日韩三级视频| aa成人免费视频| 亚洲一区二区网站| 国产精品对白刺激久久久| 一区二区日韩精品| 性伦欧美刺激片在线观看| 国产欧美精品日韩区二区麻豆天美 | 亚洲视频你懂的| 国产精品久久久一本精品| 亚洲婷婷免费| 欧美在线啊v| 黄色成人在线网站| 久久视频一区| 亚洲精品专区| 性欧美大战久久久久久久久| 国产乱码精品一区二区三区av| 亚洲一区二区三区777| 久久国产精品99国产精| 在线观看av不卡| 欧美电影电视剧在线观看| 亚洲免费av观看| 久久成人精品| 亚洲国产精品热久久| 欧美日韩国产精品自在自线| 亚洲午夜激情网站| 久久躁狠狠躁夜夜爽| 亚洲欧洲日产国码二区| 欧美性大战久久久久久久| 午夜精品一区二区在线观看| 免费人成精品欧美精品| 中文精品一区二区三区| 国产欧美二区| 欧美国产一区二区在线观看| 亚洲视频播放| 欧美aa国产视频| 亚洲欧美日韩天堂| 亚洲欧洲午夜| 国产一区91| 欧美日韩高清不卡| 久久高清福利视频| 一区二区三区日韩在线观看| 久久免费高清视频| 亚洲一区二区精品视频| 一区精品在线| 国产女人精品视频| 欧美日本韩国一区二区三区| 欧美资源在线观看| 在线亚洲+欧美+日本专区| 美女视频黄免费的久久| 亚洲摸下面视频| 亚洲欧洲一区二区在线播放| 国产日韩三区| 国产精品av久久久久久麻豆网| 久久久久久自在自线| 亚洲一区二区在线视频| 亚洲狠狠丁香婷婷综合久久久| 久久成人精品视频| 亚洲制服av| 一区二区三区免费网站| 亚洲国产成人在线| 一色屋精品视频在线看| 国产精品嫩草影院av蜜臀| 欧美了一区在线观看| 免费不卡欧美自拍视频| 久久久91精品国产一区二区精品| 亚洲一区二区成人在线观看| 亚洲美女诱惑| 亚洲国产精品第一区二区三区| 久久久伊人欧美| 久久久国产午夜精品| 欧美一区日韩一区| 欧美一区高清| 久久av最新网址| 久久爱www| 久久久久久久高潮| 久久成人久久爱| 久久精品最新地址| 久久精品国产在热久久| 久久久久免费观看| 久久亚洲综合| 欧美成人中文字幕| 亚洲国产高清自拍| 亚洲国产视频a| 亚洲乱码国产乱码精品精| 亚洲精品少妇30p| 99在线热播精品免费| 夜夜狂射影院欧美极品| 亚洲图片自拍偷拍| 欧美一二三区精品| 久久久久国产一区二区三区四区| 久久久噜噜噜久久狠狠50岁| 久久国产精品久久w女人spa| 久久夜色精品国产欧美乱极品| 蜜臀91精品一区二区三区| 欧美成人小视频| 国产精品99一区二区| 国产在线精品成人一区二区三区| 黑人一区二区三区四区五区| 亚洲电影av| 一本色道久久综合亚洲91| 亚洲欧美在线网| 免费日韩av| 亚洲美洲欧洲综合国产一区| 亚洲免费在线电影| 久久久精品tv| 欧美日韩一二区| 国产亚洲精久久久久久| 一区精品久久| 亚洲制服av| 免费亚洲视频| 制服丝袜亚洲播放| 久久在精品线影院精品国产| 欧美成年人在线观看| 国产精品高清在线| 亚洲成人自拍视频| 亚洲图片自拍偷拍| 另类天堂av| 亚洲天堂av高清| 欧美成人精品一区二区三区| 国产精品视频福利| 亚洲精品欧美| 久久久国产午夜精品| 亚洲精品少妇网址| 久久色中文字幕| 国产九九精品视频| 一二美女精品欧洲| 免费看精品久久片| 亚洲在线电影| 欧美激情1区| 永久555www成人免费| 校园激情久久| 一区二区日韩伦理片| 欧美国产日韩一区二区| 黄色一区二区在线观看| 午夜视黄欧洲亚洲|