第十七章:TCP:傳輸控制協(xié)議

17.1 引言

本章將介紹TCP為應用層提供的服務姑荷,以及TCP首部中的各個字段。隨后的幾章我們在了解TCP的工作過程中將對這些字段作詳細介紹。

對TCP的介紹將由本章開始,并一直包括隨后的7章获印。第18章描述如何建立和終止一個TCP連接,第19和第20章將了解正常的數(shù)據(jù)傳輸過程,包括交互使用(遠程登錄)和批量數(shù)據(jù)傳送(文件傳輸)兼丰。第21章提供TCP超時及重傳的技術細節(jié),第22和第23章將介紹兩種其他的定時器唆缴。最后鳍征,第24章概述TCP新的特性以及TCP的性能。

17.2 TCP的服務

盡管TCP和UDP都使用相同的網(wǎng)絡層(IP)面徽,TCP卻向應用層提供與UDP完全不同的服務艳丛。TCP提供一種面向連接的、可靠的字節(jié)流服務趟紊。

面向連接意味著兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數(shù)據(jù)之前必須先建立一個TCP連接氮双。這一過程與打電話很相似,先撥號振鈴霎匈,等待對方摘機說“喂”戴差,然后才說明是誰。在第18章我們將看到一個TCP連接是如何建立的铛嘱,以及當一方通信結束后如何斷開連接暖释。

在一個TCP連接中,僅有兩方進行彼此通信墨吓。在第12章介紹的廣播和多播不能用于TCP球匕。

TCP通過下列方式來提供可靠性:

1:應用數(shù)據(jù)被分割成TCP認為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全不同帖烘,應用程序產生的數(shù)據(jù)報長度將保持不變亮曹。由TCP傳遞給IP的信息單位稱為報文段或段(segment)(參見圖1-7)。在18.4節(jié)我們將看到TCP如何確定報文段的長度秘症。

2:當TCP發(fā)出一個段后照卦,它啟動一個定時器,等待目的端確認收到這個報文段历极。如果不能及時收到一個確認窄瘟,將重發(fā)這個報文段。在第21章我們將了解TCP協(xié)議中自適應的超時及重傳策略趟卸。

3:當TCP收到發(fā)自TCP連接另一端的數(shù)據(jù)蹄葱,它將發(fā)送一個確認。這個確認不是立即發(fā)送锄列,通常將推遲幾分之一秒图云,這將在19.3節(jié)討論。

4:TCP將保持它首部和數(shù)據(jù)的檢驗和邻邮。這是一個端到端的檢驗和竣况,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的檢驗和有差錯筒严,TCP將丟棄這個報文段和不確認收到此報文段(希望發(fā)端超時并重發(fā))丹泉。

5:既然TCP報文段作為IP數(shù)據(jù)報來傳輸情萤,而IP數(shù)據(jù)報的到達可能會失序,因此TCP報文段的到達也可能會失序摹恨。如果必要筋岛,TCP將對收到的數(shù)據(jù)進行重新排序,將收到的數(shù)據(jù)以正確的順序交給應用層晒哄。

6:既然IP數(shù)據(jù)報會發(fā)生重復睁宰,TCP的接收端必須丟棄重復的數(shù)據(jù)。

7:TCP還能提供流量控制寝凌。TCP連接的每一方都有固定大小的緩沖空間柒傻。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機致使較慢主機的緩沖區(qū)溢出较木。

兩個應用程序通過TCP連接交換8bit字節(jié)構成的字節(jié)流红符。TCP不在字節(jié)流中插入記錄標識符。我們將這稱為字節(jié)流服務(byte stream service)劫映。如果一方的應用程序先傳10字節(jié)违孝,又傳20字節(jié),再傳50字節(jié)泳赋,連接的另一方將無法了解發(fā)方每次發(fā)送了多少字節(jié)雌桑。收方可以分4次接收這80個字節(jié),每次接收20字節(jié)祖今。一端將字節(jié)流放到TCP連接上校坑,同樣的字節(jié)流將出現(xiàn)在TCP連接的另一端。

另外千诬,TCP對字節(jié)流的內容不作任何解釋耍目。TCP不知道傳輸?shù)臄?shù)據(jù)字節(jié)流是二進制數(shù)據(jù),還是ASCII字符徐绑、EBCDIC字符或者其他類型數(shù)據(jù)邪驮。對字節(jié)流的解釋由TCP連接雙方的應用層解釋。

這種對字節(jié)流的處理方式與Unix操作系統(tǒng)對文件的處理方式很相似傲茄。Unix的內核對一個應用讀或寫的內容不作任何解釋毅访,而是交給應用程序處理。對Unix的內核來說盘榨,它無法區(qū)分一個二進制文件與一個文本文件喻粹。

17.3 TCP的首部

TCP數(shù)據(jù)被封裝在一個IP數(shù)據(jù)報中,如圖17-1所示草巡。

圖17-1 TCP數(shù)據(jù)在IP數(shù)據(jù)報中的封裝

圖17-2顯示TCP首部的數(shù)據(jù)格式守呜。如果不計任選字段,它通常是20個字節(jié)。

圖17-2 TCP包首部

每個TCP段都包含源端和目的端的端口號查乒,用于尋找發(fā)端和收端應用進程弥喉。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接。

有時侣颂,一個IP地址和一個端口號也稱為一個插口(socket)档桃。這個術語出現(xiàn)在最早的TCP規(guī)范(RFC793)中,后來它也作為表示伯克利版的編程接口(參見1.15節(jié))憔晒。插口對(socketpair)(包含客戶IP地址、客戶端口號蔑舞、服務器IP地址和服務器端口號的四元組)可唯一確定互聯(lián)網(wǎng)絡中每個TCP連接的雙方拒担。

序號用來標識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的的第一個數(shù)據(jù)字節(jié)攻询。如果將字節(jié)流看作在兩個應用程序間的單向流動从撼,則TCP用序號對每個字節(jié)進行計數(shù)。序號是32 bit的無符號數(shù)钧栖,序號到達232-1后又從0開始低零。

當建立一個新的連接時,SYN標志變1拯杠。序號字段包含由這個主機選擇的該連接的初始序號ISN(Initial Sequence Number)掏婶。該主機要發(fā)送數(shù)據(jù)的第一個字節(jié)序號為這個ISN加1,因為SYN標志消耗了一個序號(將在下章詳細介紹如何建立和終止連接潭陪,屆時我們將看到FIN標志也要占用一個序號)雄妥。

既然每個傳輸?shù)淖止?jié)都被計數(shù),確認序號包含發(fā)送確認的一端所期望收到的下一個序號依溯。因此老厌,確認序號應當是上次已成功收到數(shù)據(jù)字節(jié)序號加1。只有ACK標志(下面介紹)為1時確認序號字段才有效黎炉。

發(fā)送ACK無需任何代價枝秤,因為32 bit的確認序號字段和ACK標志一樣,總是TCP首部的一部分慷嗜。因此淀弹,我們看到一旦一個連接建立起來,這個字段總是被設置洪添,ACK標志也總是被設置為1垦页。

TCP為應用層提供全雙工服務。這意味數(shù)據(jù)能在兩個方向上獨立地進行傳輸干奢。因此痊焊,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)序號。

TCP可以表述為一個沒有選擇確認或否認的滑動窗口協(xié)議(滑動窗口協(xié)議用于數(shù)據(jù)傳輸將在20.3節(jié)介紹)。我們說TCP缺少選擇確認是因為TCP首部中的確認序號表示發(fā)方已成功收到字節(jié)薄啥,但還不包含確認序號所指的字節(jié)辕羽。當前還無法對數(shù)據(jù)流中選定的部分進行確認。例如垄惧,如果1~1024字節(jié)已經(jīng)成功收到刁愿,下一報文段中包含序號從2049~3072的字節(jié),收端并不能確認這個新的報文段到逊。它所能做的就是發(fā)回一個確認序號為1025的ACK铣口。它也無法對一個報文段進行否認。例如觉壶,如果收到包含1025~2048字節(jié)的報文段脑题,但它的檢驗和錯,TCP接收端所能做的就是發(fā)回一個確認序號為1025的ACK铜靶。在21.7節(jié)我們將看到重復的確認如何幫助確定分組已經(jīng)丟失叔遂。

首部長度給出首部中32 bit字的數(shù)目。需要這個值是因為任選字段的長度是可變的争剿。這個字段占4bit已艰,因此TCP最多有60字節(jié)的首部。然而蚕苇,沒有任選字段哩掺,正常的長度是20字節(jié)。在TCP首部中有6個標志比特捆蜀。它們中的多個可同時被設置為1疮丛。我們在這兒簡單介紹它們的用法,在隨后的章節(jié)中有更詳細的介紹辆它。


TCP的流量控制由連接的每一端通過聲明的窗口大小來提供誊薄。窗口大小為字節(jié)數(shù),起始于確認序號字段指明的值锰茉,這個值是接收端正期望接收的字節(jié)呢蔫。窗口大小是一個16 bit字段,因而窗口大小最大為65535字節(jié)飒筑。在24.4節(jié)我們將看到新的窗口刻度選項片吊,它允許這個值按比例變化以提供更大的窗口。

檢驗和覆蓋了整個的TCP報文段:TCP首部和TCP數(shù)據(jù)协屡。這是一個強制性的字段俏脊,一定是由發(fā)端計算和存儲,并由收端進行驗證肤晓。TCP檢驗和的計算和UDP檢驗和的計算相似爷贫,使用如11.3節(jié)所述的一個偽首部认然。

只有當URG標志置1時緊急指針才有效。緊急指針是一個正的偏移量漫萄,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號卷员。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。我們將在20.8節(jié)介紹它腾务。
最常見的可選字段是最長報文大小毕骡,又稱為MSS(Maximum Segment Size)验辞。每個連接方通常都在通信的第一個報文段(為建立連接而設置SYN標志的那個段)中指明這個選項侮攀。它指明本端所能接收的最大長度的報文段。我們將在18.4節(jié)更詳細地介紹MSS選項蔗草,TCP的其他選項中的一些將在第24章中介紹启昧。

從圖17-2中我們注意到TCP報文段中的數(shù)據(jù)部分是可選的橱赠。我們將在18章中看到在一個連接建立和一個連接終止時,雙方交換的報文段僅有TCP首部箫津。如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒有任何數(shù)據(jù)的首部來確認收到的數(shù)據(jù)宰啦。在處理超時的許多情況中苏遥,也會發(fā)送不帶任何數(shù)據(jù)的報文段。

17.4 小結

TCP提供了一種可靠的面向連接的字節(jié)流運輸層服務赡模。我們簡單地介紹了TCP首部中的各個字段田炭,并在隨后的幾章里詳細討論它們。

TCP將用戶數(shù)據(jù)打包構成報文段漓柑;它發(fā)送數(shù)據(jù)后啟動一個定時器教硫;另一端對收到的數(shù)據(jù)進行確認,對失序的數(shù)據(jù)重新排序辆布,丟棄重復數(shù)據(jù)瞬矩;TCP提供端到端的流量控制,并計算和驗證一個強制性的端到端檢驗和锋玲。

許多流行的應用程序如Telnet景用、Rlogin、FTP和SMTP都使用TCP惭蹂。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末伞插,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盾碗,更是在濱河造成了極大的恐慌媚污,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廷雅,死亡現(xiàn)場離奇詭異耗美,居然都是意外死亡京髓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門幽歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朵锣,“玉大人,你說我怎么就攤上這事甸私〕闲” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵皇型,是天一觀的道長诬烹。 經(jīng)常有香客問我,道長弃鸦,這世上最難降的妖魔是什么绞吁? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮唬格,結果婚禮上家破,老公的妹妹穿的比我還像新娘。我一直安慰自己购岗,他們只是感情好汰聋,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喊积,像睡著了一般烹困。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乾吻,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天髓梅,我揣著相機與錄音,去河邊找鬼绎签。 笑死枯饿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的辜御。 我是一名探鬼主播鸭你,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擒权!你這毒婦竟也來了袱巨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碳抄,失蹤者是張志新(化名)和其女友劉穎愉老,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剖效,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嫉入,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年焰盗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒林。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熬拒,死狀恐怖,靈堂內的尸體忽然破棺而出垫竞,到底是詐尸還是另有隱情澎粟,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布欢瞪,位于F島的核電站活烙,受9級特大地震影響,放射性物質發(fā)生泄漏遣鼓。R本人自食惡果不足惜啸盏,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑祟。 院中可真熱鬧回懦,春花似錦、人聲如沸次企。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抒巢。三九已至,卻和暖如春秉犹,著一層夾襖步出監(jiān)牢的瞬間蛉谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工崇堵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留型诚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓鸳劳,卻偏偏與公主長得像狰贯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赏廓,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • 18.1 引言 TCP是一個面向連接的協(xié)議涵紊。無論哪一方向另一方發(fā)送數(shù)據(jù)之前,都必須先在雙方之間建立一條連接幔摸。本章將...
    張芳濤閱讀 3,383評論 0 13
  • 傳輸層-TCP摸柄, TCP頭部結構 ,TCP序列號和確認號詳解 TCP主要解決下面的三個問題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,522評論 1 46
  • 24.1 引言 TCP已經(jīng)在從1200 b/s的撥號SLIP鏈路到以太數(shù)據(jù)鏈路上運行了許多年既忆。在80年代和90年代...
    張芳濤閱讀 1,490評論 0 3
  • 計算機網(wǎng)絡七層模型中驱负,傳輸層有兩個重要的協(xié)議:(1)用戶數(shù)據(jù)報協(xié)議UDP (User Datagram Proto...
    Q南南南Q閱讀 1,714評論 0 3
  • 1 運輸層協(xié)議概述 1.1 進程之間的通信 網(wǎng)絡層是為主機之間提供邏輯通信嗦玖,而運輸層為應用進程之間提供端到端的邏輯...
    Mr希靈閱讀 8,090評論 0 34