自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。原則是主動(dòng)關(guān)閉的一方發(fā)送一個(gè)FIN報(bào)文來(lái)表示終止這個(gè)方向的連接,收到一個(gè)FIN意味著這個(gè)方向不再有數(shù)據(jù)流動(dòng),但另一個(gè)方向仍能繼續(xù)發(fā)送數(shù)據(jù),直到另一個(gè)方向也發(fā)送FIN報(bào)文。

TCP/IP狀態(tài)變遷圖:

TCP/IP狀態(tài)變遷圖:

各狀態(tài)詳細(xì)描述:

CLOSED:表示初始狀態(tài)。對(duì)服務(wù)端和C客戶端雙方都一樣。

LISTEN:表示監(jiān)聽(tīng)狀態(tài)。服務(wù)端調(diào)用了listen函數(shù),可以開(kāi)始accept連接了。

SYN_SENT:表示客戶端已經(jīng)發(fā)送了SYN報(bào)文。當(dāng)客戶端調(diào)用connect函數(shù)發(fā)起連接時(shí),首先發(fā)SYN給服務(wù)端,然后自己進(jìn)入SYN_SENT狀態(tài),并等待服務(wù)端發(fā)送ACK+SYN。

SYN_RCVD:表示服務(wù)端收到客戶端發(fā)送SYN報(bào)文。服務(wù)端收到這個(gè)報(bào)文后,進(jìn)入SYN_RCVD狀態(tài),然后發(fā)送ACK+SYN給客戶端。

ESTABLISHED:表示連接已經(jīng)建立成功了。服務(wù)端發(fā)送完ACK+SYN后進(jìn)入該狀態(tài),客戶端收到ACK后也進(jìn)入該狀態(tài)。

FIN_WAIT_1:表示主動(dòng)關(guān)閉連接。無(wú)論哪方調(diào)用close函數(shù)發(fā)送FIN報(bào)文都會(huì)進(jìn)入這個(gè)這個(gè)狀態(tài)。

FIN_WAIT_2:表示被動(dòng)關(guān)閉方同意關(guān)閉連接。主動(dòng)關(guān)閉連接方收到被動(dòng)關(guān)閉方返回的ACK后,會(huì)進(jìn)入該狀態(tài)。

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

CLOSING:表示雙方同時(shí)關(guān)閉連接。如果雙方幾乎同時(shí)調(diào)用close函數(shù),那么會(huì)出現(xiàn)雙方同時(shí)發(fā)送FIN報(bào)文的情況,就會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都在關(guān)閉連接。

CLOSE_WAIT:表示被動(dòng)關(guān)閉方等待關(guān)閉。當(dāng)收到對(duì)方調(diào)用close函數(shù)發(fā)送的FIN報(bào)文時(shí),回應(yīng)對(duì)方ACK報(bào)文,此時(shí)進(jìn)入CLOSE_WAIT狀態(tài)。

LAST_ACK:表示被動(dòng)關(guān)閉方發(fā)送FIN報(bào)文后,等待對(duì)方的ACK報(bào)文狀態(tài),當(dāng)收到ACK后進(jìn)入CLOSED狀態(tài)。

1. 連接建立

1) Client

當(dāng)Client端調(diào)用socket函數(shù)調(diào)用時(shí),相當(dāng)于Client端產(chǎn)生了一個(gè)處于Closed狀態(tài)的套接字。

Client端又調(diào)用connect函數(shù)調(diào)用,系統(tǒng)為Client隨機(jī)分配一個(gè)端口,連同傳入connect中的參數(shù)(Server的IP和端口),這就形成了一個(gè)連接四元組,connect調(diào)用讓Client端的socket處于SYN_SENT狀態(tài)。

當(dāng)Server返回確認(rèn),并發(fā)送SYN,Client返回確認(rèn)及SYN后,套接字處于ESTABLISHED階段,此時(shí)雙方的連接已經(jīng)可以進(jìn)行讀寫(xiě)操作。

2)Server

當(dāng)Server端調(diào)用socket函數(shù)調(diào)用時(shí),相當(dāng)于Server端產(chǎn)生了一個(gè)處于Closed狀態(tài)的監(jiān)聽(tīng)套接字,Server端調(diào)用bind操作,將監(jiān)聽(tīng)套接字與指定的地址和端口關(guān)聯(lián),然后又調(diào)用listen函數(shù),系統(tǒng)會(huì)為其分配未完成隊(duì)列和完成隊(duì)列,此時(shí)的監(jiān)聽(tīng)套接字可以接受Client的連接,監(jiān)聽(tīng)套接字狀態(tài)處于LISTEN狀態(tài)。

當(dāng)Server端調(diào)用accept操作時(shí),會(huì)從完成隊(duì)列中取出一個(gè)已經(jīng)完成的client連接,同時(shí)在server這端會(huì)產(chǎn)生一個(gè)會(huì)話套接字,用于和client端套接字的通信,這個(gè)會(huì)話套接字的狀態(tài)是ESTABLISH。

2. 連接關(guān)閉

與連接建立分為server/client不同,連接關(guān)閉并沒(méi)有絕對(duì)的server/client之分,連接關(guān)閉分為主動(dòng)關(guān)閉和被動(dòng)關(guān)閉。Server和client都可以擔(dān)任這兩個(gè)角色中的任意一個(gè)。如client可以關(guān)閉它與server的連接,同樣的server一樣也可以關(guān)閉一些長(zhǎng)時(shí)間無(wú)讀寫(xiě)事件發(fā)生的連接。既然這么說(shuō)了,下面就會(huì)分成兩個(gè)部分:client主動(dòng)關(guān)閉,server主動(dòng)關(guān)閉。

Client主動(dòng)關(guān)閉,Server被動(dòng)關(guān)閉:

Client主動(dòng)關(guān)閉,Server被動(dòng)關(guān)閉的情況還是蠻多的,比如說(shuō)短連接中,當(dāng)一次會(huì)話結(jié)束時(shí),client就可以關(guān)閉它與server之間的連接。

我們這邊直接說(shuō)close而非shutdown。

當(dāng)client想要關(guān)閉它與server之間的連接,首先client這邊會(huì)首先調(diào)用close函數(shù),client端會(huì)發(fā)送一個(gè)FIN到server端,client端處于FIN_WAIT1狀態(tài)。當(dāng)server端返回給client ACK后,client處于FIN_WAIT2狀態(tài),server處于CLOSE_WAIT狀態(tài)。

當(dāng)server端檢測(cè)到client端的關(guān)閉操作(read返回為0),server端也需要調(diào)用close操作,server端會(huì)向client端發(fā)送一個(gè)FIN。此時(shí)server的狀態(tài)為L(zhǎng)AST_ACK,當(dāng) client收到來(lái)自server的FIN后,client端的套接字處于TIME_WAIT狀態(tài),它會(huì)向server端再發(fā)送一個(gè)ack確認(rèn),此時(shí)server端收到ack確認(rèn)后,此套接字處于CLOSED狀態(tài)。

Server端主動(dòng)關(guān)閉的流程與Client端關(guān)閉類似,就不再多講,下面還需要關(guān)注的是TIME_WAIT這個(gè)狀態(tài),分別按照client/server兩個(gè)部分講述。

首先說(shuō)一下TCP/IP詳解中描述的關(guān)于TIME_WAIT的描述及其存在的必要性:

主動(dòng)關(guān)閉的socket當(dāng)收到對(duì)端的FIN操作后,該socket就會(huì)處于TIME_WAIT狀態(tài),處于TIME_WAIT狀態(tài)的socket會(huì)存活2MSL(Max Segment Lifetime),

之所以存活這么長(zhǎng)時(shí)間是有理由的:

一方面是可靠的實(shí)現(xiàn)TCP全雙工連接的終止,也就是當(dāng)***的ACK丟失后,被動(dòng)關(guān)閉端會(huì)重發(fā)FIN,因此主動(dòng)關(guān)閉端需要維持狀態(tài)信息,以允許它重新發(fā)送最終的ACK。

另一方面TCP在2MSL等待期間,定義這個(gè)連接(4元組)不能再使用,任何遲到的報(bào)文都會(huì)丟棄。設(shè)想如果沒(méi)有2MSL的限制,恰好新到的連接正好滿足原先的4元組,這時(shí)候連接就可能接收到網(wǎng)絡(luò)上的延遲報(bào)文就可能干擾***建立的連接。重復(fù)的分節(jié)在網(wǎng)絡(luò)中消逝。

#p#3. Server端的監(jiān)聽(tīng)套接字與會(huì)話套接字的不同:

當(dāng)server端的socket調(diào)用bind和listen之后,監(jiān)聽(tīng)套接字的狀態(tài)就會(huì)變?yōu)長(zhǎng)ISTEN狀態(tài),監(jiān)聽(tīng)套接字的工作決定了它只是監(jiān)聽(tīng)連接。

當(dāng)server端調(diào)用accept,相當(dāng)于從套接字的完成隊(duì)列中取出一個(gè)client的連接,此時(shí)可以確定四元組,即:client的IP和port;server的IP和port,雙方各有一個(gè)套接字進(jìn)行交互,這里需要說(shuō)一下server端的socket,我稱server端accept后產(chǎn)生的套接字為會(huì)話套接字,這個(gè)套接字一出生的狀態(tài)就是ESTABLISH。由server端得四元組我們可以看出,一個(gè)server從理論上可以接收的連接數(shù)量取決于文件描述符的個(gè)數(shù)。

4,狀態(tài)為T(mén)IME_WAIT是不是所有執(zhí)行主動(dòng)關(guān)閉的socket都會(huì)進(jìn)入TIME_WAIT狀態(tài)呢?

有沒(méi)有什么情況使主動(dòng)關(guān)閉的socket直接進(jìn)入CLOSED狀態(tài)呢?

主動(dòng)關(guān)閉的一方在發(fā)送***一個(gè) ack 后就會(huì)進(jìn)入 TIME_WAIT 狀態(tài) 停留2MSL(max segment lifetime)時(shí)間,這個(gè)是TCP/IP必不可少的,也就是“解決”不了的。也就是TCP/IP設(shè)計(jì)者本來(lái)是這么設(shè)計(jì)的。

主要有兩個(gè)原因:

1。防止上一次連接中的包,迷路后重新出現(xiàn),影響新連接(經(jīng)過(guò)2MSL,上一次連接中所有的重復(fù)包都會(huì)消失)

2。可靠的關(guān)閉TCP連接。在主動(dòng)關(guān)閉方發(fā)送的***一個(gè) ack(fin) ,有可能丟失,這時(shí)被動(dòng)方會(huì)重新發(fā) fin, 如果這時(shí)主動(dòng)方處于 CLOSED 狀態(tài) ,就會(huì)響應(yīng) rst 而不是 ack。所以 主動(dòng)方要處于 TIME_WAIT 狀態(tài),而不能是 CLOSED 。

特別提示的是:為什么TIME_WAIT狀態(tài)還需要等待2MSL才能回到CLOSED狀態(tài)?或者為什么TCP要引入TIME_WAIT狀態(tài)?

《TCP/IP詳解》中如此解釋:當(dāng)TCP執(zhí)行一個(gè)主動(dòng)關(guān)閉,并發(fā)回***一個(gè)ACK后,該連接必須在TIME_WAIT狀態(tài)停留的時(shí)間為2倍的MSL,這樣可以讓TCP再次發(fā)送***的ACK以防止這個(gè)ACK丟失(另一端超時(shí)重發(fā)***的FIN)。

附注:MSL(Maximum Segment Lifetime)即***生存時(shí)間,RFC 793中指出MSL為2分鐘,但是實(shí)現(xiàn)中的常用值為30秒、1分鐘或者2分鐘。

建立TCP連接(三次握手)

由于TCP協(xié)議提供可靠的連接服務(wù),于是采用有保障的三次握手方式來(lái)創(chuàng)建一個(gè)TCP連接。三次握手的具體過(guò)程如下:

客戶端發(fā)送一個(gè)帶SYN標(biāo)志的TCP報(bào)文(報(bào)文1)到服務(wù)器端,表示希望建立一個(gè)TCP連接。

服務(wù)器發(fā)送一個(gè)帶ACK標(biāo)志和SYN標(biāo)志的TCP報(bào)文(報(bào)文2)給客戶端,ACK用于對(duì)報(bào)文1的回應(yīng),SYN用于詢問(wèn)客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)傳輸。

客戶端發(fā)送一個(gè)帶ACK標(biāo)志的TCP報(bào)文(報(bào)文3),作為報(bào)文2的回應(yīng)。

至此,一個(gè)TCP連接就建立起來(lái)了。

終止TCP連接(四次揮手)

由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。原則是主動(dòng)關(guān)閉的一方(如已傳輸完所有數(shù)據(jù)等原因)發(fā)送一個(gè)FIN報(bào)文來(lái)表示終止這個(gè)方向的連接,收到一個(gè)FIN意味著這個(gè)方向不再有數(shù)據(jù)流動(dòng),但另一個(gè)方向仍能繼續(xù)發(fā)送數(shù)據(jù),直到另一個(gè)方向也發(fā)送FIN報(bào)文。

四次揮手的具體過(guò)程如下:

客戶端發(fā)送一個(gè)FIN報(bào)文(報(bào)文4)給服務(wù)器,表示我將關(guān)閉客戶端到服務(wù)器端這個(gè)方向的連接。

服務(wù)器收到報(bào)文4后,發(fā)送一個(gè)ACK報(bào)文(報(bào)文5)給客戶端,序號(hào)為報(bào)文4的序號(hào)加1。

服務(wù)器發(fā)送一個(gè)FIN報(bào)文(報(bào)文6)給客戶端,表示自己也將關(guān)閉服務(wù)器端到客戶端這個(gè)方向的連接。

客戶端收到報(bào)文6后,發(fā)回一個(gè)ACK報(bào)文(報(bào)文7)給服務(wù)器,序號(hào)為報(bào)文6的序號(hào)加1。

至此,一個(gè)TCP連接就關(guān)閉了。(4次揮手不是關(guān)閉TCP連接的唯一辦法,見(jiàn)下文Q3疑問(wèn))

TCP三次握手,四次揮手的時(shí)序圖:

TCP三次握手,四次揮手的時(shí)序圖:

TCP相關(guān)疑問(wèn)

幾個(gè)常見(jiàn)的TCP/IP相關(guān)的疑問(wèn):

Q1 為什么在TCP協(xié)議里,建立連接是三次握手,而關(guān)閉連接卻是四次握手呢?

A1因?yàn)楫?dāng)處于LISTEN 狀態(tài)的服務(wù)器端SOCKET當(dāng)收到SYN報(bào)文(客戶端希望新建一個(gè)TCP連接)后,它可以把ACK(應(yīng)答作用)和SYN(同步作用)放在同一個(gè)報(bào)文里來(lái)發(fā)送給客戶端。但在關(guān)閉TCP連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文時(shí),對(duì)方僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了,但未必你的所有數(shù)據(jù)都已經(jīng)全部發(fā)送給了對(duì)方,所以你大可不必馬上關(guān)閉SOCKET(發(fā)送一個(gè)FIN報(bào)文),等你發(fā)送完剩余的數(shù)據(jù)給對(duì)方之后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示你同意現(xiàn)在關(guān)閉連接了,所以通常情況下,這里的ACK報(bào)文和FIN報(bào)文都是分開(kāi)發(fā)送的。

Q2為什么TIME_WAIT 狀態(tài)還需要等2*MSL秒之后才能返回到CLOSED 狀態(tài)呢?

A2因?yàn)殡m然雙方都同意關(guān)閉連接了,而且握手的4個(gè)報(bào)文也都發(fā)送完畢,按理可以直接回到CLOSED 狀態(tài)(就好比從SYN_SENT 狀態(tài)到ESTABLISH 狀態(tài)那樣),但是我們必須假想網(wǎng)絡(luò)是不可靠的,你無(wú)法保證你(客戶端)***發(fā)送的ACK報(bào)文一定會(huì)被對(duì)方收到,就是說(shuō)對(duì)方處于LAST_ACK 狀態(tài)下的SOCKET可能會(huì)因?yàn)槌瑫r(shí)未收到ACK報(bào)文,而重發(fā)FIN報(bào)文,所以這個(gè)TIME_WAIT 狀態(tài)的作用就是用來(lái)重發(fā)可能丟失的ACK報(bào)文。

Q3關(guān)閉TCP連接一定需要4次揮手嗎?

A3不一定,4次揮手關(guān)閉TCP連接是最安全的做法。但在有些時(shí)候,我們不喜歡TIME_WAIT 狀態(tài)(如當(dāng)MSL數(shù)值設(shè)置過(guò)大導(dǎo)致服務(wù)器端有太多TIME_WAIT狀態(tài)的TCP連接,減少這些條目數(shù)可以更快地關(guān)閉連接,為新連接釋放更多資源),這時(shí)我們可以通過(guò)設(shè)置SOCKET變量的SO_LINGER標(biāo)志來(lái)避免SOCKET在close()之后進(jìn)入TIME_WAIT狀態(tài),這時(shí)將通過(guò)發(fā)送RST強(qiáng)制終止TCP連接(取代正常的TCP四次握手的終止方式)。但這并不是一個(gè)很好的主意,TIME_WAIT 對(duì)于我們來(lái)說(shuō)往往是有利的。

責(zé)任編輯:林琳 來(lái)源: ChinaUnix博客
相關(guān)推薦

2023-10-24 15:22:09

TCPUDP

2024-01-12 08:23:11

TCPACK服務(wù)器

2015-10-13 09:42:52

TCP網(wǎng)絡(luò)協(xié)議

2015-11-09 09:58:56

2020-06-29 14:50:47

TCP狀態(tài)ACK

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協(xié)議

2019-06-12 11:26:37

TCP三次握手四次揮手

2020-02-17 10:10:43

TCP三次握手四次揮手

2017-09-25 21:27:07

TCP協(xié)議數(shù)據(jù)鏈

2019-02-01 09:38:16

2021-07-03 17:47:25

TCP控制協(xié)議

2023-10-28 09:07:57

TCP面試三次握手

2021-05-28 09:08:20

TCP連接序列號(hào)

2023-11-01 08:04:08

WiresharkTCP協(xié)議

2018-08-10 09:23:19

TCP考點(diǎn)數(shù)據(jù)

2022-11-17 10:20:49

TCP三次握手四次揮手

2021-08-04 08:01:28

Linux 三次握手Linux 系統(tǒng)

2023-10-17 15:44:19

TCP四次揮手

2019-12-13 07:31:04

TCP三次握手四次揮手
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)