第四十六天:TCP/IP三次握手四次揮手

小Q:這一周一直在北京轉(zhuǎn)著投簡歷面試了,好久沒來了;趕上周六,回來整裝休息,復(fù)習復(fù)習;

創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)榕城,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

--------------------------------------------------------------------------------------

這篇文章太好了,有時間的一定要看看,對TCP/IP可以有個深入的詳細了解
http://www.cnblogs.com/fengzanfeng/articles/1339347.html

關(guān)于TCP/IP協(xié)議的建立和斷開有三次握手和四次揮手的說法,下面來簡單明了說說.......

第四十六天:TCP/IP三次握手四次揮手

關(guān)于狀態(tài)位的簡單詳解:

SYN(synchronous)是TCP/IP建立連接時使用的握手信號。

ACK(Acknowledgement)確認字符,表示發(fā)來的數(shù)據(jù)已確認接收無誤。

CLOSED: 這個沒什么好說的了,表示初始關(guān)閉狀態(tài)。

LISTEN: 表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài),可以接受連接了。

SYN_RCVD: 這個狀態(tài)表示接受到了SYN報文。

SYN_SENT: 這個狀態(tài)與SYN_RCVD遙想呼應(yīng),表示客戶端已發(fā)送SYN報文。

ESTABLISHED:這個容易理解了,表示連接已經(jīng)建立了。

FIN_WAIT_1/2: 這個狀態(tài)要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對方的FIN報文;(FIN_WAIT_1狀態(tài)實際上是當SOCKET在ESTABLISHED狀態(tài)時,它想主動關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態(tài)。而當對方回應(yīng)ACK報文后,則進入FIN_WAIT_2狀態(tài),當然在實際的正常情況下,無論對方何種情況下,都應(yīng)該馬上回應(yīng)ACK報文)所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時常??梢杂胣etstat看到

CLOSING: 狀態(tài)比較特殊,實際情況中很少見;表示你發(fā)送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文;細想一下:那就是如果雙方幾乎在同時close一個SOCKET的話,那么就出現(xiàn)了雙方同時發(fā)送FIN報文的情況,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。

CLOSE_WAIT: 這種狀態(tài)的含義其實是表示在等待關(guān)閉;

LAST_ACK: 是被動關(guān)閉一方在發(fā)送FIN報文后,最后等待對方的ACK報文。當收到ACK報文后,也即可以進入到CLOSED可用狀態(tài)了。

TIME_WAIT: 表示收到了對方的FIN報文,并發(fā)送出了ACK報文,就等2MSL后回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,收到了對方同時帶FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)。

三次握手:

第四十六天:TCP/IP三次握手四次揮手

首先Client端發(fā)送連接請求報文,Server段接受連接后回復(fù)ACK報文,并為這次連接分配資源。Client端接收到ACK報文后也向Server段發(fā)生ACK報文,并分配資源,這樣TCP連接就建立了。

四次揮手:

第四十六天:TCP/IP三次握手四次揮手

中斷連接端可以是Client端,也可以是Server端,就是說也可以反向考慮。

假設(shè)Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報文。Server端接到FIN報文后,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續(xù)你等我的消息"。這個時候Client端就進入FIN_WAIT1狀態(tài),繼續(xù)等待Server端的FIN報文。當Server端確定數(shù)據(jù)已發(fā)送完成,則向Client端發(fā)送FIN報文,"告訴Client端,好了,我這邊數(shù)據(jù)發(fā)完了,準備好關(guān)閉連接了"。Client端收到FIN報文后,"就知道可以關(guān)閉連接了,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉,所以發(fā)送ACK后進入TIME_WAIT2狀態(tài),如果Server端沒有收到ACK則可以重傳?!埃琒erver端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,我Client端也可以關(guān)閉連接了。Ok,TCP連接就這樣關(guān)閉了!

-------------------為什么TIME_WAIT狀態(tài)需要等2MSL后才能返回到CLOSED狀態(tài)?----------------

因為雖然雙方都同意關(guān)閉連接了,而且握手的4個報文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到CLOSED狀態(tài);但是因為我們必須要假想網(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的ACK報文會一定被對方收到,因此對方處于LAST_ACK狀態(tài)下的SOCKET可能會因為超時未收到ACK報文,而重發(fā)FIN報文,所以這個TIME_WAIT狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報文。

分享標題:第四十六天:TCP/IP三次握手四次揮手
標題URL:http://bm7419.com/article0/jcscoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、微信公眾號、服務(wù)器托管、小程序開發(fā)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)