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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

tcp要點學習-斷開連接

Author : Kevin Lynx

主要部分,四次握手:

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

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

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

在前面的文章中,我一直沒提TCP的狀態(tài)轉(zhuǎn)換。在這里我還是在猶豫是不是該將那張四處通用的圖拿出來,
不過,這里我只給出斷開連接時的狀態(tài)轉(zhuǎn)換圖,摘自<The TCP/IP Guide>:

tcpclose

給出一個正常關(guān)閉時的windump信息:

14:00:38.819856 IP cd-zhangmin.1748 > 220.181.37.55.80: F 1:1(0) ack 1 win 65535
14:00:38.863989 IP 220.181.37.55.80 > cd-zhangmin.1748: F 1:1(0) ack 2 win 2920
14:00:38.864412 IP cd-zhangmin.1748 > 220.181.37.55.80: . ack 2 win 65535 

 

補充細節(jié):

關(guān)于以上的四次握手,我補充下細節(jié):
1. 默認情況下(不改變socket選項),當你調(diào)用close( or closesocket,以下說close不再重復)時,如果
發(fā)送緩沖中還有數(shù)據(jù),TCP會繼續(xù)把數(shù)據(jù)發(fā)送完。
2. 發(fā)送了FIN只是表示這端不能繼續(xù)發(fā)送數(shù)據(jù)(應用層不能再調(diào)用send發(fā)送),但是還可以接收數(shù)據(jù)。
3. 應用層如何知道對端關(guān)閉?通常,在最簡單的阻塞模型中,當你調(diào)用recv時,如果返回0,則表示對端
關(guān)閉。在這個時候通常的做法就是也調(diào)用close,那么TCP層就發(fā)送FIN,繼續(xù)完成四次握手。如果你不調(diào)用
close,那么對端就會處于FIN_WAIT_2狀態(tài),而本端則會處于CLOSE_WAIT狀態(tài)。這個可以寫代碼試試。
4. 在很多時候,TCP連接的斷開都會由TCP層自動進行,例如你CTRL+C終止你的程序,TCP連接依然會正常關(guān)
閉,你可以寫代碼試試。

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

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

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

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

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

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

對于TIME_WAIT的插曲:

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

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

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

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

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

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

總結(jié):

個人感覺,越寫越爛。接下來會講到TCP的數(shù)據(jù)發(fā)送,這會涉及到滑動窗口各種定時器之類的東西。我真誠
希望各位能夠多提意見。對于TCP連接的斷開,我們只要清楚:
1. 在默認情況下,調(diào)用close時TCP會繼續(xù)將數(shù)據(jù)發(fā)送完畢;
2. TIME_WAIT狀態(tài)會導致的問題;
3. 連接意外斷開時可能會出現(xiàn)的問題。
4. maybe more...

posted on 2008-05-14 15:46 Kevin Lynx 閱讀(5246) 評論(2)  編輯 收藏 引用 所屬分類: game developnetwork

評論

# re: tcp要點學習-斷開連接 2008-05-15 16:27 買書網(wǎng)

還可以了,只是不太好懂。  回復  更多評論   

# re: tcp要點學習-斷開連接 2009-06-28 20:50 周金雨

謝謝博主,因為你的這篇文章,解決了我進一周一直考慮而為解決的編程問題,
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            玉米视频成人免费看| 国产精品家庭影院| 亚洲国产女人aaa毛片在线| 亚洲国产老妈| 国内外成人免费激情在线视频| 欧美女激情福利| 午夜免费在线观看精品视频| 亚洲第一网站免费视频| 亚洲日本aⅴ片在线观看香蕉| 欧美电影打屁股sp| 欧美成人亚洲成人| 欧美91大片| 欧美成人一品| 亚洲欧洲三级电影| 亚洲电影有码| 一本色道久久综合| 亚洲天堂男人| 一本久道久久综合中文字幕| 亚洲国产欧洲综合997久久| 午夜在线精品偷拍| 亚洲自拍电影| 国产精品久久久久毛片大屁完整版 | 亚洲国产精品999| 美女久久一区| 久久久久久久久久久久久9999| 一本久久知道综合久久| 亚洲第一主播视频| 欧美成人激情视频免费观看| 国产精品香蕉在线观看| 亚洲第一毛片| 亚洲私人黄色宅男| 浪潮色综合久久天堂| 亚洲国产日韩综合一区| 这里只有精品视频| 久久www成人_看片免费不卡| 久久久夜精品| 欧美日韩国产系列| 亚洲国产精品久久久久秋霞影院 | 亚洲电影在线| 欧美日产一区二区三区在线观看 | 亚洲欧美精品| 你懂的国产精品| 国产精品乱看| 99精品国产在热久久婷婷| 亚洲第一福利社区| 亚洲国产精品ⅴa在线观看| 久久久免费av| 91久久国产综合久久蜜月精品 | 免费一级欧美片在线播放| 国产日韩欧美综合精品| 午夜精品视频在线观看一区二区 | 欧美日韩成人在线播放| 亚洲国内欧美| 美女视频黄免费的久久| 亚洲天堂免费观看| 亚洲国产乱码最新视频 | 激情成人综合网| 欧美一区影院| 欧美激情精品久久久久久| 亚洲免费精彩视频| 亚洲视频1区2区| 国产区在线观看成人精品| 午夜精品理论片| 亚洲无限av看| 欧美日韩国产首页在线观看| 奶水喷射视频一区| 欧美精品导航| 久久影院亚洲| 亚洲免费在线精品一区| 久久久精品国产一区二区三区 | 香蕉久久夜色精品国产| 久久精品动漫| 亚洲永久精品大片| 中日韩男男gay无套| aa国产精品| 欧美专区在线观看| 国产精品久久77777| 91久久精品国产91久久| 国产一区二区三区观看| 蜜桃av综合| 国产日本欧美在线观看| 亚洲电影免费| 亚洲免费成人| 欧美激情小视频| 欧美国产大片| 国产精品永久免费在线| 亚洲青色在线| 一本色道久久综合亚洲二区三区 | 久久国产精品久久国产精品 | 在线亚洲美日韩| 欧美日韩一区二区免费视频| 快播亚洲色图| 国产精品久久久久久久久久ktv| 久久国产精品99久久久久久老狼| 亚洲制服欧美中文字幕中文字幕| 欧美精品电影| 亚洲一区二区三区四区中文| 日韩一区二区精品| 久久国产视频网站| 欧美成人嫩草网站| 伊人久久大香线蕉av超碰演员| 亚洲综合精品四区| 久久婷婷av| 亚洲国产91| 在线看片欧美| 国内成人在线| 欧美偷拍一区二区| 日韩视频三区| 国产精品视频免费在线观看| 亚洲综合精品一区二区| 欧美一区二区三区在线观看视频| 国产在线视频欧美| 国产一区二区三区免费观看| 另类图片国产| 99精品国产福利在线观看免费| 亚洲欧美日本伦理| 国产精品一区视频网站| 欧美成人中文字幕| 国产精品美女www爽爽爽| 欧美日本一区二区视频在线观看 | 亚洲国产aⅴ天堂久久| 激情av一区二区| 国产精品一级| 国产欧美日韩视频一区二区三区 | 国产欧美一区视频| 欧美国产日本在线| 久久综合99re88久久爱| 99精品免费| 亚洲精品网址在线观看| 久久久久久久久久久成人| 亚洲伦理精品| 久久久久www| 久久影音先锋| 欧美高清成人| 国产精品你懂的在线欣赏| 久久在线免费观看| 欧美一区二区女人| 免费在线日韩av| 夜夜嗨av一区二区三区中文字幕| 亚洲视频欧洲视频| 久久久蜜臀国产一区二区| 欧美日韩视频一区二区| 精品动漫3d一区二区三区免费| 久久精品二区| 欧美日韩高清在线一区| 在线高清一区| 久久久久久久久久久一区| 欧美激情精品久久久六区热门| 日韩亚洲欧美一区| 久久久久这里只有精品| 国产精品日韩精品欧美在线| 亚洲高清色综合| 免费亚洲电影| 久久久久久色| 在线观看一区二区精品视频| 性亚洲最疯狂xxxx高清| 99在线精品视频| 欧美亚州一区二区三区 | 久久综合五月| 欧美特黄a级高清免费大片a级| 亚洲日本理论电影| 亚洲欧洲在线一区| 欧美a级一区| 亚洲精品精选| 亚洲精品一二三| 国产精品毛片a∨一区二区三区|国| 99成人免费视频| 中文精品在线| 狠狠色狠狠色综合人人| 欧美成ee人免费视频| 免费观看国产成人| 亚洲综合二区| 欧美黄色成人网| 亚洲承认在线| 久久久精品视频成人| 久久久久一区二区| 在线成人中文字幕| 久久不射电影网| 另类激情亚洲| 亚洲精品乱码久久久久久蜜桃91| 久久在线播放| 99riav久久精品riav| 亚洲综合精品四区| 国产日韩欧美在线播放| 久久国产精品99精品国产| 欧美成人精精品一区二区频| 最新精品在线| 亚洲三级影院| 亚洲高清久久久| 亚洲在线观看| 亚洲视屏一区| 欧美日韩在线看| 亚洲精品一区在线观看| 日韩视频免费观看高清在线视频| 亚洲色图在线视频| 亚洲欧美一区二区在线观看| 欧美日韩精品一区二区在线播放| 欧美成人激情视频| 夜夜嗨av一区二区三区中文字幕| 欧美丰满少妇xxxbbb|