|
TCP協(xié)議到處都在使用。理解TCP協(xié)議的工作原理能夠幫助管理員正確診斷網(wǎng)絡(luò)通信的故障。 TCP協(xié)議很復(fù)雜。不過不用擔(dān)心。我們不是讓你去閱讀RFC 793。本文只是一篇啟蒙講座。在本次講座中,我們將僅僅介紹為了讓你理解下一篇關(guān)于TCP協(xié)議的講座所需的知識。經(jīng)過本文的學(xué)習(xí)你會了解一些TCP相關(guān)的術(shù)語,理解TCP包頭的各組成部分,然后,我們將在后面一篇文章中重點講解TCP協(xié)議常見的一些問題,包括TCP窗口可伸縮性問題、阻塞和TCP連接機制等問題。 我們有時候聽到人們提到“TCP/IP協(xié)議棧”。這意味著他們在談?wù)?至4層和7層的問題,TCP協(xié)議位于第四層。其代表的含義是傳輸控制協(xié)議(Transmission Control Protocol)。還記得IP協(xié)議那篇文章中的協(xié)議頭的構(gòu)成嗎?當(dāng)一個數(shù)據(jù)包被封裝之后,第三層當(dāng)然有個IP協(xié)議頭,緊接著就是這個TCP協(xié)議頭。TCP協(xié)議頭成為了IP協(xié)議頭中的“數(shù)據(jù)”。就像其它協(xié)議都有自己的術(shù)語一樣,TCP協(xié)議也有自己的專門術(shù)語,如以太網(wǎng)幀、IP數(shù)據(jù)報和現(xiàn)在的TCP段等。你可以把它們都當(dāng)作數(shù)據(jù)包。但是,當(dāng)它們之間在進(jìn)行通訊的時候,一定要使用正確的術(shù)語。 TCP協(xié)議是一種端對端的協(xié)議。使用TCP沒有任何廣播或類似的概念。要用TCP協(xié)議與另一臺計算機通信,兩臺機之間必須像打電話一樣連接在一起,每一端都都為通話做好準(zhǔn)備。“流傳輸”(Stream delivery)是談到TCP時的另一個常用詞語。這個短語的含義是TCP協(xié)議主要用來處理數(shù)據(jù)流,可以正確處理亂序的數(shù)據(jù)包。TCP協(xié)議甚至還允許存在丟失的或者損壞的數(shù)據(jù)包,最終它可以再次得到這些數(shù)據(jù)包。你很可能聽一位程序員在談?wù)?#8220;流”的概念。他指的是這樣一個事實:數(shù)據(jù)到底是在什么時候發(fā)送的是很難說清楚的,你也可以在TCP流中發(fā)送非結(jié)構(gòu)化數(shù)據(jù)。TCP協(xié)議以它自己的方式緩存數(shù)據(jù)。不過,其緩存過程對程序員和用戶是透明的。 TCP協(xié)議每發(fā)送一個數(shù)據(jù)包將會收到一個確認(rèn)信息。這種發(fā)送/應(yīng)答模式是提供可靠的協(xié)議的唯一方法:你必須讓對方知道你否收到了數(shù)據(jù)。當(dāng)然,這也會造成一些性能損失,而人們需要改善系統(tǒng)效率不高的狀況。所以引入了“捎帶確認(rèn)(piggybacking ACKs)”的方法。TCP協(xié)議之所以是全雙工的就是因為這個“捎帶確認(rèn)”信息,因為它允許雙方同時發(fā)送數(shù)據(jù)。這是通過在當(dāng)前的數(shù)據(jù)包中攜帶以前收到的數(shù)據(jù)的確認(rèn)信息方式實現(xiàn)的。從提高網(wǎng)絡(luò)利用率的角度看,這比單純發(fā)送一個通知對方“信息已收到”的數(shù)據(jù)包要好得多。最后,還有一個批量確認(rèn)的概念:也即一次確認(rèn)一個以上的數(shù)據(jù)包,表示“我收到了包括這個數(shù)據(jù)包在內(nèi)的全部數(shù)據(jù)包”。 在IP協(xié)議中,我們處理的單個數(shù)據(jù)包是一個更大的數(shù)據(jù)報的一部分。請記住,一個TCP段就是一個單個的TCP數(shù)據(jù)包。TCP是一個數(shù)據(jù)流,因此,除了“連接”之外,沒有任何需要真正擔(dān)心的其它概念。最大報文段長度(MSS)是在連接的時候協(xié)商的,但是,它總是在不斷地改變。默認(rèn)的最大報文段長度是536字節(jié),這是576字節(jié)(IP協(xié)議保證的最小數(shù)據(jù)包長度)減去用于IP頭的20個字節(jié)和用于TCP頭的20個字節(jié)以后的長度。TCP協(xié)議要設(shè)法避免在IP級別上的分段。因此,TCP協(xié)議總是從536字節(jié)開始的。 TCP協(xié)議最有魅力的功能仍然保留著。這就是滑動窗口協(xié)議。這個窗口實際上是已經(jīng)發(fā)出的“沒有簽收確認(rèn)的”數(shù)據(jù)總數(shù)。這個窗口可以根據(jù)意愿放大和縮小。這是很有趣的。下一講將介紹這方面的內(nèi)容。 一個TCP數(shù)據(jù)包的頭是20個字節(jié),就像一個IP數(shù)據(jù)包一樣。如果使用一些選項,IP和TCP數(shù)據(jù)包頭都可以放大。TCP頭不包含IP地址,它僅需要知道要連接哪一個端口。不過,你不要被這弄暈了。TCP工作時要一直跟蹤狀態(tài)表中的端對端的連接。這個狀態(tài)表包含IP地址和端口。這就是說,只是TCP頭不需要IP信息,因為它來自于IP頭。 把一個數(shù)據(jù)包設(shè)想為一個字節(jié)跟著一個字節(jié)的數(shù)據(jù)流是很容易的。很多人都想要一個顯示TCP頭的表格。但是,這常會把事情搞亂。TCP頭從第一位開始依次是下面這些內(nèi)容: •源端口,16位:用于這次連接的本地TCP端口。 •目的地端口,16位:通訊目標(biāo)機器的TCP端口。 •序列號,32位:用來跟蹤數(shù)據(jù)包順序的號碼。 •確認(rèn)編號,32位:我們確認(rèn)的以前收到的序列號。 •頭長度,4位:報頭中的32位字(words)的數(shù)量。如果不使用選項,這個值設(shè)定為5。 •保留,6位:為將來的使用保留的字節(jié)。 •標(biāo)記,一共6位:每一個標(biāo)記一個字節(jié)(開或者關(guān))
•窗口尺寸,16位:從接收方將收到的確認(rèn)字段開始。 •校驗和,16位:TCP頭和數(shù)據(jù)的校驗和。 •應(yīng)急指針,16位:指向跟在URG數(shù)據(jù)后面的數(shù)據(jù)的序列號的偏移值。 •選項:MSS、窗口比例等等。我們在關(guān)于TCP協(xié)議的下一講中將重點介紹這個部分。 TCP連接的兩端使用兩對IP地址和端口識別這個連接,并且向監(jiān)聽這個端口的應(yīng)用程序發(fā)送數(shù)據(jù)。 先介紹這么多內(nèi)容。有關(guān)TCP協(xié)議的內(nèi)容還有很多。下篇文章我們將學(xué)習(xí)所有這些功能是如何互動的,并且了解有關(guān)TCP協(xié)議更多的內(nèi)容。 小結(jié) TCP是一種最常用的協(xié)議,在協(xié)議棧中位于第四層。 TCP協(xié)議提供阻塞控制、可靠性和發(fā)送數(shù)據(jù)的流。 為了提高效率,TCP協(xié)議在得到確認(rèn)之前努力發(fā)送盡可能多的數(shù)據(jù)。 |
|
|