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

TCP連接——愛的傳聲筒

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
TCP通信最重要的特征是:有序和可靠。有序是通過將文本流分段并編號(hào)實(shí)現(xiàn)的??煽渴峭ㄟ^ACK回復(fù)和重復(fù)發(fā)送實(shí)現(xiàn)的。這一篇文章將引入TCP連接的概念。

TCP通信最重要的特征是:有序(ordering)和可靠(reliable)。有序是通過將文本流分段并編號(hào)實(shí)現(xiàn)的??煽渴峭ㄟ^ACK回復(fù)和重復(fù)發(fā)送(retransmission)實(shí)現(xiàn)的。這一篇文章將引入TCP連接(connection)的概念。

TCP連接

網(wǎng)絡(luò)層在邏輯上提供了端口的概念。一個(gè)IP地址可以有多個(gè)端口。一個(gè)具體的端口需要IP地址和端口號(hào)共同確定(我們記為IP:port的形式)。一個(gè)連接為兩個(gè)IP:port之間建立TCP通信。(一個(gè)常用的比喻為:TCP連接就像兩個(gè)人打電話, IP為總機(jī)號(hào)碼,port為分機(jī)號(hào)碼)

 

[[120710]]

 

參與連接的如果是兩臺(tái)電腦,那么兩臺(tái)電腦操作系統(tǒng)的TCP模塊負(fù)責(zé)建立連接。每個(gè)連接有四個(gè)參數(shù)(兩個(gè)IP,兩個(gè)端口),來表明“誰(shuí)在和誰(shuí)通話”。每臺(tái)電腦都會(huì)記錄有這四個(gè)參數(shù),以確定是哪一個(gè)連接。如果這四個(gè)參數(shù)完全相同,則為同一連接;如果這四個(gè)參數(shù)有一個(gè)不同,即為不同的連接。這意味著,同一個(gè)端口上可以有多個(gè)連接。內(nèi)核中的TCP模塊生成連接之后,將連接分配給進(jìn)程使用。 

 

[[120711]]

一個(gè)端口上可以有多個(gè)連接

TCP連接是雙向(duplex)的。在TCP協(xié)議與"流"通信中,我們所展示的TCP傳輸是單向的。雙向連接實(shí)際上就是建立兩個(gè)方向的TCP傳輸,所以概念上并不復(fù)雜。這時(shí),連接的每一方都需要兩個(gè)滑窗,以分別處理發(fā)送的文本流和接收的文本流。由于連接的雙向性,我們也要為兩個(gè)方向的文本流編號(hào)。這兩個(gè)文本流的編號(hào)相互獨(dú)立。為文本流分段和編號(hào)由發(fā)送方來處理,回復(fù)ACK則由接收的一方進(jìn)行。

TCP片段的頭部格式

在深入TCP連接之前,我們需要對(duì)TCP片段的頭部格式有一些了解。我們知道,TCP片段分為頭部和數(shù)據(jù)。數(shù)據(jù)部分為TCP真正傳輸?shù)奈谋玖鲾?shù)據(jù)。下面為TCP片段的頭部格式:

 

 

來自wikipedia

先關(guān)注下面幾點(diǎn):

1. 一個(gè)TCP頭部需要包含出發(fā)端口(source port)和目的地端口(destination port)。這些與IP頭中的兩個(gè)IP地址共同確定了連接。

2. 每個(gè)TCP片段都有序號(hào)(sequence number)。這些序號(hào)最終將數(shù)據(jù)部分的文本片段整理成為文本流。

3. ACK是一位(bit)。只有ACK位設(shè)定的時(shí)候,回復(fù)號(hào)(Acknowledgement number)才有效。ACK回復(fù)號(hào)說明了接收方期待接收的下一個(gè)片段,所以ACK回復(fù)號(hào)為***接收到的片段序號(hào)加1。

很多時(shí)候,ACK回復(fù)“附著”在發(fā)送的數(shù)據(jù)片段中。TCP協(xié)議是雙向的。比如A和B兩個(gè)電腦。ACK回復(fù)是接收方回復(fù)給發(fā)送方 (比如A發(fā)送給B, B回復(fù)A)。但同時(shí),B也可以是發(fā)送方,B有可能有數(shù)據(jù)發(fā)送給A,所以B就把ACK回復(fù)附著在它要發(fā)送給A的數(shù)據(jù)片段的頭部。這樣可以減少ACK所占用的交通流量。一個(gè)片段可以只包含ACK回復(fù)。一個(gè)純粹的ACK回復(fù)片段不傳送文本流,所以不消耗序列號(hào)。如果有下一個(gè)正常的數(shù)據(jù)片段,它的序號(hào)將與純粹ACK回復(fù)片段的序號(hào)相同。

(ACK回復(fù)還可以“附著”在SYN片段和FIN片段)

4. ACK后面還有SYN和FIN,它們也各占據(jù)一位(bit)。我將在后面說明這兩位。

連接的建立

在TCP協(xié)議與"流"通信中討論的TCP傳輸需要一個(gè)前提:TCP連接已經(jīng)建立。然而,TCP連接從無(wú)到有需要一個(gè)建立連接的過程。建立連接的最重要目是讓連接的雙方交換初始序號(hào)(ISN, Initial Sequence Number)。根據(jù)TCP協(xié)議的規(guī)定,文本流的***個(gè)片段的序號(hào)不能是確定的數(shù)字(比如說1)。連接的雙方各自隨機(jī)生成自己的ISN,然后再利用的一定方式讓對(duì)方了解。這樣的規(guī)定是出于TCP連接安全考慮:如果以一個(gè)確定的數(shù)字作為初始的TCP序號(hào),那么其他人很容易猜出接下來的序列號(hào),并按照正確的序號(hào)發(fā)送“偽裝”的TCP片段,以插入到文本流中。#p#

ISN交換是通過SYN片段實(shí)現(xiàn)的。SYN片段由頭部的SYN位表明,它的序號(hào)為發(fā)送方的ISN。該片段由連接的一方首先發(fā)給給另一方,我們將發(fā)送SYN的一方稱為客戶(client),而接收SYN的一方稱為服務(wù)器(server)。我們使用ISN(c)表示client一方的ISN,使用ISN(s)表示server一方的ISN。隨后,接收到SYN的server需要回復(fù)ACK,并發(fā)送出包含有server的ISN的SYN片段。下圖為建立連接的過程,也就是經(jīng)典的TCP三次握手(three-way handshaking)。兩條豎直線分別為client和server的時(shí)間軸。每個(gè)箭頭代表了一次TCP片段的單向傳輸。

 

 

青色為純粹的ACK片段。整個(gè)過程的本質(zhì)是雙方互發(fā)含有自己的ISN的SYN片段。根據(jù)TCP傳輸?shù)囊?guī)則,接收到ISN的一方需要回復(fù)ACK,所以共計(jì)四片信息在建立連接過程中傳輸。之所以是三次握手 (而不是四次),是因?yàn)閟erver將發(fā)送SYN和回復(fù)ACK合并到一個(gè)TCP片段中。我們以client方為例。client知道自己的ISN(也就是ISN(c))。建立連接之后,它也知道了對(duì)方的ISN(s)。此后,如果需要發(fā)送文本流片段,則編號(hào)為ISN(c) + 1, ISN(c) + 2 ...。如果接收文本流片段,則期待接收ISN(s) + 1, ISN(s) + 2 ...。

連接建立之后,連接的雙方就可以按照TCP傳輸?shù)姆绞较嗷グl(fā)送文本流了。

連接的正常終結(jié)

一個(gè)連接建立之后,連接兩端的進(jìn)程可以利用該連接進(jìn)行通信。當(dāng)連接的一方覺得“我講完了”,它可以終結(jié)連接中發(fā)送到對(duì)方方向的通信。連接最終通過四次握手(four-way handshaking)的方式終結(jié),連接終結(jié)使用的是特殊片段FIN(FIN位為1的片段)。

 

 

我們可以看到,連接終結(jié)的過程中,連接雙方也交換了四片信息(兩個(gè)FIN和兩個(gè)ACK)。在終結(jié)連接的過程中,TCP并沒有合并FIN與ACK片段。原因是TCP連接允許單向關(guān)閉(half-close)。也就是說,TCP連接關(guān)閉了一個(gè)方向的傳輸,成為一個(gè)單向連接(half-duplex)。第二個(gè)箭頭和第三個(gè)箭頭傳遞必須分開,才能有空隙在開放的方向上繼續(xù)傳輸。如果第二個(gè)箭頭和第三個(gè)箭頭合并在一起,那么,隨著一方關(guān)閉,另一方也要被迫關(guān)閉。

第二和第三次握手之間,server可以繼續(xù)單向的發(fā)送片段給client,但client不能發(fā)送數(shù)據(jù)片段給server。

(上面的終結(jié)從client先發(fā)起,TCP連接終結(jié)也可以從server先發(fā)起。)

在Client發(fā)送出***的ACK回復(fù),但該ACK可能丟失。Server如果沒有收到ACK,將不斷重復(fù)發(fā)送FIN片段。所以Client不能立即關(guān)閉,它必須確認(rèn)Server接收到了該ACK。Client會(huì)在發(fā)送出ACK之后進(jìn)入到TIME_WAIT狀態(tài)。Client會(huì)設(shè)置一個(gè)計(jì)時(shí)器,等待2MSL的時(shí)間。如果在該時(shí)間內(nèi)再次收到FIN,那么Client會(huì)重發(fā)ACK并再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個(gè)片段在網(wǎng)絡(luò)中***的存活時(shí)間,2MSL就是一個(gè)發(fā)送和一個(gè)回復(fù)所需的***時(shí)間。如果直到2MSL,Client都沒有再次收到FIN,那么Client推斷ACK已經(jīng)被成功接收,則結(jié)束TCP連接。

 

[[120712]]

 

TIME_WAIT State

總結(jié)

TCP是連接導(dǎo)向的協(xié)議,與之對(duì)應(yīng)的是像UDP這樣的非連接導(dǎo)向的協(xié)議。連接能帶來更好的傳輸控制,但也需要更多額外的工作,比如連接的建立和終結(jié)。

我們還初步了解了TCP的頭部格式。應(yīng)該注意到,許多時(shí)候我們將ACK片段“附著”在其他片段上。相對(duì)于純粹的ACK片段,我們這樣做節(jié)約了ACK所需的流量。事實(shí)上,由于ACK片段所需的ACK位和acknowledge number區(qū)域總是存在于TCP的頭部,所以附著ACK片段的成本基本上等于0。

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

2015-04-23 18:46:38

TCPTCP協(xié)議

2010-07-07 10:45:22

TCP UDP協(xié)議

2021-01-13 11:11:29

TCP連接耗時(shí)網(wǎng)絡(luò)協(xié)議

2023-12-01 14:57:22

TCP連接

2014-08-22 09:10:46

2021-10-14 20:33:16

TCP連接關(guān)閉

2015-10-09 13:15:03

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

2019-09-16 09:29:01

TCP全連接隊(duì)列半連接隊(duì)列

2010-06-13 15:37:24

TCP協(xié)議

2021-02-18 22:18:50

TCP 服務(wù)器源碼

2015-03-25 12:09:18

TCP網(wǎng)絡(luò)協(xié)議TCP建立連接

2021-03-17 09:51:31

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

2024-08-30 08:59:15

2019-12-26 09:28:34

TCPPython通信

2019-09-02 10:39:15

TCPWindows連接

2009-08-24 17:20:13

C#網(wǎng)絡(luò)通信TCP連接

2023-03-10 14:50:34

TCP 連接網(wǎng)絡(luò)通信

2021-09-26 06:43:09

TCP連接Go

2022-02-11 17:52:48

TCP網(wǎng)線客戶端
點(diǎn)贊
收藏

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