




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)網(wǎng)絡(luò)(第 6 版)第 5 章 運(yùn)輸層1第 5 章 運(yùn)輸層 5.1 運(yùn)輸層協(xié)議概述 5.1.1 進(jìn)程之間的通信 5.1.2 運(yùn)輸層的兩個(gè)主要協(xié)議 5.1.3 運(yùn)輸層的端口5.2 用戶(hù)數(shù)據(jù)報(bào)協(xié)議 UDP 5.2.1 UDP 概述5.2.2 UDP 的首部格式第 5 章 運(yùn)輸層(續(xù))5.3 傳輸控制協(xié)議 TCP 概述 5.3.1 TCP 最主要的特點(diǎn) 5.3.2 TCP 的連接5.4 可靠傳輸?shù)墓ぷ髟?5.4.1 停止等待協(xié)議 5.4.2 連續(xù) ARQ 協(xié)議5.5 TCP 報(bào)文段的首部格式第 5 章 運(yùn)輸層(續(xù))5.6 TCP 可靠傳輸?shù)膶?shí)現(xiàn) 5.6.1 以字節(jié)為單位的滑動(dòng)窗口 5.6.2
2、超時(shí)重傳時(shí)間的選擇 5.6.3 選擇確認(rèn) SACK5.7 TCP的流量控制 5.7.1 利用滑動(dòng)窗口實(shí)現(xiàn)流量控制 5.7.1 必須考慮傳輸效率第 5 章 運(yùn)輸層(續(xù))5.8 TCP 的擁塞控制 5.8.1 擁塞控制的一般原理 5.8.2 幾種擁塞控制方法 5.8.3 隨機(jī)早期檢測(cè) RED5.9 TCP 的運(yùn)輸連接管理 5.9.1 TCP 的連接建立 5.9.2 TCP 的連接釋放 5.9.3 TCP 的有限狀態(tài)機(jī) 5.1 運(yùn)輸層協(xié)議概述5.1.1 進(jìn)程之間的通信從通信和信息處理的角度看,運(yùn)輸層向它上面的應(yīng)用層提供通信效勞,它屬于面向通信局部的最高層,同時(shí)也是用戶(hù)功能中的最低層。當(dāng)網(wǎng)絡(luò)的邊緣局部
3、中的兩個(gè)主機(jī)使用網(wǎng)絡(luò)的核心局部的功能進(jìn)行端到端的通信時(shí),只有位于網(wǎng)絡(luò)邊緣局部的主機(jī)的協(xié)議棧才有運(yùn)輸層,而網(wǎng)絡(luò)核心局部中的路由器在轉(zhuǎn)發(fā)分組時(shí)都只用到下三層的功能。 運(yùn)輸層為相互通信的應(yīng)用進(jìn)程提供了邏輯通信 54321運(yùn)輸層提供給用進(jìn)程間的邏輯通信主機(jī) A主機(jī) B應(yīng)用進(jìn)程應(yīng)用進(jìn)程路由器 1路由器 2AP1LAN2WANAP2AP3AP4IP 層LAN1AP1AP2AP4端口端口54321IP 協(xié)議的作用范圍運(yùn)輸層協(xié)議 TCP 和 UDP 的作用范圍AP3應(yīng)用進(jìn)程之間的通信兩個(gè)主機(jī)進(jìn)行通信實(shí)際上就是兩個(gè)主機(jī)中的應(yīng)用進(jìn)程互相通信。 應(yīng)用進(jìn)程之間的通信又稱(chēng)為端到端的通信。 運(yùn)輸層的一個(gè)很重要的功能就是復(fù)
4、用和分用。應(yīng)用層不同進(jìn)程的報(bào)文通過(guò)不同的端口向下交到運(yùn)輸層,再往下就共用網(wǎng)絡(luò)層提供的效勞。“運(yùn)輸層提供給用進(jìn)程間的邏輯通信?!斑壿嬐ㄐ诺囊馑际牵哼\(yùn)輸層之間的通信好似是沿水平方向傳送數(shù)據(jù)。但事實(shí)上這兩個(gè)運(yùn)輸層之間并沒(méi)有一條水平方向的物理連接。運(yùn)輸層協(xié)議和網(wǎng)絡(luò)層協(xié)議的主要區(qū)別 應(yīng)用進(jìn)程應(yīng)用進(jìn)程IP 協(xié)議的作用范圍(提供主機(jī)之間的邏輯通信)TCP 和 UDP 協(xié)議的作用范圍(提供進(jìn)程之間的邏輯通信)因 特 網(wǎng)運(yùn)輸層的主要功能 運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯通信(但網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信)。運(yùn)輸層還要對(duì)收到的報(bào)文進(jìn)行過(guò)失檢測(cè)。運(yùn)輸層需要有兩種不同的運(yùn)輸協(xié)議,即面向連接的 TCP 和無(wú)連接
5、的 UDP。 兩種不同的運(yùn)輸協(xié)議運(yùn)輸層向高層用戶(hù)屏蔽了下面網(wǎng)絡(luò)核心的細(xì)節(jié)(如網(wǎng)絡(luò)拓?fù)洹⑺捎玫穆酚蛇x擇協(xié)議等),它使應(yīng)用進(jìn)程看見(jiàn)的就是好似在兩個(gè)運(yùn)輸層實(shí)體之間有一條端到端的邏輯通信信道。當(dāng)運(yùn)輸層采用面向連接的 TCP 協(xié)議時(shí),盡管下面的網(wǎng)絡(luò)是不可靠的(只提供盡最大努力效勞),但這種邏輯通信信道就相當(dāng)于一條全雙工的可靠信道。當(dāng)運(yùn)輸層采用無(wú)連接的 UDP 協(xié)議時(shí),這種邏輯通信信道是一條不可靠信道。 TCP/IP 的運(yùn)輸層有兩個(gè)不同的協(xié)議:(1) 用戶(hù)數(shù)據(jù)報(bào)協(xié)議 UDP (User Datagram Protocol)(2) 傳輸控制協(xié)議 TCP (Transmission Control Prot
6、ocol)5.1.2 運(yùn)輸層的兩個(gè)主要協(xié)議 兩個(gè)對(duì)等運(yùn)輸實(shí)體在通信時(shí)傳送的數(shù)據(jù)單位叫作運(yùn)輸協(xié)議數(shù)據(jù)單元 TPDU (Transport Protocol Data Unit)。TCP 傳送的數(shù)據(jù)單位協(xié)議是 TCP 報(bào)文段(segment) UDP 傳送的數(shù)據(jù)單位協(xié)議是 UDP 報(bào)文或用戶(hù)數(shù)據(jù)報(bào)。 TCP 與 UDP TCP/IP 體系中的運(yùn)輸層協(xié)議 TCPUDPIP應(yīng)用層與各種網(wǎng)絡(luò)接口運(yùn)輸層TCP 與 UDP UDP 在傳送數(shù)據(jù)之前不需要先建立連接。對(duì)方的運(yùn)輸層在收到 UDP 報(bào)文后,不需要給出任何確認(rèn)。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 是一種最有效的工作方式。TCP 則提
7、供面向連接的效勞。TCP 不提供播送或多播效勞。由于 TCP 要提供可靠的、面向連接的運(yùn)輸效勞,因此不可防止地增加了許多的開(kāi)銷(xiāo)。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多,還要占用許多的處理機(jī)資源。 還要強(qiáng)調(diào)兩點(diǎn) 運(yùn)輸層的 UDP 用戶(hù)數(shù)據(jù)報(bào)與網(wǎng)際層的IP數(shù)據(jù)報(bào)有很大區(qū)別。IP 數(shù)據(jù)報(bào)要經(jīng)過(guò)互連網(wǎng)中許多路由器的存儲(chǔ)轉(zhuǎn)發(fā),但 UDP 用戶(hù)數(shù)據(jù)報(bào)是在運(yùn)輸層的端到端抽象的邏輯信道中傳送的。TCP 報(bào)文段是在運(yùn)輸層抽象的端到端邏輯信道中傳送,這種信道是可靠的全雙工信道。但這樣的信道卻不知道究竟經(jīng)過(guò)了哪些路由器,而這些路由器也根本不知道上面的運(yùn)輸層是否建立了 TCP 連接。 5.1.3 運(yùn)輸層的端口 運(yùn)行在計(jì)算
8、機(jī)中的進(jìn)程是用進(jìn)程標(biāo)識(shí)符來(lái)標(biāo)志的。運(yùn)行在應(yīng)用層的各種應(yīng)用進(jìn)程卻不應(yīng)當(dāng)讓計(jì)算機(jī)操作系統(tǒng)指派它的進(jìn)程標(biāo)識(shí)符。這是因?yàn)樵谝蛱鼐W(wǎng)上使用的計(jì)算機(jī)的操作系統(tǒng)種類(lèi)很多,而不同的操作系統(tǒng)又使用不同格式的進(jìn)程標(biāo)識(shí)符。為了使運(yùn)行不同操作系統(tǒng)的計(jì)算機(jī)的應(yīng)用進(jìn)程能夠互相通信,就必須用統(tǒng)一的方法對(duì) TCP/IP 體系的應(yīng)用進(jìn)程進(jìn)行標(biāo)志。 需要解決的問(wèn)題 由于進(jìn)程的創(chuàng)立和撤銷(xiāo)都是動(dòng)態(tài)的,發(fā)送方幾乎無(wú)法識(shí)別其他機(jī)器上的進(jìn)程。有時(shí)我們會(huì)改換接收?qǐng)?bào)文的進(jìn)程,但并不需要通知所有發(fā)送方。我們往往需要利用目的主機(jī)提供的功能來(lái)識(shí)別終點(diǎn),而不需要知道實(shí)現(xiàn)這個(gè)功能的進(jìn)程。端口號(hào)(protocol port number)簡(jiǎn)稱(chēng)為端口(por
9、t)解決這個(gè)問(wèn)題的方法就是在運(yùn)輸層使用協(xié)議端口號(hào)(protocol port number),或通常簡(jiǎn)稱(chēng)為端口(port)。雖然通信的終點(diǎn)是應(yīng)用進(jìn)程,但我們可以把端口想象是通信的終點(diǎn),因?yàn)槲覀冎灰岩獋魉偷膱?bào)文交到目的主機(jī)的某一個(gè)適宜的目的端口,剩下的工作(即最后交付目的進(jìn)程)就由 TCP 來(lái)完成。軟件端口與硬件端口在協(xié)議棧層間的抽象的協(xié)議端口是軟件端口。路由器或交換機(jī)上的端口是硬件端口。硬件端口是不同硬件設(shè)備進(jìn)行交互的接口,而軟件端口是應(yīng)用層的各種協(xié)議進(jìn)程與運(yùn)輸實(shí)體進(jìn)行層間交互的一種地址。 TCP 的端口 端口用一個(gè) 16 位端口號(hào)進(jìn)行標(biāo)志。端口號(hào)只具有本地意義,即端口號(hào)只是為了標(biāo)志本計(jì)算機(jī)
10、應(yīng)用層中的各進(jìn)程。在因特網(wǎng)中不同計(jì)算機(jī)的相同端口號(hào)是沒(méi)有聯(lián)系的。三類(lèi)端口 熟知端口,數(shù)值一般為 01023。登記端口號(hào),數(shù)值為102449151,為沒(méi)有熟知端口號(hào)的應(yīng)用程序使用的。使用這個(gè)范圍的端口號(hào)必須在 IANA 登記,以防止重復(fù)??蛻?hù)端口號(hào)或短暫端口號(hào),數(shù)值為4915265535,留給客戶(hù)進(jìn)程選擇暫時(shí)使用。當(dāng)效勞器進(jìn)程收到客戶(hù)進(jìn)程的報(bào)文時(shí),就知道了客戶(hù)進(jìn)程所使用的動(dòng)態(tài)端口號(hào)。通信結(jié)束后,這個(gè)端口號(hào)可供其他客戶(hù)進(jìn)程以后使用。 5.2 用戶(hù)數(shù)據(jù)報(bào)協(xié)議 UDP 5.2.1 UDP 概述 UDP 只在 IP 的數(shù)據(jù)報(bào)效勞之上增加了很少一點(diǎn)的功能,即端口的功能和過(guò)失檢測(cè)的功能。雖然 UDP 用戶(hù)數(shù)
11、據(jù)報(bào)只能提供不可靠的交付,但 UDP 在某些方面有其特殊的優(yōu)點(diǎn)。UDP 的主要特點(diǎn) UDP 是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。UDP 使用盡最大努力交付,即不保證可靠交付,同時(shí)也不使用擁塞控制。UDP 是面向報(bào)文的。UDP 沒(méi)有擁塞控制,很適合多媒體通信的要求。 UDP 支持一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多的交互通信。UDP 的首部開(kāi)銷(xiāo)小,只有 8 個(gè)字節(jié)。 面向報(bào)文的 UDP發(fā)送方 UDP 對(duì)應(yīng)用程序交下來(lái)的報(bào)文,在添加首部后就向下交付 IP 層。UDP 對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保存這些報(bào)文的邊界。應(yīng)用層交給 UDP 多長(zhǎng)的報(bào)文,UDP 就照樣發(fā)送,即一次發(fā)送一個(gè)
12、報(bào)文。接收方 UDP 對(duì) IP 層交上來(lái)的 UDP 用戶(hù)數(shù)據(jù)報(bào),在去除首部后就原封不動(dòng)地交付上層的應(yīng)用進(jìn)程,一次交付一個(gè)完整的報(bào)文。應(yīng)用程序必須選擇適宜大小的報(bào)文。UDP 是面向報(bào)文的 IP 數(shù)據(jù)報(bào)的數(shù)據(jù)局部IP 首部IP 層UDP 首部UDP 用戶(hù)數(shù)據(jù)報(bào)的數(shù)據(jù)局部運(yùn)輸層應(yīng)用層報(bào)文應(yīng)用層5.2.2 UDP 的首部格式 偽首部源端口目的端口長(zhǎng) 度檢驗(yàn)和數(shù) 據(jù)首 部UDP長(zhǎng)度源 IP 地址目的 IP 地址017IP 數(shù)據(jù)報(bào)字節(jié)44112122222字節(jié)發(fā)送在前數(shù) 據(jù)首 部UDP 用戶(hù)數(shù)據(jù)報(bào)UDP 基于端口的分用 IP 層UDP 數(shù)據(jù)報(bào)到達(dá)端口 2端口 3端口 1UDP 分用偽首部源端口目的端口長(zhǎng)
13、度檢驗(yàn)和數(shù) 據(jù)首 部UDP長(zhǎng)度源 IP 地址目的 IP 地址017IP 數(shù)據(jù)報(bào)字節(jié)44112122222字節(jié)發(fā)送在前數(shù) 據(jù)首 部UDP 用戶(hù)數(shù)據(jù)報(bào)用戶(hù)數(shù)據(jù)報(bào) UDP 有兩個(gè)字段:數(shù)據(jù)字段和首部字段。首部字段有 8 個(gè)字節(jié),由 4 個(gè)字段組成,每個(gè)字段都是兩個(gè)字節(jié)。 偽首部源端口目的端口長(zhǎng) 度檢驗(yàn)和數(shù) 據(jù)首 部UDP長(zhǎng)度源 IP 地址目的 IP 地址017IP 數(shù)據(jù)報(bào)字節(jié)44112122222字節(jié)發(fā)送在前數(shù) 據(jù)首 部UDP 用戶(hù)數(shù)據(jù)報(bào)在計(jì)算檢驗(yàn)和時(shí),臨時(shí)把“偽首部和 UDP 用戶(hù)數(shù)據(jù)報(bào)連接在一起。偽首部?jī)H僅是為了計(jì)算檢驗(yàn)和。計(jì)算 UDP 檢驗(yàn)和的例子 10011 153.1900001 8.10
14、410101 171.300001110 00001011 14.1100000 0 和 1700000 1500000100 00111111 108700000 1300000 1500000 0(檢驗(yàn)和)01010100 01000101 數(shù)據(jù)01010 數(shù)據(jù)01001 數(shù)據(jù)01000111 00000000 數(shù)據(jù)和 0(填充)10010110 11101101 求和得出的結(jié)果01101 檢驗(yàn)和 153.19.8.104171.3.14.1112 字節(jié)偽首部8 字節(jié)UDP 首部7 字節(jié)數(shù)據(jù)填充按二進(jìn)制反碼運(yùn)算求和將得出的結(jié)果求反碼全 0 17 15 1087 13 15 全 0數(shù)據(jù) 數(shù)據(jù)
15、 數(shù)據(jù) 數(shù)據(jù)數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 全 05.3 傳輸控制協(xié)議 TCP 概述 5.3.1 TCP 最主要的特點(diǎn) TCP 是面向連接的運(yùn)輸層協(xié)議。每一條 TCP 連接只能有兩個(gè)端點(diǎn)(endpoint),每一條 TCP 連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一)。 TCP 提供可靠交付的效勞。 TCP 提供全雙工通信。面向字節(jié)流。 768HTCP 面向流的概念 發(fā)送 TCP 報(bào)文段發(fā)送方接收方把字節(jié)寫(xiě)入發(fā)送緩存從接收緩存讀取字節(jié)應(yīng)用進(jìn)程應(yīng)用進(jìn)程1230181716151419202145131211H109H加上 TCP 首部構(gòu)成 TCP 報(bào)文段TCPTCP字節(jié)流字節(jié)流H表示 TCP 報(bào)文段的首部x表示序號(hào)為 x 的
16、數(shù)據(jù)字節(jié)TCP 連接應(yīng)當(dāng)注意TCP 連接是一條虛連接而不是一條真正的物理連接。TCP 對(duì)應(yīng)用進(jìn)程一次把多長(zhǎng)的報(bào)文發(fā)送到TCP 的緩存中是不關(guān)心的。TCP 根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞的程度來(lái)決定一個(gè)報(bào)文段應(yīng)包含多少個(gè)字節(jié)(UDP 發(fā)送的報(bào)文長(zhǎng)度是應(yīng)用進(jìn)程給出的)。TCP 可把太長(zhǎng)的數(shù)據(jù)塊劃分短一些再傳送。TCP 也可等待積累有足夠多的字節(jié)后再構(gòu)成報(bào)文段發(fā)送出去。 5.3.2 TCP 的連接 TCP 把連接作為最根本的抽象。每一條 TCP 連接有兩個(gè)端點(diǎn)。TCP 連接的端點(diǎn)不是主機(jī),不是主機(jī)的IP 地址,不是應(yīng)用進(jìn)程,也不是運(yùn)輸層的協(xié)議端口。TCP 連接的端點(diǎn)叫做套接字(socket)或插
17、口。端口號(hào)拼接到(contatenated with) IP 地址即構(gòu)成了套接字。 套接字 (socket) 套接字 socket = (IP地址: 端口號(hào)) (5-1)每一條 TCP 連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定。即: TCP 連接 := socket1, socket2 = (IP1: port1), (IP2: port2) (5-2)同一個(gè)名詞 socket有多種不同的意思 應(yīng)用編程接口 API 稱(chēng)為 socket API, 簡(jiǎn)稱(chēng)為 socket。socket API 中使用的一個(gè)函數(shù)名也叫作 socket。調(diào)用 socket 函數(shù)的端點(diǎn)稱(chēng)為 socket。調(diào)用
18、 socket 函數(shù)時(shí)其返回值稱(chēng)為 socket 描述符,可簡(jiǎn)稱(chēng)為 socket。在操作系統(tǒng)內(nèi)核中連網(wǎng)協(xié)議的 Berkeley 實(shí)現(xiàn),稱(chēng)為 socket 實(shí)現(xiàn)。 5.4 可靠傳輸?shù)墓ぷ髟?.4.1 停止等待協(xié)議 (a) 無(wú)過(guò)失情況A發(fā)送 M1確認(rèn) M1B發(fā)送 M2發(fā)送 M3確認(rèn) M2確認(rèn) M3A發(fā)送 M1B超時(shí)重傳 M1發(fā)送 M2確認(rèn) M1丟棄有過(guò)失的報(bào)文(b) 超時(shí)重傳tttt請(qǐng)注意在發(fā)送完一個(gè)分組后,必須暫時(shí)保存已發(fā)送的分組的副本。分組和確認(rèn)分組都必須進(jìn)行編號(hào)。超時(shí)計(jì)時(shí)器的重傳時(shí)間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r(shí)間更長(zhǎng)一些。 丟棄重復(fù)的 M1重傳確認(rèn)M1確認(rèn)喪失和確認(rèn)遲到 A發(fā)送 M1B
19、超時(shí)重傳 M1發(fā)送 M2丟棄重復(fù)的 M1重傳確認(rèn) M1(a) 確認(rèn)喪失確認(rèn) M1A發(fā)送 M1B超時(shí)重傳 M1發(fā)送 M2(b) 確認(rèn)遲到確認(rèn) M1收下遲到確實(shí)認(rèn)但什么也不做tttt可靠通信的實(shí)現(xiàn)使用上述確實(shí)認(rèn)和重傳機(jī)制,我們就可以在不可靠的傳輸網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信。這種可靠傳輸協(xié)議常稱(chēng)為自動(dòng)重傳請(qǐng)求ARQ (Automatic Repeat reQuest)。ARQ 說(shuō)明重傳的請(qǐng)求是自動(dòng)進(jìn)行的。接收方不需要請(qǐng)求發(fā)送方重傳某個(gè)出錯(cuò)的分組 。信道利用率 停止等待協(xié)議的優(yōu)點(diǎn)是簡(jiǎn)單,但缺點(diǎn)是信道利用率太低。 TDRTTATD + RTT + TAB分組確認(rèn)tt分組確認(rèn)信道的利用率 U (5-3)流水線(xiàn)傳
20、輸 發(fā)送方可連續(xù)發(fā)送多個(gè)分組,不必每發(fā)完一個(gè)分組就停頓下來(lái)等待對(duì)方確實(shí)認(rèn)。由于信道上一直有數(shù)據(jù)不間斷地傳送,這種傳輸方式可獲得很高的信道利用率。 B分組ttAACK5.4.2 連續(xù) ARQ 協(xié)議 123456789101112(a) 發(fā)送方維持發(fā)送窗口(發(fā)送窗口是 5)發(fā)送窗口(b) 收到一個(gè)確認(rèn)后發(fā)送窗口向前滑動(dòng)向前123456789101112發(fā)送窗口累積確認(rèn) 接收方一般采用累積確認(rèn)的方式。即不必對(duì)收到的分組逐個(gè)發(fā)送確認(rèn),而是對(duì)按序到達(dá)的最后一個(gè)分組發(fā)送確認(rèn),這樣就表示:到這個(gè)分組為止的所有分組都已正確收到了。累積確認(rèn)有的優(yōu)點(diǎn)是:容易實(shí)現(xiàn),即使確認(rèn)喪失也不必重傳。缺點(diǎn)是:不能向發(fā)送方反映出
21、接收方已經(jīng)正確收到的所有分組的信息。Go-back-N(回退 N) 如果發(fā)送方發(fā)送了前 5 個(gè)分組,而中間的第 3 個(gè)分組喪失了。這時(shí)接收方只能對(duì)前兩個(gè)分組發(fā)出確認(rèn)。發(fā)送方無(wú)法知道后面三個(gè)分組的下落,而只好把后面的三個(gè)分組都再重傳一次。這就叫做 Go-back-N(回退 N),表示需要再退回來(lái)重傳已發(fā)送過(guò)的 N 個(gè)分組??梢?jiàn)當(dāng)通信線(xiàn)路質(zhì)量不好時(shí),連續(xù) ARQ 協(xié)議會(huì)帶來(lái)負(fù)面的影響。 TCP 可靠通信的具體實(shí)現(xiàn) TCP 連接的每一端都必須設(shè)有兩個(gè)窗口一個(gè)發(fā)送窗口和一個(gè)接收窗口。 TCP 的可靠傳輸機(jī)制用字節(jié)的序號(hào)進(jìn)行控制。TCP 所有確實(shí)認(rèn)都是基于序號(hào)而不是基于報(bào)文段。 TCP 兩端的四個(gè)窗口經(jīng)
22、常處于動(dòng)態(tài)變化之中。TCP連接的往返時(shí)間 RTT 也不是固定不變的。需要使用特定的算法估算較為合理的重傳時(shí)間。 TCP首部20 字節(jié)的固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FIN32 位SYNRSTPSHACKURG位 0 8 16 24 31填 充TCP 數(shù)據(jù)局部TCP 首部TCP 報(bào)文段IP 數(shù)據(jù)局部IP 首部發(fā)送在前5.5 TCP 報(bào)文段的首部格式 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHA
23、CKURG位 0 8 16 24 31填 充源端口和目的端口字段各占 2 字節(jié)。端口是運(yùn)輸層與應(yīng)用層的效勞接口。運(yùn)輸層的復(fù)用和分用功能都要通過(guò)端口才能實(shí)現(xiàn)。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充序號(hào)字段占 4 字節(jié)。TCP 連接中傳送的數(shù)據(jù)流中的每一個(gè)字節(jié)都編上一個(gè)序號(hào)。序號(hào)字段的值則指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序
24、 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充確認(rèn)號(hào)字段占 4 字節(jié),是期望收到對(duì)方的下一個(gè)報(bào)文段的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充數(shù)據(jù)偏移(即首部長(zhǎng)度)占 4 位,它指出 TCP 報(bào)文段的數(shù)據(jù)起始處距離 TCP 報(bào)文段的起始處有多遠(yuǎn)。“數(shù)據(jù)偏移的單位是 32 位字(以 4 字節(jié)為計(jì)算單位)。 TCP首部20字節(jié)固定首部目 的 端 口
25、數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充保存字段占 6 位,保存為今后使用,但目前應(yīng)置為 0。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充緊急 URG 當(dāng) URG 1 時(shí),說(shuō)明緊急指針字段有效。它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級(jí)的數(shù)據(jù))。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏
26、移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充確認(rèn) ACK 只有當(dāng) ACK 1 時(shí)確認(rèn)號(hào)字段才有效。當(dāng) ACK 0 時(shí),確認(rèn)號(hào)無(wú)效。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充推送 PSH (PuSH) 接收 TCP 收到 PSH = 1 的報(bào)文段,就盡快地交付接收應(yīng)用進(jìn)程,而不再等到整個(gè)緩存都填滿(mǎn)了后再向上交付。 TC
27、P首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充復(fù)位 RST (ReSeT) 當(dāng) RST 1 時(shí),說(shuō)明 TCP 連接中出現(xiàn)嚴(yán)重過(guò)失(如由于主機(jī)崩潰或其他原因),必須釋放連接,然后再重新建立運(yùn)輸連接。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充同步 SYN 同步 SYN = 1 表示
28、這是一個(gè)連接請(qǐng)求或連接接受報(bào)文。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充終止 FIN (FINis) 用來(lái)釋放一個(gè)連接。FIN 1 說(shuō)明此報(bào)文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢,并要求釋放運(yùn)輸連接。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充窗口字段 占 2 字節(jié),用來(lái)讓對(duì)方
29、設(shè)置發(fā)送窗口的依據(jù),單位為字節(jié)。TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充檢驗(yàn)和 占 2 字節(jié)。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩局部。在計(jì)算檢驗(yàn)和時(shí),要在 TCP 報(bào)文段的前面加上 12 字節(jié)的偽首部。TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充緊急指針字段 占 16
30、 位,指出在本報(bào)文段中緊急數(shù)據(jù)共有多少個(gè)字節(jié)(緊急數(shù)據(jù)放在本報(bào)文段數(shù)據(jù)的最前面)。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG比特 0 8 16 24 31填 充選項(xiàng)字段 長(zhǎng)度可變。TCP 最初只規(guī)定了一種選項(xiàng),即最大報(bào)文段長(zhǎng)度 MSS。MSS 告訴對(duì)方 TCP:“我的緩存所能接收的報(bào)文段的數(shù)據(jù)字段的最大長(zhǎng)度是 MSS 個(gè)字節(jié)。 MSS (Maximum Segment Size)是 TCP 報(bào)文段中的數(shù)據(jù)字段的最大長(zhǎng)度。數(shù)據(jù)字段加上 TCP 首部才等于整個(gè)的 TC
31、P 報(bào)文段。其他選項(xiàng)窗口擴(kuò)大選項(xiàng) 占 3 字節(jié),其中有一個(gè)字節(jié)表示移位值 S。新的窗口值等于TCP 首部中的窗口位數(shù)增大到(16 + S),相當(dāng)于把窗口值向左移動(dòng) S 位后獲得實(shí)際的窗口大小。時(shí)間戳選項(xiàng)占10 字節(jié),其中最主要的字段時(shí)間戳值字段(4 字節(jié))和時(shí)間戳回送答復(fù)字段(4 字節(jié))。選擇確認(rèn)選項(xiàng)在后面的 5.6.3 節(jié)介紹。 TCP首部20字節(jié)固定首部目 的 端 口數(shù)據(jù)偏移檢 驗(yàn) 和選 項(xiàng) (長(zhǎng) 度 可 變)源 端 口序 號(hào)緊 急 指 針窗 口確 認(rèn) 號(hào)保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充填充字段 這是為了使整個(gè)首部長(zhǎng)度是 4 字節(jié)的整數(shù)倍。 5.
32、6 TCP 可靠傳輸?shù)膶?shí)現(xiàn)5.6.1 以字節(jié)為單位的滑動(dòng)窗口前移不允許發(fā)送已發(fā)送并收到確認(rèn)A 的發(fā)送窗口 = 20允許發(fā)送的序號(hào)26272829303132333435363738394041424344454647484950515253545556B 期望收到的序號(hào)前沿后沿前移收縮根據(jù) B 給出的窗口值A(chǔ) 構(gòu)造出自己的發(fā)送窗口 TCP 標(biāo)準(zhǔn)強(qiáng)烈不贊成發(fā)送窗口前沿向后收縮 不允許發(fā)送已發(fā)送并收到確認(rèn)A 的發(fā)送窗口位置不變?cè)试S發(fā)送但尚未發(fā)送262728293031323334353637383940414243444546474849505152535455已發(fā)送但未收到確認(rèn)56P1P2P3不
33、允許接收已發(fā)送確認(rèn)并交付主機(jī)B 的接收窗口允許接收26272829303132333435363738394041424344454647484950515253545556未按序收到可用窗口A 發(fā)送了 11 個(gè)字節(jié)的數(shù)據(jù) P3 P1 = A 的發(fā)送窗口(又稱(chēng)為通知窗口)P2 P1 = 已發(fā)送但尚未收到確認(rèn)的字節(jié)數(shù)P3 P2 = 允許發(fā)送但尚未發(fā)送的字節(jié)數(shù)(又稱(chēng)為可用窗口) 允許發(fā)送但尚未發(fā)送A 的發(fā)送窗口向前滑動(dòng)262728293031323334353637383940414243444546474849505152535455已發(fā)送并收到確認(rèn)不允許發(fā)送已發(fā)送但未收到確認(rèn)56P1P2P3允
34、許接收B 的接收窗口向前滑動(dòng)262728293031323334353637383940414243444546474849505152535455已發(fā)送確認(rèn)并交付主機(jī)不允許接收56未按序收到A 收到新確實(shí)認(rèn)號(hào),發(fā)送窗口向前滑動(dòng) 先存下,等待缺少的數(shù)據(jù)的到達(dá)不允許發(fā)送已發(fā)送并收到確認(rèn)A 的發(fā)送窗口已滿(mǎn),有效窗口為零262728293031323334353637383940414243444546474849505152535455已發(fā)送但未收到確認(rèn)56P1P2P3A 的發(fā)送窗口內(nèi)的序號(hào)都已用完,但還沒(méi)有再收到確認(rèn),必須停止發(fā)送。 發(fā)送緩存 最后被確認(rèn)的字節(jié)發(fā)送應(yīng)用程序發(fā)送緩存最后發(fā)送的字節(jié)發(fā)
35、送窗口已發(fā)送TCP序號(hào)增大接收緩存接收應(yīng)用程序已收到接收窗口TCP接收緩存下一個(gè)讀取的字節(jié)序號(hào)增大下一個(gè)期望收到的字節(jié)(確認(rèn)號(hào))發(fā)送緩存與接收緩存的作用發(fā)送緩存用來(lái)暫時(shí)存放: 發(fā)送應(yīng)用程序傳送給發(fā)送方 TCP 準(zhǔn)備發(fā)送的數(shù)據(jù); TCP 已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)。接收緩存用來(lái)暫時(shí)存放: 按序到達(dá)的、但尚未被接收應(yīng)用程序讀取的數(shù)據(jù); 不按序到達(dá)的數(shù)據(jù)。 需要強(qiáng)調(diào)三點(diǎn)A 的發(fā)送窗口并不總是和 B 的接收窗口一樣大(因?yàn)橛幸欢ǖ臅r(shí)間滯后)。TCP 標(biāo)準(zhǔn)沒(méi)有規(guī)定對(duì)不按序到達(dá)的數(shù)據(jù)應(yīng)如何處理。通常是先臨時(shí)存放在接收窗口中,等到字節(jié)流中所缺少的字節(jié)收到后,再按序交付上層的應(yīng)用進(jìn)程。TCP 要求接收方必須
36、有累積確認(rèn)的功能,這樣可以減小傳輸開(kāi)銷(xiāo)。 5.6.2 超時(shí)重傳時(shí)間的選擇重傳機(jī)制是 TCP 中最重要和最復(fù)雜的問(wèn)題之一。TCP 每發(fā)送一個(gè)報(bào)文段,就對(duì)這個(gè)報(bào)文段設(shè)置一次計(jì)時(shí)器。只要計(jì)時(shí)器設(shè)置的重傳時(shí)間到但還沒(méi)有收到確認(rèn),就要重傳這一報(bào)文段。往返時(shí)延的方差很大由于 TCP 的下層是一個(gè)互聯(lián)網(wǎng)環(huán)境,IP 數(shù)據(jù)報(bào)所選擇的路由變化很大。因而運(yùn)輸層的往返時(shí)間的方差也很大。時(shí)間數(shù)據(jù)鏈路層運(yùn)輸層T1T2T3往返時(shí)間的概率分布加權(quán)平均往返時(shí)間TCP 保存了 RTT 的一個(gè)加權(quán)平均往返時(shí)間 RTTS(這又稱(chēng)為平滑的往返時(shí)間)。第一次測(cè)量到 RTT 樣本時(shí),RTTS 值就取為所測(cè)量到的 RTT 樣本值。以后每測(cè)量
37、到一個(gè)新的 RTT 樣本,就按下式重新計(jì)算一次 RTTS: 新的 RTTS (1 ) (舊的 RTTS) (新的 RTT 樣本) (5-4)式中,0 1。若 很接近于零,表示 RTT 值更新較慢。若選擇 接近于 1,則表示 RTT 值更新較快。RFC 2988 推薦的 值為 1/8,即 0.125。 超時(shí)重傳時(shí)間 RTO (RetransmissionTime-Out) RTO 應(yīng)略大于上面得出的加權(quán)平均往返時(shí)間 RTTS。RFC 2988 建議使用下式計(jì)算 RTO: RTO RTTS + 4 RTTD (5-5)RTTD 是 RTT 的偏差的加權(quán)平均值。RFC 2988 建議這樣計(jì)算 RTT
38、D。第一次測(cè)量時(shí),RTTD 值取為測(cè)量到的 RTT 樣本值的一半。在以后的測(cè)量中,則使用下式計(jì)算加權(quán)平均的 RTTD:新的 RTTD = (1 ) (舊的RTTD) + RTTS 新的 RTT 樣本 (5-6) 是個(gè)小于 1 的系數(shù),其推薦值是 1/4,即 0.25。往返時(shí)間 RTT?往返時(shí)間的測(cè)量相當(dāng)復(fù)雜 TCP 報(bào)文段 1 沒(méi)有收到確認(rèn)。重傳(即報(bào)文段 2)后,收到了確認(rèn)報(bào)文段 ACK。如何判定此確認(rèn)報(bào)文段是對(duì)原來(lái)的報(bào)文段 1 確實(shí)認(rèn),還是對(duì)重傳的報(bào)文段 2 確實(shí)認(rèn)? 發(fā)送一個(gè)TCP 報(bào)文段超時(shí)重傳TCP 報(bào)文段收到 ACK時(shí)間12往返時(shí)間 RTT?是對(duì)哪一個(gè)報(bào)文段確實(shí)認(rèn)?Karn 算法
39、在計(jì)算平均往返時(shí)間 RTT 時(shí),只要報(bào)文段重傳了,就不采用其往返時(shí)間樣本。這樣得出的加權(quán)平均平均往返時(shí)間 RTTS 和超時(shí)重傳時(shí)間 RTO 就較準(zhǔn)確。 報(bào)文段每重傳一次,就把 RTO 增大一些:新的 RTO (舊的 RTO) 系數(shù) 的典型值是 2 。當(dāng)不再發(fā)生報(bào)文段的重傳時(shí),才根據(jù)報(bào)文段的往返時(shí)延更新平均往返時(shí)延 RTT 和超時(shí)重傳時(shí)間 RTO 的數(shù)值。實(shí)踐證明,這種策略較為合理。 修正的 Karn 算法 5.6.3 選擇確認(rèn) SACK(Selective ACK) 接收方收到了和前面的字節(jié)流不連續(xù)的兩個(gè)字節(jié)塊。如果這些字節(jié)的序號(hào)都在接收窗口之內(nèi),那么接收方就先收下這些數(shù)據(jù),但要把這些信息準(zhǔn)確
40、地告訴發(fā)送方,使發(fā)送方不要再重復(fù)發(fā)送這些已收到的數(shù)據(jù)。 1 1000 1501 3000 3501 4500確認(rèn)號(hào) = 1001L1 = 1501L2 = 3501R1 = 3001R1 = 4501接收到的字節(jié)流序號(hào)不連續(xù) 連續(xù)的字節(jié)流第一個(gè)字節(jié)塊第二個(gè)字節(jié)塊 和前后字節(jié)不連續(xù)的每一個(gè)字節(jié)塊都有兩個(gè)邊界: 左邊界和右邊界。圖中用四個(gè)指針標(biāo)記這些邊界。 第一個(gè)字節(jié)塊的左邊界 L1 = 1501,但右邊界 R1 = 3001。 左邊界指出字節(jié)塊的第一個(gè)字節(jié)的序號(hào),但右邊界減 1 才是 字節(jié)塊中的最后一個(gè)序號(hào)。 第二個(gè)字節(jié)塊的左邊界 L2 = 3501,而右邊界 R2 = 4501。 RFC 20
41、18 的規(guī)定如果要使用選擇確認(rèn),那么在建立 TCP 連接時(shí),就要在 TCP 首部的選項(xiàng)中加上“允許 SACK的選項(xiàng),而雙方必須都事先商定好。如果使用選擇確認(rèn),那么原來(lái)首部中的“確認(rèn)號(hào)字段的用法仍然不變。只是以后在 TCP 報(bào)文段的首部中都增加了 SACK 選項(xiàng),以便報(bào)告收到的不連續(xù)的字節(jié)塊的邊界。由于首部選項(xiàng)的長(zhǎng)度最多只有 40 字節(jié),而指明一個(gè)邊界就要用掉 4 字節(jié),因此在選項(xiàng)中最多只能指明 4 個(gè)字節(jié)塊的邊界信息。5.7 TCP 的流量控制5.7.1 利用滑動(dòng)窗口實(shí)現(xiàn)流量控制一般說(shuō)來(lái),我們總是希望數(shù)據(jù)傳輸?shù)酶煲恍?。但如果發(fā)送方把數(shù)據(jù)發(fā)送得過(guò)快,接收方就可能來(lái)不及接收,這就會(huì)造成數(shù)據(jù)的喪失
42、。流量控制(flow control)就是讓發(fā)送方的發(fā)送速率不要太快,既要讓接收方來(lái)得及接收,也不要使網(wǎng)絡(luò)發(fā)生擁塞。利用滑動(dòng)窗口機(jī)制可以很方便地在 TCP 連接上實(shí)現(xiàn)流量控制。 seq = 1, DATAseq = 201, DATAseq = 401, DATAseq = 301, DATAseq = 101, DATAseq = 201, DATAseq = 501, DATAACK = 1, ack = 201, rwnd = 300ACK = 1, ack = 601, rwnd = 0ACK = 1, ack = 501, rwnd = 100AB允許 A 發(fā)送序號(hào) 201 至 50
43、0 共 300 字節(jié)A 發(fā)送了序號(hào) 101 至 200,還能發(fā)送 200 字節(jié)A 發(fā)送了序號(hào) 301 至 400,還能再發(fā)送 100 字節(jié)新數(shù)據(jù)A 發(fā)送了序號(hào) 1 至 100,還能發(fā)送 300 字節(jié)A 發(fā)送了序號(hào) 401 至 500,不能再發(fā)送新數(shù)據(jù)了A 超時(shí)重傳舊的數(shù)據(jù),但不能發(fā)送新的數(shù)據(jù)允許 A 發(fā)送序號(hào) 501 至 600 共 100 字節(jié)A 發(fā)送了序號(hào) 501 至 600,不能再發(fā)送了不允許 A 再發(fā)送(到序號(hào) 600 為止的數(shù)據(jù)都收到了)喪失!流量控制舉例A 向 B 發(fā)送數(shù)據(jù)。在連接建立時(shí),B 告訴 A:“我的接收窗口 rwnd = 400(字節(jié))。持續(xù)計(jì)時(shí)器(persistence
44、 timer)。TCP 為每一個(gè)連接設(shè)有一個(gè)持續(xù)計(jì)時(shí)器。只要 TCP 連接的一方收到對(duì)方的零窗口通知,就啟動(dòng)持續(xù)計(jì)時(shí)器。若持續(xù)計(jì)時(shí)器設(shè)置的時(shí)間到期,就發(fā)送一個(gè)零窗口探測(cè)報(bào)文段(僅攜帶 1 字節(jié)的數(shù)據(jù)),而對(duì)方就在確認(rèn)這個(gè)探測(cè)報(bào)文段時(shí)給出了現(xiàn)在的窗口值。若窗口仍然是零,則收到這個(gè)報(bào)文段的一方就重新設(shè)置持續(xù)計(jì)時(shí)器。若窗口不是零,則死鎖的僵局就可以打破了。 5.7.2 必須考慮傳輸效率可以用不同的機(jī)制來(lái)控制 TCP 報(bào)文段的發(fā)送時(shí)機(jī):第一種機(jī)制是 TCP 維持一個(gè)變量,它等于最大報(bào)文段長(zhǎng)度 MSS。只要緩存中存放的數(shù)據(jù)到達(dá) MSS 字節(jié)時(shí),就組裝成一個(gè) TCP 報(bào)文段發(fā)送出去。第二種機(jī)制是由發(fā)送方的
45、應(yīng)用進(jìn)程指明要求發(fā)送報(bào)文段,即 TCP 支持的推送(push)操作。第三種機(jī)制是發(fā)送方的一個(gè)計(jì)時(shí)器期限到了,這時(shí)就把當(dāng)前已有的緩存數(shù)據(jù)裝入報(bào)文段(但長(zhǎng)度不能超過(guò) MSS)發(fā)送出去。5.8 TCP的擁塞控制5.8.1 擁塞控制的一般原理 在某段時(shí)間,若對(duì)網(wǎng)絡(luò)中某資源的需求超過(guò)了該資源所能提供的可用局部,網(wǎng)絡(luò)的性能就要變壞產(chǎn)生擁塞(congestion)。出現(xiàn)資源擁塞的條件: 對(duì)資源需求的總和 可用資源 (5-7) 若網(wǎng)絡(luò)中有許多資源同時(shí)產(chǎn)生擁塞,網(wǎng)絡(luò)的性能就要明顯變壞,整個(gè)網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降。 擁塞控制與流量控制的關(guān)系 擁塞控制所要做的都有一個(gè)前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)
46、荷。擁塞控制是一個(gè)全局性的過(guò)程,涉及到所有的主機(jī)、所有的路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。 流量控制往往指在給定的發(fā)送端和接收端之間的點(diǎn)對(duì)點(diǎn)通信量的控制。 流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來(lái)得及接收。 擁塞控制所起的作用 提供的負(fù)載吞吐量理想的擁塞控制實(shí)際的擁塞控制0死鎖(吞吐量 = 0)無(wú)擁塞控制擁塞輕度擁塞擁塞控制的一般原理 擁塞控制是很難設(shè)計(jì)的,因?yàn)樗且粋€(gè)動(dòng)態(tài)的(而不是靜態(tài)的)問(wèn)題。當(dāng)前網(wǎng)絡(luò)正朝著高速化的方向開(kāi)展,這很容易出現(xiàn)緩存不夠大而造成分組的喪失。但分組的喪失是網(wǎng)絡(luò)發(fā)生擁塞的征兆而不是原因。在許多情況下,甚至正是擁塞控制本身成為引起網(wǎng)絡(luò)性能惡
47、化甚至發(fā)生死鎖的原因。這點(diǎn)應(yīng)特別引起重視。 開(kāi)環(huán)控制和閉環(huán)控制 開(kāi)環(huán)控制方法就是在設(shè)計(jì)網(wǎng)絡(luò)時(shí)事先將有關(guān)發(fā)生擁塞的因素考慮周到,力求網(wǎng)絡(luò)在工作時(shí)不產(chǎn)生擁塞。 閉環(huán)控制是基于反應(yīng)環(huán)路的概念。屬于閉環(huán)控制的有以下幾種措施: 監(jiān)測(cè)網(wǎng)絡(luò)系統(tǒng)以便檢測(cè)到擁塞在何時(shí)、何處發(fā)生。將擁塞發(fā)生的信息傳送到可采取行動(dòng)的地方。調(diào)整網(wǎng)絡(luò)系統(tǒng)的運(yùn)行以解決出現(xiàn)的問(wèn)題。5.8.2 幾種擁塞控制方法1. 慢開(kāi)始和擁塞防止發(fā)送方維持一個(gè)叫做擁塞窗口 cwnd (congestion window)的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動(dòng)態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口。如再考慮到接收方的接收能力,則發(fā)送
48、窗口還可能小于擁塞窗口。發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒(méi)有出現(xiàn)擁塞,擁塞窗口就再增大一些,以便把更多的分組發(fā)送出去。但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口就減小一些,以減少注入到網(wǎng)絡(luò)中的分組數(shù)。 慢開(kāi)始算法的原理 在主機(jī)剛剛開(kāi)始發(fā)送報(bào)文段時(shí)可先設(shè)置擁塞窗口 cwnd = 1,即設(shè)置為一個(gè)最大報(bào)文段 MSS 的數(shù)值。在每收到一個(gè)對(duì)新的報(bào)文段確實(shí)認(rèn)后,將擁塞窗口加 1,即增加一個(gè) MSS 的數(shù)值。用這樣的方法逐步增大發(fā)送端的擁塞窗口 cwnd,可以使分組注入到網(wǎng)絡(luò)的速率更加合理。 發(fā)送方接收方發(fā)送 M1 確認(rèn) M1發(fā)送 M2M3 確認(rèn) M2M3 發(fā)送 M4M7 確認(rèn) M4M7 cwnd = 1 cwn
49、d = 2 cwnd = 4 發(fā)送 M8M15cwnd = 8 tt發(fā)送方每收到一個(gè)對(duì)新報(bào)文段確實(shí)認(rèn)(重傳的不算在內(nèi))就使 cwnd 加 1。 輪次 1輪次 2輪次 3傳輸輪次(transmission round)使用慢開(kāi)始算法后,每經(jīng)過(guò)一個(gè)傳輸輪次,擁塞窗口 cwnd 就加倍。 一個(gè)傳輸輪次所經(jīng)歷的時(shí)間其實(shí)就是往返時(shí)間 RTT?!皞鬏斴喆胃訌?qiáng)調(diào):把擁塞窗口 cwnd 所允許發(fā)送的報(bào)文段都連續(xù)發(fā)送出去,并收到了對(duì)已發(fā)送的最后一個(gè)字節(jié)確實(shí)認(rèn)。例如,擁塞窗口 cwnd = 4,這時(shí)的往返時(shí)間 RTT 就是發(fā)送方連續(xù)發(fā)送 4 個(gè)報(bào)文段,并收到這 4 個(gè)報(bào)文段確實(shí)認(rèn),總共經(jīng)歷的時(shí)間。 設(shè)置慢開(kāi)始門(mén)
50、限狀態(tài)變量ssthresh慢開(kāi)始門(mén)限 ssthresh 的用法如下:當(dāng) cwnd ssthresh 時(shí),停止使用慢開(kāi)始算法而改用擁塞防止算法。當(dāng) cwnd = ssthresh 時(shí),既可使用慢開(kāi)始算法,也可使用擁塞防止算法。擁塞防止算法的思路是讓擁塞窗口 cwnd 緩慢地增大,即每經(jīng)過(guò)一個(gè)往返時(shí)間 RTT 就把發(fā)送方的擁塞窗口 cwnd 加 1,而不是加倍,使擁塞窗口 cwnd 按線(xiàn)性規(guī)律緩慢增長(zhǎng)。當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞時(shí)無(wú)論在慢開(kāi)始階段還是在擁塞防止階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒(méi)有按時(shí)收到確認(rèn)),就要把慢開(kāi)始門(mén)限 ssthresh 設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送方窗口值的一半(但不能小于2)
51、。然后把擁塞窗口 cwnd 重新設(shè)置為 1,執(zhí)行慢開(kāi)始算法。這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時(shí)間把隊(duì)列中積壓的分組處理完畢。 2216慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 當(dāng) TCP 連接進(jìn)行初始化時(shí),將擁塞窗口置為 1。圖中的窗口單位不使用字節(jié)而使用報(bào)文段。慢開(kāi)始門(mén)限的初始值設(shè)置為 16 個(gè)報(bào)文段,即 ssthresh = 16?!俺朔p小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞
52、防止算法的實(shí)現(xiàn)舉例 發(fā)送端的發(fā)送窗口不能超過(guò)擁塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我們假定接收端窗口足夠大,因此現(xiàn)在發(fā)送窗口的數(shù)值等于擁塞窗口的數(shù)值。2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 在執(zhí)行慢開(kāi)始算法時(shí),擁塞窗口 cwnd 的初始值為 1,發(fā)送第一個(gè)報(bào)文段 M0。 2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 s
53、sthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 發(fā)送端每收到一個(gè)確認(rèn) ,就把 cwnd 加 1。于是發(fā)送端可以接著發(fā)送 M1 和 M2 兩個(gè)報(bào)文段。 2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 接收端共發(fā)回兩個(gè)確認(rèn)。發(fā)送端每收到一個(gè)對(duì)新報(bào)文段確實(shí)認(rèn),就把發(fā)送端的 cwnd 加 1?,F(xiàn)在
54、 cwnd 從 2 增大到 4,并可接著發(fā)送后面的 4 個(gè)報(bào)文段。 2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 發(fā)送端每收到一個(gè)對(duì)新報(bào)文段確實(shí)認(rèn),就把發(fā)送端的擁塞窗口加 1,因此擁塞窗口 cwnd 隨著傳輸輪次按指數(shù)規(guī)律增長(zhǎng)。 2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢
55、開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 當(dāng)擁塞窗口 cwnd 增長(zhǎng)到慢開(kāi)始門(mén)限值 ssthresh 時(shí)(即當(dāng) cwnd = 16 時(shí)),就改為執(zhí)行擁塞防止算法,擁塞窗口按線(xiàn)性規(guī)律增長(zhǎng)。 2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大傳輸輪次2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)sst
56、hresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 假定擁塞窗口的數(shù)值增長(zhǎng)到 24 時(shí),網(wǎng)絡(luò)出現(xiàn)超時(shí),說(shuō)明網(wǎng)絡(luò)擁塞了。 傳輸輪次2216“乘法減小24681012141618200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 更新后的 ssthresh 值變?yōu)?12(即發(fā)送窗口數(shù)值 24 的一半),擁塞窗口再重新設(shè)置為 1,并執(zhí)行慢開(kāi)始算法。 傳輸輪次2216“乘法減小2468101214161
57、8200048122024擁塞窗口 cwnd新的 ssthresh 值網(wǎng)絡(luò)擁塞指數(shù)規(guī)律增長(zhǎng)ssthresh 的初始值慢開(kāi)始慢開(kāi)始慢開(kāi)始擁塞防止“加法增大擁塞防止“加法增大慢開(kāi)始和擁塞防止算法的實(shí)現(xiàn)舉例 當(dāng) cwnd = 12 時(shí)改為執(zhí)行擁塞防止算法,擁塞窗口按按線(xiàn)性規(guī)律增長(zhǎng),每經(jīng)過(guò)一個(gè)往返時(shí)延就增加一個(gè) MSS 的大小。 傳輸輪次乘法減小(multiplicative decrease) “乘法減小“是指不管在慢開(kāi)始階段還是擁塞防止階段,只要出現(xiàn)一次超時(shí)(即出現(xiàn)一次網(wǎng)絡(luò)擁塞),就把慢開(kāi)始門(mén)限值 ssthresh 設(shè)置為當(dāng)前的擁塞窗口值乘以 0.5。當(dāng)網(wǎng)絡(luò)頻繁出現(xiàn)擁塞時(shí),ssthresh 值就下
58、降得很快,以大大減少注入到網(wǎng)絡(luò)中的分組數(shù)。 加法增大(additive increase) “加法增大是指執(zhí)行擁塞防止算法后,在收到對(duì)所有報(bào)文段確實(shí)認(rèn)后(即經(jīng)過(guò)一個(gè)往返時(shí)間),就把擁塞窗口 cwnd增加一個(gè) MSS 大小,使擁塞窗口緩慢增大,以防止網(wǎng)絡(luò)過(guò)早出現(xiàn)擁塞。 必須強(qiáng)調(diào)指出 “擁塞防止并非指完全能夠防止了擁塞。利用以上的措施要完全防止網(wǎng)絡(luò)擁塞還是不可能的?!皳砣乐故钦f(shuō)在擁塞防止階段把擁塞窗口控制為按線(xiàn)性規(guī)律增長(zhǎng),使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。 2. 快重傳和快恢復(fù)快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)。這樣做可以讓發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)接收方。 發(fā)送方只
59、要一連收到三個(gè)重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段。 不難看出,快重傳并非取消重傳計(jì)時(shí)器,而是在某些情況下可更早地重傳喪失的報(bào)文段。 快重傳舉例發(fā)送方接收方發(fā)送 M1 確認(rèn) M1t 確認(rèn) M2 發(fā)送 M2發(fā)送 M3發(fā)送 M4 ?發(fā)送 M5發(fā)送 M6 重復(fù)確認(rèn) M2 立即重傳 M3 重復(fù)確認(rèn) M2 重復(fù)確認(rèn) M2 t發(fā)送 M7收到三個(gè)連續(xù)的對(duì) M2 的重復(fù)確認(rèn)立即重傳 M3喪失快恢復(fù)算法 (1) 當(dāng)發(fā)送端收到連續(xù)三個(gè)重復(fù)確實(shí)認(rèn)時(shí),就執(zhí)行“乘法減小算法,把慢開(kāi)始門(mén)限 ssthresh 減半。但接下去不執(zhí)行慢開(kāi)始算法。 (2)由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒(méi)有發(fā)生擁塞,因此現(xiàn)在不執(zhí)行慢開(kāi)始算法,
60、即擁塞窗口 cwnd 現(xiàn)在不設(shè)置為 1,而是設(shè)置為慢開(kāi)始門(mén)限 ssthresh 減半后的數(shù)值,然后開(kāi)始執(zhí)行擁塞防止算法(“加法增大),使擁塞窗口緩慢地線(xiàn)性增大。 24從連續(xù)收到三個(gè)重復(fù)確實(shí)認(rèn)轉(zhuǎn)入擁塞防止 2468101214161820220048121620傳輸輪次擁塞窗口 cwnd收到 3 個(gè)重復(fù)確實(shí)認(rèn)執(zhí)行快重傳算法慢開(kāi)始“乘法減小擁塞防止“加法增大TCP Reno版本TCP Tahoe 版本(已廢棄不用)ssthresh 的初始值擁塞防止“加法增大新的 ssthresh 值慢開(kāi)始快恢復(fù)發(fā)送窗口的上限值發(fā)送方的發(fā)送窗口的上限值應(yīng)當(dāng)取為接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個(gè)變量中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3589-2019皺紋盤(pán)鮑淺海筏式養(yǎng)殖技術(shù)規(guī)程
- DB32/T 3564-2019節(jié)段預(yù)制拼裝混凝土橋梁設(shè)計(jì)與施工規(guī)范
- DB32/T 3555-2019消防機(jī)構(gòu)食堂設(shè)施設(shè)備配置規(guī)范
- DB32/T 3310-2017船閘維護(hù)規(guī)程
- DB31/T 999.3-2016網(wǎng)上政務(wù)大廳接入技術(shù)規(guī)范第3部分:業(yè)務(wù)協(xié)同數(shù)據(jù)交換格式
- DB31/T 635-2020造船行業(yè)職業(yè)病危害控制規(guī)范
- DB31/T 1343-2022醫(yī)用超聲探頭消毒衛(wèi)生要求
- DB31/T 1187-2019特種設(shè)備風(fēng)險(xiǎn)分級(jí)管控實(shí)施指南
- DB31/ 528-2011應(yīng)急避難場(chǎng)所標(biāo)志設(shè)置規(guī)范和要求
- 谷物加工行業(yè)技術(shù)標(biāo)準(zhǔn)管理考核試卷
- 2025年安全管理員安全培訓(xùn)考試試題帶答案(培優(yōu))
- 【中考真題匯編】專(zhuān)項(xiàng)查漏補(bǔ)缺現(xiàn)代文閱讀-2025年中考語(yǔ)文(含答案)
- 2025年綠色建筑與可持續(xù)發(fā)展考試試題及答案
- 手表質(zhì)押借款協(xié)議書(shū)
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試數(shù)學(xué)試卷及答案(武漢四調(diào))
- T-CRHA 086-2024 住院患者胰島素泵應(yīng)用護(hù)理規(guī)范
- 2024年湖南省長(zhǎng)沙市中考地理試卷真題(含答案解析)
- MOOC 軟件質(zhì)量保證-西安交通大學(xué) 中國(guó)大學(xué)慕課答案
- 《穴位埋線(xiàn)與減肥》課件
- 1368個(gè)單詞就夠了中文翻譯版
- 青島版(五年制)數(shù)學(xué)五年級(jí)下冊(cè)《第一單元 圓1.4 回顧整理》課件
評(píng)論
0/150
提交評(píng)論