一、面向連接的協(xié)議
UDP是一種無連接的協(xié)議,,而TCP則是一種面向連接的協(xié)議,。所謂面向連接的協(xié)議,就是在兩個對等端內(nèi)部網(wǎng)之間直接建立邏輯連接,。 它通過跟蹤數(shù)據(jù)的傳送,,并確認(rèn)和跟蹤序號來確保它成功到達接收方。簡單來說,,TCP傳輸數(shù)據(jù)比UDP安全,。
二、TCP握手
TCP面向連接的傳輸是以兩個主機間的握手開始的,。一個主機發(fā)送到另一個主機之間的握手有以下三個作用: 1,、確保目的主機可用 2、確保目的主機正在偵聽目標(biāo)端口號 3,、通知給目的主機發(fā)出者的序號,,是雙方在傳輸數(shù)據(jù)時可以進行跟蹤。
三,、TCP數(shù)據(jù)包
TCP主機之間通過握手進程互相建立起來一種虛擬連接,。在握手期間,主機之間交換序號,,當(dāng)數(shù)據(jù)從一臺主機發(fā)送到另一臺主機時序號便跟蹤這些數(shù)據(jù),。 TCP把數(shù)據(jù)轉(zhuǎn)換成連續(xù)的字節(jié)流,,但是不能分辨出字節(jié)流的基礎(chǔ)消息和消息邊界。接收到字節(jié)流后,,上層應(yīng)用程序再把字節(jié)流解釋成消息,。 可以這么說:發(fā)送方將數(shù)據(jù)按協(xié)議封裝成TCP數(shù)據(jù)包,接收方也按協(xié)議讀取TCP數(shù)據(jù)包中的數(shù)據(jù),。 TCP數(shù)據(jù)包的最大值為65495字節(jié),。65495 = 總長度 - IP題頭(20字節(jié))- TCP題頭(20字節(jié)) 下圖描述了數(shù)據(jù)是怎么分割的和怎么在數(shù)據(jù)開始部分加上題頭(IP題頭、TCP題頭,、以太網(wǎng)題頭): (根據(jù)協(xié)議層的不同,,封裝在數(shù)據(jù)包中的信息有不同的名稱)
四、TCP建立連接:三次握手
1,、建立連接時,,客戶機向服務(wù)器發(fā)送一個TCP數(shù)據(jù)包,這個數(shù)據(jù)包中不含有任何數(shù)據(jù),,只有客戶機的啟動順序,、使用的目的端口號和TCP數(shù)據(jù)包的 最大分段大小(MSS),,還包含一個同步標(biāo)識——SYN(同步序號,,假設(shè)SYN值為A); 2,、服務(wù)器對自己的啟動序號和最大分段大小進行回復(fù),,即首先確認(rèn)客戶機的SYN:發(fā)送一個ACK數(shù)據(jù)包,ACK數(shù)據(jù)包中的值為(A+1),; 再發(fā)送一個SYN(里面是自己的序列號,,假設(shè)為B),并定義MSS的大小,。然后設(shè)置認(rèn)領(lǐng)位,,承認(rèn)已接收到第一個數(shù)據(jù)包。 3,、客戶機接收到了服務(wù)器的序號和分段大小信息,,就發(fā)送一個ACK(B+1)來確認(rèn)自己已收到,第三個數(shù)據(jù)包用來結(jié)束握手進程,。 (三次握手只是我自己的初步理解,,以后會逐步完善)
五、TCP終止連接:四次斷開
為什么建立連接要三次握手,,而終止連接就要進行四次呢,? 只是因為TCP連接是全雙工的,即數(shù)據(jù)可在兩個方向上同時傳遞,所以關(guān)閉時每個方向上都要單獨關(guān)閉,,這種單方向的關(guān)閉就叫半關(guān)閉,。 4次斷開的基本流程: (1)、當(dāng)主機一完成數(shù)據(jù)傳輸后,,將FIN置為1,,提出停止TCP連接的請求; (2),、主機二收到主機一發(fā)來的FIN后,,關(guān)閉連接,并將ACK置為1,; (3),、主機二反向提出終止連接,將FIN置為1,; (4),、主機一收到消息后,停止連接,,并將ACK置為1,,雙方向的關(guān)閉結(jié)束。
由以上可見,,光是建立連接與終止連接就這么多步驟,,終于知道TCP為什么慢了,?但是正是這樣才提高了數(shù)據(jù)傳輸?shù)目煽啃?。?dāng)然,三次握手和四次斷開也不是我這寥寥數(shù)語能說清楚的,,自己的理解還很淺顯,,以后會繼續(xù)完善。
在TCP/IP協(xié)議中,,TCP協(xié)議提供可靠的連接服務(wù),,采用三次握手建立一個連接,如圖1所示,。
(1)第一次握手:建立連接時,,客戶端A發(fā)送SYN包(SYN=j)到服務(wù)器B,并進入SYN_SEND狀態(tài),,等待服務(wù)器B確認(rèn),。 (2)第二次握手:服務(wù)器B收到SYN包,必須確認(rèn)客戶A的SYN(ACK=j+1),,同時自己也發(fā)送一個SYN包(SYN=k),,即SYN+ACK包,此時服務(wù)器B進入SYN_RECV狀態(tài),。 (3)第三次握手:客戶端A收到服務(wù)器B的SYN+ACK包,,向服務(wù)器B發(fā)送確認(rèn)包ACK(ACK=k+1),,此包發(fā)送完畢,客戶端A和服務(wù)器B進入ESTABLISHED狀態(tài),,完成三次握手,。 完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù),。 由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉,。這個原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接,。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù),。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,,而另一方執(zhí)行被動關(guān)閉。 (1)客戶端A發(fā)送一個FIN,,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送(報文段4),。 (2)服務(wù)器B收到這個FIN,它發(fā)回一個ACK,,確認(rèn)序號為收到的序號加1(報文段5),。和SYN一樣,一個FIN將占用一個序號,。 (3)服務(wù)器B關(guān)閉與客戶端A的連接,,發(fā)送一個FIN給客戶端A(報文段6)。 (4)客戶端A發(fā)回ACK報文確認(rèn),,并將確認(rèn)序號設(shè)置為收到序號加1(報文段7),。 TCP采用四次揮手關(guān)閉連接如圖2所示。 1.為什么建立連接協(xié)議是三次握手,,而關(guān)閉連接卻是四次握手呢? 這是因為服務(wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報文的建連請求后,,它可以把ACK和SYN(ACK起應(yīng)答作用,,而SYN起同步作用)放在一個報文里來發(fā)送。但關(guān)閉連接時,,當(dāng)收到對方的FIN報文通知時,,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,,所以你可以未必會馬上會關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后,,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報文和FIN報文多數(shù)情況下都是分開發(fā)送的。 2.為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài),? 這是因為雖然雙方都同意關(guān)閉連接了,,而且握手的4個報文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到 ESTABLISH狀態(tài)那樣),;但是因為我們必須要假想網(wǎng)絡(luò)是不可靠的,,你無法保證你最后發(fā)送的ACK報文會一定被對方收到,因此對方處于 LAST_ACK狀態(tài)下的SOCKET可能會因為超時未收到ACK報文,,而重發(fā)FIN報文,,所以這個TIME_WAIT狀態(tài)的作用就是用來重發(fā)可能丟失的 ACK報文 |
|