本篇文章主要是從運(yùn)輸層協(xié)議概述肤频、UDP、TCP算墨、可靠傳輸?shù)墓ぷ髟硐摹CP首部格式、TCP可靠傳輸?shù)膶?shí)現(xiàn)净嘀、TCP流量控制骇扇、TCP的擁塞控制、TCP的連接管理這幾個方面進(jìn)行解析面粮。
一、運(yùn)輸層協(xié)議概述
1.進(jìn)程之間的通信
從通信和信息處理的角度看继低,運(yùn)輸層向它上面的應(yīng)用層提供通信服務(wù)熬苍,它屬于面向通信部分的最高層,同時也是用戶功能中的最低層袁翁。
當(dāng)兩臺主機(jī)使用網(wǎng)絡(luò)的核心部分的功能進(jìn)行點(diǎn)對點(diǎn)通信的時候柴底,只有位于邊緣部分的主機(jī)的協(xié)議棧才有運(yùn)輸層,而網(wǎng)絡(luò)核心的路由器在轉(zhuǎn)發(fā)的時候只有用到下三層的功能粱胜。
應(yīng)用進(jìn)程之間的通信:
- 兩個主機(jī)進(jìn)行通信實(shí)際上就是兩個主機(jī)中的應(yīng)用進(jìn)程互相通信柄驻。
- 應(yīng)用進(jìn)程之間的通信又稱為端到端的通信。 輸層的一個很重要的功能就是復(fù)用和分用焙压。應(yīng)用層不同進(jìn)程的報文通過不同的端口向下交到運(yùn)輸層鸿脓,再往下就共用網(wǎng)絡(luò)層提供的服務(wù)抑钟。
- “運(yùn)輸層提供應(yīng)用進(jìn)程間的邏輯通信”∫翱蓿“邏輯通信”的意思是:運(yùn)輸層之間的通信好像是沿水平方向傳送數(shù)據(jù)在塔。但事實(shí)上這兩個運(yùn)輸層之間并沒有一條水平方向的物理連接。
運(yùn)輸層的主要功能:
- 運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯通信(但網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信)拨黔。
- 運(yùn)輸層還要對收到的報文進(jìn)行差錯檢測蛔溃。
- 運(yùn)輸層需要有兩種不同的運(yùn)輸協(xié)議,即面向連接的 TCP 和無連接的 UDP篱蝇。
兩種不同的運(yùn)輸協(xié)議:
- 運(yùn)輸層向高層用戶屏蔽了下面網(wǎng)絡(luò)核心的細(xì)節(jié)(如網(wǎng)絡(luò)拓?fù)浜卮⑺捎玫穆酚蛇x擇協(xié)議等),它使應(yīng)用進(jìn)程看見的就是好像在兩個運(yùn)- 輸層實(shí)體之間有一條端到端的邏輯通信信道零截。
- 當(dāng)運(yùn)輸層采用面向連接的 TCP 協(xié)議時麸塞,盡管下面的網(wǎng)絡(luò)是不可靠的(只提供盡最大努力服務(wù)),但這種邏輯通信信道就相當(dāng)于一條全雙工的可靠信道瞻润。
- 當(dāng)運(yùn)輸層采用無連接的 UDP 協(xié)議時喘垂,這種邏輯通信信道是一條不可靠信道。
2.運(yùn)輸層的兩個主要協(xié)議
TCP/IP 的運(yùn)輸層有兩個不同的協(xié)議:
- (1) 用戶數(shù)據(jù)報協(xié)議 UDP(User Datagram Protocol)
- (2) 傳輸控制協(xié)議 TCP(Transmission Control Protocol)
TCP與UDP:
- 兩個對等運(yùn)輸實(shí)體在通信時傳送的數(shù)據(jù)單位叫作運(yùn)輸協(xié)議數(shù)據(jù)單元 TPDU (Transport Protocol Data Unit)绍撞。
- TCP 傳送的數(shù)據(jù)單位協(xié)議是 TCP 報文段(segment)
- UDP 傳送的數(shù)據(jù)單位協(xié)議是 UDP 報文或用戶數(shù)據(jù)報正勒。
- UDP 在傳送數(shù)據(jù)之前不需要先建立連接。對方的運(yùn)輸層在收到 UDP 報文后傻铣,不需要給出任何確認(rèn)章贞。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 是一種最有效的工作方式非洲。
- TCP 則提供面向連接的服務(wù)鸭限。TCP 不提供廣播或多播服務(wù)。由于 TCP 要提供可靠的两踏、面向連接的運(yùn)輸服務(wù)败京,因此不可避免地增加了許多的開銷。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多梦染,還要占用許多的處理機(jī)資源赡麦。
3.運(yùn)輸層的端口
- 運(yùn)行在計算機(jī)中的進(jìn)程是用進(jìn)程標(biāo)識符來標(biāo)志的。
- 運(yùn)行在應(yīng)用層的各種應(yīng)用進(jìn)程卻不應(yīng)當(dāng)讓計算機(jī)操作系統(tǒng)指派它的進(jìn)程標(biāo)識符帕识。這是因?yàn)樵谝蛱鼐W(wǎng)上使用的計算機(jī)的操作系統(tǒng)種類很多泛粹,而不同的操作系統(tǒng)又使用不同格式的進(jìn)程標(biāo)識符。
- 為了使運(yùn)行不同操作系統(tǒng)的計算機(jī)的應(yīng)用進(jìn)程能夠互相通信肮疗,就必須用統(tǒng)一的方法對 TCP/IP 體系的應(yīng)用進(jìn)程進(jìn)行標(biāo)志晶姊。
端口號(protocol port number),簡稱為端口(port):
- 解決這個問題的方法就是在運(yùn)輸層使用協(xié)議端口號(protocol port number)伪货,或通常簡稱為端口(port)们衙。
- 雖然通信的終點(diǎn)是應(yīng)用進(jìn)程钾怔,但我們可以把端口想象是通信的終點(diǎn),因?yàn)槲覀冎灰岩獋魉偷膱笪慕坏侥康闹鳈C(jī)的某一個合適的目的端口砍艾,剩下的工作(即最后交付目的進(jìn)程)就由 TCP 來完成蒂教。
軟件端口與硬件端口:
- 在協(xié)議棧層間的抽象的協(xié)議端口是軟件端口。
- 路由器或交換機(jī)上的端口是硬件端口脆荷。
- 硬件端口是不同硬件設(shè)備進(jìn)行交互的接口凝垛,而軟件端口是應(yīng)用層的各種協(xié)議進(jìn)程與運(yùn)輸實(shí)體進(jìn)行層間交互的一種地址。
TCP 的端口 :
- 端口用一個 16 位端口號進(jìn)行標(biāo)志蜓谋。
- 端口號只具有本地意義梦皮,即端口號只是為了標(biāo)志本計算機(jī)應(yīng)用層中的各進(jìn)程。在因特網(wǎng)中不同計算機(jī)的相同端口號是沒有聯(lián)系的桃焕。
三類端口號:
- 熟知端口剑肯,數(shù)值一般為 0~1023。
- 登記端口號观堂,數(shù)值為1024~49151让网,為沒有熟知端口號的應(yīng)用程序使用的。使用這個范圍的端口號必須在 IANA 登記师痕,以防止重復(fù)溃睹。
- 客戶端口號或短暫端口號,數(shù)值為49152~65535胰坟,留給客戶進(jìn)程選擇暫時使用因篇。當(dāng)服務(wù)器進(jìn)程收到客戶進(jìn)程的報文時,就知道了客戶進(jìn)程所使用的動態(tài)端口號笔横。通信結(jié)束后竞滓,這個端口號可供其他客戶進(jìn)程以后使用。
二吹缔、用戶數(shù)據(jù)報協(xié)議UDP
1.UDP概述
- UDP 只在 IP 的數(shù)據(jù)報服務(wù)之上增加了很少一點(diǎn)的功能商佑,即端口的功能和差錯檢測的功能。
- 雖然 UDP 用戶數(shù)據(jù)報只能提供不可靠的交付厢塘,但 UDP 在某些方面有其特殊的優(yōu)點(diǎn)茶没。
UDP的主要特點(diǎn):
- UDP 是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接俗冻。
- UDP 使用盡最大努力交付,即不保證可靠交付牍颈,同時也不使用擁塞控制迄薄。
- UDP 是面向報文的。UDP 沒有擁塞控制煮岁,很適合多媒體通信的要求讥蔽。
- UDP 支持一對一涣易、一對多、多對一和多對多的交互通信冶伞。
- UDP 的首部開銷小新症,只有 8 個字節(jié)。
面向報文的UDP:
- 發(fā)送方 UDP 對應(yīng)用程序交下來的報文响禽,在添加首部后就向下交付 IP 層徒爹。UDP 對應(yīng)用層交下來的報文,既不合并芋类,也不拆分隆嗅,而是保留這些報文的邊界。
- 應(yīng)用層交給 UDP 多長的報文侯繁,UDP 就照樣發(fā)送胖喳,即一次發(fā)送一個報文。
- 接收方 UDP 對 IP 層交上來的 UDP 用戶數(shù)據(jù)報贮竟,在去除首部后就原封不動地交付上層的應(yīng)用進(jìn)程丽焊,一次交付一個完整的報文。
- 應(yīng)用程序必須選擇合適大小的報文
- 用戶數(shù)據(jù)報 UDP 有兩個字段:數(shù)據(jù)字段和首部字段咕别。首部字段有 8 個字節(jié)技健,由 4 個字段組成,每個字段都是兩個字節(jié)顷级。
-
在計算檢驗(yàn)和時凫乖,臨時把“偽首部”和 UDP 用戶數(shù)據(jù)報連接在一起。偽首部僅僅是為了計算檢驗(yàn)和弓颈。
image
三帽芽、傳輸控制協(xié)議 TCP 概述
1.TCP 最主要的特點(diǎn)
- TCP 是面向連接的運(yùn)輸層協(xié)議。
- 每一條 TCP 連接只能有兩個端點(diǎn)(endpoint)翔冀,每一條 TCP 連接只能是點(diǎn)對點(diǎn)的(一對一)导街。
- TCP 提供可靠交付的服務(wù)。
- TCP 提供全雙工通信纤子。
- 面向字節(jié)流搬瑰。
注意:
- TCP 連接是一條虛連接而不是一條真正的物理連接。
- TCP 對應(yīng)用進(jìn)程一次把多長的報文發(fā)送到TCP 的緩存中是不關(guān)心的控硼。
- TCP 根據(jù)對方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞的程度來決定一個報文段應(yīng)包含多少個字節(jié)(UDP 發(fā)送的報文長度是應(yīng)用進(jìn)程給出的)泽论。
- TCP 可把太長的數(shù)據(jù)塊劃分短一些再傳送。TCP 也可等待積累有足夠多的字節(jié)后再構(gòu)成報文段發(fā)送出去卡乾。
2.TCP的連接
TCP 把連接作為最基本的抽象翼悴。
- 每一條 TCP 連接有兩個端點(diǎn)。
- TCP 連接的端點(diǎn)不是主機(jī)幔妨,不是主機(jī)的IP 地址鹦赎,不是應(yīng)用進(jìn)程谍椅,也不是運(yùn)輸層的協(xié)議端口。TCP 連接的端點(diǎn)叫做套接字(socket)或插口古话。
- 端口號拼接到(contatenated with) IP 地址即構(gòu)成了套接字雏吭。
- 每一條 TCP 連接唯一地被通信兩端的兩個端點(diǎn)(即兩個套接字)所確定
四、可靠傳輸工作原理
1.停止等待協(xié)議
- 在發(fā)送完一個分組后陪踩,必須暫時保留已發(fā)送的分組的副本杖们。
- 分組和確認(rèn)分組都必須進(jìn)行編號。
- 超時計時器的重傳時間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些膊毁。
- 使用上述的確認(rèn)和重傳機(jī)制胀莹,我們就可以在不可靠的傳輸網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信。
- 這種可靠傳輸協(xié)議常稱為自動重傳請求ARQ (Automatic Repeat reQuest)婚温。
- ARQ 表明重傳的請求是自動進(jìn)行的描焰。接收方不需要請求發(fā)送方重傳某個出錯的分組 。
缺點(diǎn):
- 停止等待協(xié)議的優(yōu)點(diǎn)是簡單栅螟,但缺點(diǎn)是信道利用率太低荆秦。
流水線傳輸:
- 發(fā)送方可連續(xù)發(fā)送多個分組,不必每發(fā)完一個分組就停頓下來等待對方的確認(rèn)力图。
- 由于信道上一直有數(shù)據(jù)不間斷地傳送步绸,這種傳輸方式可獲得很高的信道利用率。
2.連續(xù)ARQ協(xié)議
累積確認(rèn):
- 接收方一般采用累積確認(rèn)的方式吃媒。即不必對收到的分組逐個發(fā)送確認(rèn)瓤介,而是對按序到達(dá)的最后一個分組發(fā)送確認(rèn),這樣就表示:到這個分組為止的所有分組都已正確收到了赘那。
- 累積確認(rèn)有的優(yōu)點(diǎn)是:容易實(shí)現(xiàn)刑桑,即使確認(rèn)丟失也不必重傳。缺點(diǎn)是:不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息募舟。
Go-back-N(回退 N):
- 如果發(fā)送方發(fā)送了前 5 個分組祠斧,而中間的第 3 個分組丟失了。這時接收方只能對前兩個分組發(fā)出確認(rèn)拱礁。發(fā)送方無法知道后面三個分組的下落琢锋,而只好把后面的三個分組都再重傳一次。
- 這就叫做 Go-back-N(回退 N)呢灶,表示需要再退回來重傳已發(fā)送過的 N 個分組吴超。
- 可見當(dāng)通信線路質(zhì)量不好時,連續(xù) ARQ 協(xié)議會帶來負(fù)面的影響鸯乃。
TCP 可靠通信的具體實(shí)現(xiàn):
- TCP 連接的每一端都必須設(shè)有兩個窗口——一個發(fā)送窗口和一個接收窗口鲸阻。
- TCP 的可靠傳輸機(jī)制用字節(jié)的序號進(jìn)行控制。TCP 所有的確認(rèn)都是基于序號而不是基于報文段。
- TCP 兩端的四個窗口經(jīng)常處于動態(tài)變化之中赘娄。
- TCP連接的往返時間 RTT 也不是固定不變的。需要使用特定的算法估算較為合理的重傳時間宏蛉。
五遣臼、TCP報文段的首部格式
源端口和目的端口字段——各占 2 字節(jié)。端口是運(yùn)輸層與應(yīng)用層的服務(wù)接口拾并。運(yùn)輸層的復(fù)用和分用功能都要通過端口才能實(shí)現(xiàn)揍堰。
序號字段——占 4 字節(jié)。TCP 連接中傳送的數(shù)據(jù)流中的每一個字節(jié)都編上一個序號嗅义。序號字段的值則指的是本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號屏歹。
確認(rèn)號字段——占 4 字節(jié),是期望收到對方的下一個報文段的數(shù)據(jù)的第一個字節(jié)的序號之碗。
數(shù)據(jù)偏移(即首部長度)——占 4 位蝙眶,它指出 TCP 報文段的數(shù)據(jù)起始處距離 TCP 報文段的起始處有多遠(yuǎn)⊥誓牵“數(shù)據(jù)偏移”的單位是 32 位字(以 4 字節(jié)為計算單位)幽纷。
保留字段——占 6 位,保留為今后使用博敬,但目前應(yīng)置為 0友浸。
緊急 URG —— 當(dāng) URG ? 1 時,表明緊急指針字段有效偏窝。它告訴系統(tǒng)此報文段中有緊急數(shù)據(jù)收恢,應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級的數(shù)據(jù))。
確認(rèn) ACK —— 只有當(dāng) ACK ? 1 時確認(rèn)號字段才有效祭往。當(dāng) ACK ? 0 時伦意,確認(rèn)號無效。
推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的報文段链沼,就盡快地交付接收應(yīng)用進(jìn)程默赂,而不再等到整個緩存都填滿了后再向上交付。
復(fù)位 RST (ReSeT) —— 當(dāng) RST ? 1 時括勺,表明 TCP 連接中出現(xiàn)嚴(yán)重差錯(如由于主機(jī)崩潰或其他原因)缆八,必須釋放連接,然后再重新建立運(yùn)輸連接疾捍。
同步 SYN —— 同步 SYN = 1 表示這是一個連接請求或連接接受報文奈辰。
終止 FIN (FINis) —— 用來釋放一個連接。FIN ? 1 表明此報文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢乱豆,并要求釋放運(yùn)輸連接奖恰。
窗口字段 —— 占 2 字節(jié),用來讓對方設(shè)置發(fā)送窗口的依據(jù),單位為字節(jié)瑟啃。
檢驗(yàn)和 —— 占 2 字節(jié)论泛。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分。在計算檢驗(yàn)和時蛹屿,要在 TCP 報文段的前面加上 12 字節(jié)的偽首部屁奏。
緊急指針字段 —— 占 16 位,指出在本報文段中緊急數(shù)據(jù)共有多少個字節(jié)(緊急數(shù)據(jù)放在本報文段數(shù)據(jù)的最前面)错负。
-
選項字段 —— 長度可變坟瓢。TCP 最初只規(guī)定了一種選項,即最大報文段長度 MSS犹撒。MSS (Maximum Segment Size)是 TCP 報文段中的數(shù)據(jù)字段的最大長度折联。數(shù)據(jù)字段加上 TCP 首部才等于整個的 TCP 報文段。后面Tcp又增加了其他的選項:
- 窗口擴(kuò)大選項 ——占 3 字節(jié)识颊,其中有一個字節(jié)表示移位值 S诚镰。新的窗口值等于TCP 首部中的窗口位數(shù)增大到(16 + S),相當(dāng)于把窗口值向左移動 S 位后獲得實(shí)際的窗口大小祥款。
- 時間戳選項——占10 字節(jié)怕享,其中最主要的字段時間戳值字段(4 字節(jié))和時間戳回送回答字段(4 字節(jié))。
- 選擇確認(rèn)選項——在后面的 5.6.3 節(jié)介紹镰踏。
填充字段 —— 這是為了使整個首部長度是 4 字節(jié)的整數(shù)倍函筋。
六、TCP可靠傳輸?shù)膶?shí)現(xiàn)
1.以字節(jié)為單位的滑動窗口
發(fā)送緩存與接收緩存的作用:
- 發(fā)送緩存用來暫時存放:
- 發(fā)送應(yīng)用程序傳送給發(fā)送方 TCP 準(zhǔn)備發(fā)送的數(shù)據(jù)奠伪;
- TCP 已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)跌帐。
- 接收緩存用來暫時存放:
- 按序到達(dá)的、但尚未被接收應(yīng)用程序讀取的數(shù)據(jù)绊率;
- 不按序到達(dá)的數(shù)據(jù)谨敛。
需要強(qiáng)調(diào)三點(diǎn):
- A 的發(fā)送窗口并不總是和 B 的接收窗口一樣大(因?yàn)橛幸欢ǖ臅r間滯后)。
- TCP 標(biāo)準(zhǔn)沒有規(guī)定對不按序到達(dá)的數(shù)據(jù)應(yīng)如何處理滤否。通常是先臨時存放在接收窗口中脸狸,等到字節(jié)流中所缺少的字節(jié)收到后,再按序交付上層的應(yīng)用進(jìn)程藐俺。
- TCP 要求接收方必須有累積確認(rèn)的功能炊甲,這樣可以減小傳輸開銷。
2.超時重傳時間的選擇
- 重傳機(jī)制是 TCP 中最重要和最復(fù)雜的問題之一欲芹。
- TCP 每發(fā)送一個報文段卿啡,就對這個報文段設(shè)置一次計時器。只要計時器設(shè)置的重傳時間到但還沒有收到確認(rèn)菱父,就要重傳這一報文段颈娜。
加權(quán)平均往返時間:
- TCP 保留了 RTT 的一個加權(quán)平均往返時間 RTTS(這又稱為平滑的往返時間)剑逃。
- 第一次測量到 RTT 樣本時,RTTS 值就取為所測量到的 RTT 樣本值官辽。以后每測量到一個新的 RTT 樣本歇由,就按下式重新計算一次 RTTS:
新的 RTTS = (1 -a) * (舊的 RTTS)
+ a* (新的 RTT 樣本) (5-4)
式中葵硕,0 < a < 1航揉。若 ? 很接近于零恩伺,表示 RTT 值更新較慢探熔。若選擇a 接近于 1锰扶,則表示 RTT 值更新較快瞄桨。 - R- FC 2988 推薦的 a 值為 1/8遣疯,即 0.125清酥。
超時重傳時間RTO:
- RTO 應(yīng)略大于上面得出的加權(quán)平均往返時間 RTTS扶镀。
- RTO = RTTS + 4 * RTTD
- RTTD 是 RTT 的偏差的加權(quán)平均值。
- RFC 2988 建議這樣計算 RTTD焰轻。第一次測量時臭觉,RTTD 值取為測量到的 RTT 樣本值的一半。在以后的測量中辱志,則使用下式計算加權(quán)平均的 RTTD:
- 新的 RTTD = (1 - b) * (舊的RTTD)
+ b * |RTTS - 新的 RTT 樣本|
- 新的 RTTD = (1 - b) * (舊的RTTD)
- b 是個小于 1 的系數(shù)蝠筑,其推薦值是 1/4,即 0.25揩懒。
Karn算法:
在計算平均往返時間 RTT 時什乙,只要報文段重傳了,就不采用其往返時間樣本已球。
這樣得出的加權(quán)平均平均往返時間 RTTS 和超時重傳時間 RTO 就較準(zhǔn)確臣镣。
修正的 Karn 算法:
- 報文段每重傳一次,就把 RTO 增大一些:
- 新的 RTO = y * (舊的 RTO)
- 系數(shù) y 的典型值是 2 智亮。
- 當(dāng)不再發(fā)生報文段的重傳時忆某,才根據(jù)報文段的往返時延更新平均往返時延 RTT 和超時重傳時間 RTO 的數(shù)值。
- 實(shí)踐證明阔蛉,這種策略較為合理弃舒。
3.選擇確認(rèn)SACK
- 接收方收到了和前面的字節(jié)流不連續(xù)的兩個字節(jié)塊。
- 如果這些字節(jié)的序號都在接收窗口之內(nèi)状原,那么接收方就先收下這些數(shù)據(jù)聋呢,但要把這些信息準(zhǔn)確地告訴發(fā)送方,使發(fā)送方不要再重復(fù)發(fā)送這些已收到的數(shù)據(jù)颠区。
七坝冕、TCP的流量控制
1.利用滑動窗口實(shí)現(xiàn)流量控制
- 一般說來,我們總是希望數(shù)據(jù)傳輸?shù)酶煲恍┩吆簟5绻l(fā)送方把數(shù)據(jù)發(fā)送得過快喂窟,接收方就可能來不及接收测暗,這就會造成數(shù)據(jù)的丟失。
- 流量控制(flow control)就是讓發(fā)送方的發(fā)送速率不要太快磨澡,既要讓接收方來得及接收碗啄,也不要使網(wǎng)絡(luò)發(fā)生擁塞。
-
利用滑動窗口機(jī)制可以很方便地在 TCP 連接上實(shí)現(xiàn)流量控制稳摄。
image
持續(xù)計時器:
- TCP 為每一個連接設(shè)有一個持續(xù)計時器稚字。
- 只要 TCP 連接的一方收到對方的零窗口通知,就啟動持續(xù)計時器厦酬。
- 若持續(xù)計時器設(shè)置的時間到期胆描,就發(fā)送一個零窗口探測報文段(僅攜帶 1 字節(jié)的數(shù)據(jù)),而對方就在確認(rèn)這個探測報文段時給出了現(xiàn)在的窗口值仗阅。
- 若窗口仍然是零昌讲,則收到這個報文段的一方就重新設(shè)置持續(xù)計時器。
- 若窗口不是零减噪,則死鎖的僵局就可以打破了短绸。
2.必須考慮傳輸效率
可以用不同的機(jī)制來控制 TCP 報文段的發(fā)送時機(jī):
- 第一種機(jī)制是 TCP 維持一個變量,它等于最大報文段長度 MSS筹裕。只要緩存中存放的數(shù)據(jù)達(dá)到 MSS 字節(jié)時醋闭,就組裝成一個 TCP 報文段發(fā)送出去。
- 第二種機(jī)制是由發(fā)送方的應(yīng)用進(jìn)程指明要求發(fā)送報文段朝卒,即 TCP 支持的推送(push)操作证逻。
- 第三種機(jī)制是發(fā)送方的一個計時器期限到了,這時就把當(dāng)前已有的緩存數(shù)據(jù)裝入報文段(但長度不能超過 MSS)發(fā)送出去抗斤。
八瑟曲、TCP的擁塞控制
1.擁塞控制的一般原理
- 在某段時間,若對網(wǎng)絡(luò)中某資源的需求超過了該資源所能提供的可用部分豪治,網(wǎng)絡(luò)的性能就要變壞——產(chǎn)生擁塞(congestion)洞拨。
- 出現(xiàn)資源擁塞的條件:
- 對資源需求的總和 > 可用資源
- 若網(wǎng)絡(luò)中有許多資源同時產(chǎn)生擁塞,網(wǎng)絡(luò)的性能就要明顯變壞负拟,整個網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降烦衣。
擁塞控制與流量控制的關(guān)系:
- 擁塞控制所要做的都有一個前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷掩浙。
- 擁塞控制是一個全局性的過程花吟,涉及到所有的主機(jī)、所有的路由器厨姚,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素衅澈。
- 流量控制往往指在給定的發(fā)送端和接收端之間的點(diǎn)對點(diǎn)通信量的控制。
- 流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率谬墙,以便使接收端來得及接收今布。
擁塞控制的一般原理:
- 擁塞控制是很難設(shè)計的经备,因?yàn)樗且粋€動態(tài)的(而不是靜態(tài)的)問題。
- 當(dāng)前網(wǎng)絡(luò)正朝著高速化的方向發(fā)展部默,這很容易出現(xiàn)緩存不夠大而造成分組的丟失侵蒙。但分組的丟失是網(wǎng)絡(luò)發(fā)生擁塞的征兆而不是原因。
- 在許多情況下傅蹂,甚至正是擁塞控制本身成為引起網(wǎng)絡(luò)性能惡化甚至發(fā)生死鎖的原因纷闺。這點(diǎn)應(yīng)特別引起重視。
開環(huán)控制和閉環(huán)控制:
- 開環(huán)控制方法就是在設(shè)計網(wǎng)絡(luò)時事先將有關(guān)發(fā)生擁塞的因素考慮周到份蝴,力求網(wǎng)絡(luò)在工作時不產(chǎn)生擁塞犁功。
- 閉環(huán)控制是基于反饋環(huán)路的概念。屬于閉環(huán)控制的有以下幾種措施:
- 監(jiān)測網(wǎng)絡(luò)系統(tǒng)以便檢測到擁塞在何時婚夫、何處發(fā)生浸卦。
- 將擁塞發(fā)生的信息傳送到可采取行動的地方。
- 調(diào)整網(wǎng)絡(luò)系統(tǒng)的運(yùn)行以解決出現(xiàn)的問題请敦。
2.幾種擁塞控制方法
1.慢開始和擁塞避免
- 發(fā)送方維持一個叫做擁塞窗口 cwnd (congestion window)的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度储玫,并且動態(tài)地在變化侍筛。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口。如再考慮到接收方的接收能力撒穷,則發(fā)送窗口還可能小于擁塞窗口匣椰。
- 發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞,擁塞窗口就再增大一些端礼,以便把更多的分組發(fā)送出去禽笑。但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口就減小一些蛤奥,以減少注入到網(wǎng)絡(luò)中的分組數(shù)佳镜。
慢開始算法的原理:
- 在主機(jī)剛剛開始發(fā)送報文段時可先設(shè)置擁塞窗口 cwnd = 1,即設(shè)置為一個最大報文段 MSS 的數(shù)值凡桥。
- 在每收到一個對新的報文段的確認(rèn)后蟀伸,將擁塞窗口加 1,即增加一個 MSS 的數(shù)值缅刽。
-
用這樣的方法逐步增大發(fā)送端的擁塞窗口 cwnd啊掏,可以使分組注入到網(wǎng)絡(luò)的速率更加合理。
image
傳輸輪次:
- 使用慢開始算法后衰猛,每經(jīng)過一個傳輸輪次迟蜜,擁塞窗口 cwnd 就加倍。
- 一個傳輸輪次所經(jīng)歷的時間其實(shí)就是往返時間 RTT啡省。
- “傳輸輪次”更加強(qiáng)調(diào):把擁塞窗口 cwnd 所允許發(fā)送的報文段都連續(xù)發(fā)送出去娜睛,并收到了對已發(fā)送的最后一個字節(jié)的確認(rèn)髓霞。
- 例如,擁塞窗口 cwnd = 4微姊,這時的往返時間 RTT 就是發(fā)送方連續(xù)發(fā)送 4 個報文段酸茴,并收到這 4 個報文段的確認(rèn),總共經(jīng)歷的時間兢交。
設(shè)置慢開始門限狀態(tài)變量ssthresh:
- 慢開始門限 ssthresh 的用法如下:
- 當(dāng) cwnd < ssthresh 時薪捍,使用慢開始算法。
- 當(dāng) cwnd > ssthresh 時配喳,停止使用慢開始算法而改用擁塞避免算法酪穿。
- 當(dāng) cwnd = ssthresh 時,既可使用慢開始算法晴裹,也可使用擁塞避免算法被济。
- 擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢地增大,即每經(jīng)過一個往返時間 RTT 就把發(fā)送方的擁塞窗口 cwnd 加 1涧团,而不是加倍只磷,使擁塞窗口 cwnd 按線性規(guī)律緩慢增長。
當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞時:
- 無論在慢開始階段還是在擁塞避免階段泌绣,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有按時收到確認(rèn))钮追,就要把慢開始門限 ssthresh 設(shè)置為出現(xiàn)擁塞時的發(fā)送方窗口值的一半(但不能小于2)。
- 然后把擁塞窗口 cwnd 重新設(shè)置為 1阿迈,執(zhí)行慢開始算法元媚。
-
這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢苗沧。
image
加法增大:
“加法增大”是指執(zhí)行擁塞避免算法后刊棕,在收到對所有報文段的確認(rèn)后(即經(jīng)過一個往返時間),就把擁塞窗口 cwnd增加一個 MSS 大小待逞,使擁塞窗口緩慢增大甥角,以防止網(wǎng)絡(luò)過早出現(xiàn)擁塞。
“擁塞避免”并非指完全能夠避免了擁塞识樱。利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的蜈膨。
“擁塞避免”是說在擁塞避免階段把擁塞窗口控制為按線性規(guī)律增長,使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞牺荠。
2.快重傳和快恢復(fù)
- 快重傳算法首先要求接收方每收到一個失序的報文段后就立即發(fā)出重復(fù)確認(rèn)翁巍。這樣做可以讓發(fā)送方及早知道有報文段沒有到達(dá)接收方。
- 發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段休雌。
-
不難看出灶壶,快重傳并非取消重傳計時器,而是在某些情況下可更早地重傳丟失的報文段杈曲。
image
快恢復(fù)算法 :
- (1) 當(dāng)發(fā)送端收到連續(xù)三個重復(fù)的確認(rèn)時驰凛,就執(zhí)行“乘法減小”算法胸懈,把慢開始門限 ssthresh 減半。但接下去不執(zhí)行慢開始算法恰响。
- (2)由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒有發(fā)生擁塞趣钱,因此現(xiàn)在不執(zhí)行慢開始算法,即擁塞窗口 cwnd 現(xiàn)在不設(shè)置為 1胚宦,而是設(shè)置為慢開始門限 ssthresh 減半后的數(shù)值首有,然后開始執(zhí)行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大枢劝。
發(fā)送窗口的上限值:
- 發(fā)送方的發(fā)送窗口的上限值應(yīng)當(dāng)取為接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個井联,即應(yīng)按以下公式確定:
發(fā)送窗口的上限值=Min [rwnd, cwnd] (5-8) - 當(dāng) rwnd < cwnd 時,是接收方的接收能力限制發(fā)送窗口的最大值您旁。
- 當(dāng) cwnd < rwnd 時烙常,則是網(wǎng)絡(luò)的擁塞限制發(fā)送窗口的最大值。
九鹤盒、TCP 的運(yùn)輸連接管理
1.運(yùn)輸連接的三個階段
- 運(yùn)輸連接就有三個階段蚕脏,即:連接建立、數(shù)據(jù)傳送和連接釋放侦锯。運(yùn)輸連接的管理就是使運(yùn)輸連接的建立和釋放都能正常地進(jìn)行驼鞭。
- 連接建立過程中要解決以下三個問題:
- 要使每一方能夠確知對方的存在。
- 要允許雙方協(xié)商一些參數(shù)(如最大報文段長度率触,最大窗口大小终议,服務(wù)質(zhì)量等)汇竭。
- 能夠?qū)\(yùn)輸實(shí)體資源(如緩存大小葱蝗,連接表中的項目等)進(jìn)行分配。
客戶-服務(wù)器方式:
- TCP 連接的建立都是采用客戶服務(wù)器方式细燎。
- 主動發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶(client)两曼。
- 被動等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器(server)。
A 的 TCP 向 B 發(fā)出連接請求報文段玻驻,其首部中的同步位 SYN = 1悼凑,并選擇序號 seq = x,表明傳送數(shù)據(jù)時的第一個數(shù)據(jù)字節(jié)的序號是 x璧瞬。
B 的 TCP 收到連接請求報文段后户辫,如同意,則發(fā)回確認(rèn)嗤锉。B 在確認(rèn)報文段中應(yīng)使 SYN = 1渔欢,使 ACK = 1,其確認(rèn)號ack = x ? 1瘟忱,自己選擇的序號 seq = y奥额。
A 收到此報文段后向 B 給出確認(rèn)苫幢,其 ACK = 1,確認(rèn)號 ack = y ? 1垫挨。A 的 TCP 通知上層應(yīng)用進(jìn)程韩肝,連接已經(jīng)建立。
B 的 TCP 收到主機(jī) A 的確認(rèn)后九榔,也通知其上層應(yīng)用進(jìn)程:TCP 連接已經(jīng)建立哀峻。
2.TCP的釋放
數(shù)據(jù)傳輸結(jié)束后,通信的雙方都可釋放連接≈闾耄現(xiàn)在 A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報文段谜诫,并停止再發(fā)送數(shù)據(jù),主動關(guān)閉 TCP 連接攻旦。A 把連接釋放報文段首部的 FIN = 1喻旷,其序號seq = u,等待 B 的確認(rèn)牢屋。
B 發(fā)出確認(rèn)且预,確認(rèn)號 ack = u ? 1,而這個報文段自己的序號 seq = v烙无。TCP 服務(wù)器進(jìn)程通知高層應(yīng)用進(jìn)程锋谐。從 A 到 B 這個方向的連接就釋放了,TCP 連接處于半關(guān)閉狀態(tài)截酷。B 若發(fā)送數(shù)據(jù)涮拗,A 仍要接收。
若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù)迂苛,其應(yīng)用進(jìn)程就通知 TCP 釋放連接三热。
A 收到連接釋放報文段后,必須發(fā)出確認(rèn)三幻。
在確認(rèn)報文段中 ACK = 1就漾,確認(rèn)號 ack ? w ? 1,自己的序號 seq = u + 1念搬。TCP 連接必須經(jīng)過時間 2MSL 后才真正釋放掉抑堡。
A 必須等待 2MSL 的時間:
- 第一,為了保證 A 發(fā)送的最后一個 ACK 報文段能夠到達(dá) B朗徊。
- 第二首妖,防止 “已失效的連接請求報文段”出現(xiàn)在本連接中。A 在發(fā)送完最后一個 ACK 報文段后爷恳,再經(jīng)過時間 2MSL有缆,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文段,都從網(wǎng)絡(luò)中消失。這樣就可以使下一個新的連接中不會出現(xiàn)這種舊的連接請求報文段妒貌。