久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TCP三次握手/四次揮手 及 狀態(tài)變遷圖

 蕓夕 2013-07-08
【建立TCP連接】(三次握手)
   由于TCP協(xié)議提供可靠的連接服務(wù),于是采用有保障的三次握手方式來創(chuàng)建一個TCP連接,。三次握手的具體過程如下:
  1. 客戶端發(fā)送一個帶SYN標(biāo)志的TCP報文(報文1)到服務(wù)器端,,表示希望建立一個TCP連接。
  2. 服務(wù)器發(fā)送一個帶ACK標(biāo)志和SYN標(biāo)志的TCP報文(報文2)給客戶端,,ACK用于對報文1的回應(yīng),,SYN用于詢問客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)傳輸。
  3. 客戶端發(fā)送一個帶ACK標(biāo)志的TCP報文(報文3),,作為報文2的回應(yīng),。
   至此,一個TCP連接就建立起來了,。(詳見下圖)


【終止TCP連接】(四次揮手)
   由于TCP連接是全雙工的,,因此每個方向都必須單獨進(jìn)行關(guān)閉。原則是主動關(guān)閉的一方(如已傳輸完所有數(shù)據(jù)等原因)發(fā)送一個FIN報文來表示終止這個方向的連接,,收到一個FIN意味著這個方向不再有數(shù)據(jù)流動,,但另一個方向仍能繼續(xù)發(fā)送數(shù)據(jù),直到另一個方向也發(fā)送FIN報文,。四次揮手的具體過程如下:
  1. 客戶端發(fā)送一個FIN報文(報文4)給服務(wù)器,,表示我將關(guān)閉客戶端到服務(wù)器端這個方向的連接。
  2. 服務(wù)器收到報文4后,發(fā)送一個ACK報文(報文5)給客戶端,,序號為報文4的序號加1,。
  3. 服務(wù)器發(fā)送一個FIN報文(報文6)給客戶端,表示自己也將關(guān)閉服務(wù)器端到客戶端這個方向的連接,。
  4. 客戶端收到報文6后,,發(fā)回一個ACK報文(報文7)給服務(wù)器,序號為報文6的序號加1,。
   至此,,一個TCP連接就關(guān)閉了。(4次揮手不是關(guān)閉TCP連接的唯一辦法,,見下文Q3疑問)


【TCP連接狀態(tài)】
下面是每一個TCP連接在任意時刻可能處于的狀態(tài),,在Linux下可以在netstat命令的最后一列(State列)里看到。
各個狀態(tài)的含義如下:
  • CLOSED :初始狀態(tài),,表示TCP連接是“關(guān)閉著的”或“未打開的”,。
  • LISTEN :表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài),可以接受客戶端的連接,。
  • SYN_RCVD :表示接收到了SYN報文,。在正常情況下,這個狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài),,很短暫,,基本上用netstat很難看到這種狀態(tài),除非故意寫一個監(jiān)測程序,,將三次TCP握手過程中最后一個ACK報文不予發(fā)送,。當(dāng)TCP連接處于此狀態(tài)時,再收到客戶端的ACK報文,,它就會進(jìn)入到ESTABLISHED 狀態(tài),。
  • SYN_SENT :這個狀態(tài)與SYN_RCVD 狀態(tài)相呼應(yīng),當(dāng)客戶端SOCKET執(zhí)行connect()進(jìn)行連接時,,它首先發(fā)送SYN報文,,然后隨即進(jìn)入到SYN_SENT 狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個報文,。SYN_SENT 狀態(tài)表示客戶端已發(fā)送SYN報文,。
  • ESTABLISHED :表示TCP連接已經(jīng)成功建立,。
  • FIN_WAIT_1 :這個狀態(tài)得好好解釋一下,,其實FIN_WAIT_1 和FIN_WAIT_2 兩種狀態(tài)的真正含義都是表示等待對方的FIN報文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時,,它想主動關(guān)閉連接,,向?qū)Ψ桨l(fā)送了FIN報文,此時該SOCKET進(jìn)入到FIN_WAIT_1 狀態(tài),。而當(dāng)對方回應(yīng)ACK報文后,,則進(jìn)入到FIN_WAIT_2 狀態(tài),。當(dāng)然在實際的正常情況下,無論對方處于任何種情況下,,都應(yīng)該馬上回應(yīng)ACK報文,,所以FIN_WAIT_1 狀態(tài)一般是比較難見到的,而FIN_WAIT_2 狀態(tài)有時仍可以用netstat看到,。
  • FIN_WAIT_2 :上面已經(jīng)解釋了這種狀態(tài)的由來,,實際上FIN_WAIT_2狀態(tài)下的SOCKET表示半連接,即有一方調(diào)用close()主動要求關(guān)閉連接,。注意:FIN_WAIT_2 是沒有超時的(不像TIME_WAIT 狀態(tài)),,這種狀態(tài)下如果對方不關(guān)閉(不配合完成4次揮手過程),那這個 FIN_WAIT_2 狀態(tài)將一直保持到系統(tǒng)重啟,,越來越多的FIN_WAIT_2 狀態(tài)會導(dǎo)致內(nèi)核crash,。
  • TIME_WAIT :表示收到了對方的FIN報文,并發(fā)送出了ACK報文,。 TIME_WAIT狀態(tài)下的TCP連接會等待2*MSL(Max Segment Lifetime,,最大分段生存期,指一個TCP報文在Internet上的最長生存時間,。每個具體的TCP協(xié)議實現(xiàn)都必須選擇一個確定的MSL值,,RFC 1122建議是2分鐘,但BSD傳統(tǒng)實現(xiàn)采用了30秒,,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本機的這個值),,然后即可回到CLOSED 可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,,收到了對方同時帶FIN標(biāo)志和ACK標(biāo)志的報文時,,可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài),。
  • CLOSING :這種狀態(tài)在實際情況中應(yīng)該很少見,,屬于一種比較罕見的例外狀態(tài)。正常情況下,,當(dāng)一方發(fā)送FIN報文后,,按理來說是應(yīng)該先收到(或同時收到)對方的ACK報文,再收到對方的FIN報文,。但是CLOSING 狀態(tài)表示一方發(fā)送FIN報文后,,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文,。什么情況下會出現(xiàn)此種情況呢,?那就是當(dāng)雙方幾乎在同時close()一個SOCKET的話,就出現(xiàn)了雙方同時發(fā)送FIN報文的情況,這是就會出現(xiàn)CLOSING 狀態(tài),,表示雙方都正在關(guān)閉SOCKET連接,。
  • CLOSE_WAIT :表示正在等待關(guān)閉。怎么理解呢,?當(dāng)對方close()一個SOCKET后發(fā)送FIN報文給自己,,你的系統(tǒng)毫無疑問地將會回應(yīng)一個ACK報文給對方,此時TCP連接則進(jìn)入到CLOSE_WAIT狀態(tài),。接下來呢,,你需要檢查自己是否還有數(shù)據(jù)要發(fā)送給對方,如果沒有的話,,那你也就可以close()這個SOCKET并發(fā)送FIN報文給對方,,即關(guān)閉自己到對方這個方向的連接。有數(shù)據(jù)的話則看程序的策略,,繼續(xù)發(fā)送或丟棄,。簡單地說,當(dāng)你處于CLOSE_WAIT 狀態(tài)下,,需要完成的事情是等待你去關(guān)閉連接,。
  • LAST_ACK :當(dāng)被動關(guān)閉的一方在發(fā)送FIN報文后,等待對方的ACK報文的時候,,就處于LAST_ACK 狀態(tài),。當(dāng)收到對方的ACK報文后,也就可以進(jìn)入到CLOSED 可用狀態(tài)了,。


【TCP狀態(tài)變遷圖】
   下面是收集自網(wǎng)上的幾張圖片,,展示TCP連接的各種狀態(tài)的變遷可能:
TCP三次握手/四次揮手 及 狀態(tài)變遷圖 - panda - pandalove@126.com的博客
 
TCP三次握手/四次揮手 及 狀態(tài)變遷圖 - panda - pandalove@126.com的博客

TCP三次握手/四次揮手 及 狀態(tài)變遷圖 - panda - pandalove@126.com的博客
 
TCP三次握手/四次揮手 及 狀態(tài)變遷圖 - panda - pandalove@126.com的博客
 

 

【TCP相關(guān)疑問】
   最后整理幾個常見的TCP相關(guān)的疑問:
  • Q1 為什么在TCP協(xié)議里,建立連接是三次握手,,而關(guān)閉連接卻是四次握手呢,?
  • A1 因為當(dāng)處于LISTEN 狀態(tài)的服務(wù)器端SOCKET當(dāng)收到SYN報文(客戶端希望新建一個TCP連接)后,它可以把ACK(應(yīng)答作用)和SYN(同步作用)放在同一個報文里來發(fā)送給客戶端,。但在關(guān)閉TCP連接時,,當(dāng)收到對方的FIN報文時,對方僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了,,但未必你的所有數(shù)據(jù)都已經(jīng)全部發(fā)送給了對方,,所以你大可不必馬上關(guān)閉SOCKET(發(fā)送一個FIN報文),等你發(fā)送完剩余的數(shù)據(jù)給對方之后,,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在關(guān)閉連接了,,所以通常情況下,這里的ACK報文和FIN報文都是分開發(fā)送的,。
  • Q2 為什么TIME_WAIT 狀態(tài)還需要等2*MSL秒之后才能返回到CLOSED 狀態(tài)呢,?
  • A2 因為雖然雙方都同意關(guān)閉連接了,而且握手的4個報文也都發(fā)送完畢,,按理可以直接回到CLOSED 狀態(tài)(就好比從SYN_SENT 狀態(tài)到ESTABLISH 狀態(tài)那樣),,但是我們必須假想網(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報文一定會被對方收到,,就是說對方處于LAST_ACK 狀態(tài)下的SOCKET可能會因為超時未收到ACK報文,,而重發(fā)FIN報文,所以這個TIME_WAIT 狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報文,。
  • Q3 關(guān)閉TCP連接一定需要4次揮手嗎,?
  • A3 不一定,4次揮手關(guān)閉TCP連接是最安全的做法,。但在有些時候,,我們不喜歡TIME_WAIT 狀態(tài)(如當(dāng)MSL數(shù)值設(shè)置過大導(dǎo)致服務(wù)器端有太多TIME_WAIT狀態(tài)的TCP連接,減少這些條目數(shù)可以更快地關(guān)閉連接,,為新連接釋放更多資源),,這時我們可以通過設(shè)置SOCKET變量的SO_LINGER標(biāo)志來避免SOCKET在close()之后進(jìn)入TIME_WAIT狀態(tài),這時將通過發(fā)送RST強制終止TCP連接(取代正常的TCP四次握手的終止方式),。但這并不是一個很好的主意,,TIME_WAIT 對于我們來說往往是有利的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多