計(jì)算機(jī)網(wǎng)絡(luò)_運(yùn)輸層

運(yùn)輸層協(xié)議概述

  • 從通信和信息處理的角度看,運(yùn)輸層向它上面的應(yīng)用層提供通信服務(wù),它屬于面向通信部分的最高層宗雇,同時(shí)也是用戶功能中的最低層。
  • 當(dāng)網(wǎng)絡(luò)的邊緣部分中的兩個(gè)主機(jī)使用網(wǎng)絡(luò)的核心部分的功能進(jìn)行端到端的通信時(shí),只有位于網(wǎng)絡(luò)邊緣部分的主機(jī)的協(xié)議棧才有運(yùn)輸層,而網(wǎng)絡(luò)核心部分中的路由器在轉(zhuǎn)發(fā)分組時(shí)都只用到下三層的功能蒋失。

應(yīng)用進(jìn)程之間的通信

在IP層看來铣卡,通信的兩端是兩個(gè)主機(jī)苫耸,IP數(shù)據(jù)報(bào)的首部明確的標(biāo)志了這兩個(gè)主機(jī)的IP地址。但是兩個(gè)主機(jī)之間的通信這種說法還不夠清楚,這是因?yàn)檎嬲M(jìn)行通信的實(shí)體是在主機(jī)中的進(jìn)程缨伊,是兩個(gè)進(jìn)程之間在交換數(shù)據(jù)。從而引出了運(yùn)輸層,從運(yùn)輸層的角度看來旁趟,通信的真正端點(diǎn)并不是主機(jī)而是主機(jī)中的進(jìn)程(端到端的通信)。

在一個(gè)主機(jī)中經(jīng)常有多個(gè)應(yīng)用進(jìn)程同時(shí)分別和另一個(gè)主機(jī)的多個(gè)應(yīng)用進(jìn)程通信。這就表明了運(yùn)輸層有一個(gè)很重要的功能上陕,復(fù)用和分用,應(yīng)用層不同進(jìn)程的報(bào)文通過不同的端口向下交到運(yùn)輸層,再往下就共用網(wǎng)絡(luò)層提供的服務(wù)终息。

  • 復(fù)用指的是發(fā)送方不同的應(yīng)用進(jìn)程都可以使用同一個(gè)運(yùn)輸層協(xié)議傳輸數(shù)據(jù)(當(dāng)然要加上適當(dāng)?shù)氖撞浚?/li>
  • 分用指的是接收方的運(yùn)輸層在剝?nèi)?bào)文的首部后能夠把這些數(shù)據(jù)正確交付目的應(yīng)用進(jìn)程

“運(yùn)輸層提供應(yīng)用進(jìn)程間的邏輯通信”续镇∪耸粒“邏輯通信”的意思是:運(yùn)輸層之間的通信好像是沿水平方向傳送數(shù)據(jù)逢净。但事實(shí)上這兩個(gè)運(yùn)輸層之間并沒有一條水平方向的物理連接社露。

運(yùn)輸層的主要功能

  • 運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯通信(但網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信)
  • 運(yùn)輸層還要對(duì)收到的報(bào)文進(jìn)行差錯(cuò)檢測(cè)。
  • 運(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)程看見的就是好像在兩個(gè)運(yùn)輸層實(shí)體之間有一條端到端的邏輯通信信道。
  • 當(dāng)運(yùn)輸層采用面向連接的 TCP 協(xié)議時(shí)喻奥,盡管下面的網(wǎng)絡(luò)是不可靠的(只提供盡最大努力服務(wù)),但這種邏輯通信信道就相當(dāng)于一條全雙工的可靠信道庙洼。
  • 當(dāng)運(yùn)輸層采用無連接的 UDP 協(xié)議時(shí),這種邏輯通信信道是一條不可靠信道蹬挺。

運(yùn)輸層的兩個(gè)主要協(xié)議

TCP/IP 的運(yùn)輸層有兩個(gè)不同的協(xié)議:

  • 用戶數(shù)據(jù)報(bào)協(xié)議 UDP(User Datagram Protocol)
  • 傳輸控制協(xié)議 TCP(Transmission Control Protocol)

TCP與UDP

  • 兩個(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)文或用戶數(shù)據(jù)報(bào)**阐污。

區(qū)別

  • UDP 在傳送數(shù)據(jù)之前不需要先建立連接。對(duì)方的運(yùn)輸層在收到 UDP 報(bào)文后,不需要給出任何確認(rèn)退腥。雖然 UDP 不提供可靠交付购城,但在某些情況下 UDP 是一種最有效的工作方式撇叁。
  • TCP 則提供面向連接的服務(wù)。TCP 不提供廣播或多播服務(wù)瞳脓。由于 TCP 要提供可靠的祝峻、面向連接的運(yùn)輸服務(wù)相满,因此不可避免地增加了許多的開銷拢蛋。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多嗦锐,還要占用許多的處理機(jī)資源磅崭。

還要強(qiáng)調(diào)兩點(diǎn)

  • 運(yùn)輸層的 UDP 用戶數(shù)據(jù)報(bào)與網(wǎng)際層的IP數(shù)據(jù)報(bào)有很大區(qū)別儿子。IP 數(shù)據(jù)報(bào)要經(jīng)過互連網(wǎng)中許多路由器的存儲(chǔ)轉(zhuǎn)發(fā),但 UDP 用戶數(shù)據(jù)報(bào)是在運(yùn)輸層的端到端抽象的邏輯信道中傳送的砸喻。
  • TCP 報(bào)文段是在運(yùn)輸層抽象的端到端邏輯信道中傳送柔逼,這種信道是可靠的全雙工信道蒋譬。但這樣的信道卻不知道究竟經(jīng)過了哪些路由器,而這些路由器也根本不知道上面的運(yùn)輸層是否建立了 TCP 連接愉适。

TCP/IP體系中的運(yùn)輸層協(xié)議

TCP/IP體系中的運(yùn)輸層協(xié)議.png

運(yùn)輸層的端口

  • 運(yùn)行在計(jì)算機(jī)中的進(jìn)程是用進(jìn)程標(biāo)識(shí)符來標(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)種類很多维咸,而不同的操作系統(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)志。

需要解決的問題

  • 由于進(jìn)程的創(chuàng)建和撤銷都是動(dòng)態(tài)的虽画,發(fā)送方幾乎無法識(shí)別其他機(jī)器上的進(jìn)程菠赚。
  • 有時(shí)我們會(huì)改換接收?qǐng)?bào)文的進(jìn)程,但并不需要通知所有發(fā)送方坐慰。
  • 我們往往需要利用目的主機(jī)提供的功能來識(shí)別終點(diǎn),而不需要知道實(shí)現(xiàn)這個(gè)功能的進(jìn)程用僧。

端口號(hào)(protocol port number)簡(jiǎn)稱為端口(port)

  • 解決這個(gè)問題的方法就是在運(yùn)輸層使用協(xié)議端口號(hào)(protocol port number)结胀,或通常簡(jiǎn)稱為端口(port)。
  • 雖然通信的終點(diǎn)是應(yīng)用進(jìn)程责循,但我們可以把端口想象是通信的終點(diǎn)糟港,因?yàn)槲覀冎灰岩獋魉偷膱?bào)文交到目的主機(jī)的某一個(gè)合適的目的端口,剩下的工作(即最后交付目的進(jìn)程)就由 TCP 來完成院仿。

軟件端口與硬件端口

  • 在協(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)志(可允許有65535個(gè)不同的端口號(hào))。
  • 端口號(hào)只具有本地意義县钥,即端口號(hào)只是為了標(biāo)志本計(jì)算機(jī)應(yīng)用層中的各進(jìn)程秀姐。在因特網(wǎng)中不同計(jì)算機(jī)的相同端口號(hào)是沒有聯(lián)系的

由此可見兩個(gè)計(jì)算機(jī)中的進(jìn)程要相互通信若贮,不僅要知道對(duì)方的IP地址省有,還要知道對(duì)方的端口號(hào)。

三類端口

  • 熟知端口(系統(tǒng)端口)谴麦,數(shù)值一般為 0 -1023
    例如: http = 80蠢沿,ftp = 21
  • 登記端口號(hào),數(shù)值為1024 - 49151匾效,為沒有熟知端口號(hào)的應(yīng)用程序使用的舷蟀。使用這個(gè)范圍的端口號(hào)必須在 IANA 登記,以防止重復(fù)。
  • 客戶端口號(hào)短暫端口號(hào)野宜,數(shù)值為49152 - 65535扫步,留給客戶進(jìn)程選擇暫時(shí)使用。當(dāng)服務(wù)器進(jìn)程收到客戶進(jìn)程的報(bào)文時(shí)匈子,就知道了客戶進(jìn)程所使用的動(dòng)態(tài)端口號(hào)河胎。通信結(jié)束后,這個(gè)端口號(hào)可供其他客戶進(jìn)程以后使用虎敦。

用戶數(shù)據(jù)報(bào)UDP

UDP概述

  • UDP 只在 IP 的數(shù)據(jù)報(bào)服務(wù)之上增加了很少一點(diǎn)的功能游岳,即端口的功能差錯(cuò)檢測(cè)的功能。
  • 雖然 UDP 用戶數(shù)據(jù)報(bào)只能提供不可靠的交付其徙,但 UDP 在某些方面有其特殊的優(yōu)點(diǎn)胚迫。

UDP的主要特點(diǎn)

  • UDP 是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接擂橘。
  • UDP 使用盡最大努力交付晌区,即不保證可靠交付摩骨,同時(shí)也不使用擁塞控制通贞。
  • UDP 是面向報(bào)文的。UDP 沒有擁塞控制恼五,很適合多媒體通信的要求昌罩。
    無擁塞控制就說明網(wǎng)絡(luò)出現(xiàn)的擁塞不會(huì)使主機(jī)發(fā)送的速率降低。這對(duì)某些實(shí)時(shí)應(yīng)用是很重要的(IP電話灾馒,實(shí)時(shí)視頻會(huì)議等)
  • UDP 支持一對(duì)一茎用、一對(duì)多、多對(duì)一和多對(duì)多的交互通信睬罗。
  • UDP 的首部開銷小轨功,只有 8 個(gè)字節(jié)。

面向報(bào)文的UDP

  • 發(fā)送方 UDP 對(duì)應(yīng)用程序交下來的報(bào)文容达,在添加首部后就向下交付 IP 層古涧。UDP 對(duì)應(yīng)用層交下來的報(bào)文,既不合并花盐,也不拆分羡滑,而是保留這些報(bào)文的邊界
  • 應(yīng)用層交給 UDP 多長的報(bào)文算芯,UDP 就照樣發(fā)送柒昏,即一次發(fā)送一個(gè)報(bào)文
  • 接收方 UDP 對(duì) IP 層交上來的 UDP 用戶數(shù)據(jù)報(bào)熙揍,在去除首部后就原封不動(dòng)地交付上層的應(yīng)用進(jìn)程职祷,一次交付一個(gè)完整的報(bào)文。
  • 應(yīng)用程序必須選擇合適大小的報(bào)文。
面向報(bào)文的UDP.png

UDP的首部格式

UDP的首部格式.png
  • 源端口 在需要對(duì)方回信時(shí)選用有梆,不需要時(shí)可全用0
  • 目的端口
  • 長度 UDP用戶數(shù)據(jù)報(bào)的長度削葱,最小值為8(只由首部)
  • 檢驗(yàn)和 檢驗(yàn)UDP用戶數(shù)據(jù)報(bào)在傳輸中是否有差錯(cuò),有錯(cuò)就丟棄

UDP基于端口分用

UDP基于端口分用.png

UDP差錯(cuò)檢驗(yàn)

如果接收方UDP發(fā)現(xiàn)收到的報(bào)文中的目的端口號(hào)不正確(即不存在對(duì)應(yīng)于該端口的號(hào)的應(yīng)用進(jìn)程)淳梦,就丟棄該報(bào)文析砸,并由網(wǎng)際控制報(bào)文協(xié)議ICMP發(fā)送端口不可達(dá)差錯(cuò)報(bào)文給發(fā)送方。

在計(jì)算檢驗(yàn)和時(shí)爆袍,臨時(shí)把“偽首部”和 UDP 用戶數(shù)據(jù)報(bào)連接在一起得到一個(gè)臨時(shí)的數(shù)據(jù)報(bào)首繁,它不向下傳遞也不向上遞交。偽首部?jī)H僅是為了計(jì)算檢驗(yàn)和陨囊。

UDP計(jì)算檢驗(yàn)和的方法和IP數(shù)據(jù)報(bào)首部檢驗(yàn)和方法相類似弦疮。但不同的是,IP數(shù)據(jù)報(bào)的檢驗(yàn)和只檢驗(yàn)IP數(shù)據(jù)報(bào)的首部蜘醋,但UDP的檢驗(yàn)和是把首部和數(shù)據(jù)部分一起檢驗(yàn)

計(jì)算UDP檢驗(yàn)和的例子:


UDP檢驗(yàn)和的例子.png

在發(fā)送方胁塞,先把全0放入檢驗(yàn)和字段,再把偽首部以及UDP用戶數(shù)據(jù)報(bào)看成是許多16位的字串接起來压语。若UDP用戶報(bào)的數(shù)據(jù)部分不是偶數(shù)個(gè)字節(jié)啸罢,則要填入一個(gè)全零字節(jié)(先不發(fā)送)。然后按照二進(jìn)制反碼計(jì)算出這些16位字的和胎食。將此和的二進(jìn)制反碼寫入檢驗(yàn)和字段后扰才,就發(fā)送這樣的UDP數(shù)據(jù)報(bào)。在接收方厕怜,把收到的UDP數(shù)據(jù)報(bào)連通偽首部(以及可能填充全零字節(jié))一起衩匣,按二進(jìn)制反碼求這些16位字的和。當(dāng)無差錯(cuò)時(shí)其結(jié)果應(yīng)為全1(原本的檢驗(yàn)和為0粥航,封裝成數(shù)據(jù)報(bào)后再次相加的時(shí)候就多個(gè)檢驗(yàn)和反碼相加琅捏,所以無差錯(cuò)時(shí)結(jié)果為1)。

傳輸控制協(xié)議TCP概述

TCP最主要的特點(diǎn)

  • TCP 是面向連接的運(yùn)輸層協(xié)議
    建立與釋放連接
  • 每一條 TCP 連接只能有兩個(gè)端點(diǎn)(endpoint)递雀,每一條 TCP 連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一)
  • TCP 提供可靠交付的服務(wù)柄延。
    無差錯(cuò)、不重復(fù)映之、不丟失拦焚、并且按序到達(dá)
  • TCP 提供全雙工通信
    TCP在兩端設(shè)置了發(fā)送和接收緩存
  • 面向字節(jié)流
    這里的指的是流入到進(jìn)程或從進(jìn)程流出的字節(jié)序列,面向字節(jié)流的含義是:雖然應(yīng)用程序和TCP的交互是一次一個(gè)數(shù)據(jù)塊(大小不等)杠输,但TCP把應(yīng)用程序交下來的數(shù)據(jù)看成僅僅是一連串的無結(jié)構(gòu)的字節(jié)流赎败。TCP并不知道所傳輸?shù)淖止?jié)流的含義。TCP并不保證接收方應(yīng)用程序所收到的數(shù)據(jù)塊和發(fā)送方應(yīng)用程序所發(fā)出的數(shù)據(jù)塊具有對(duì)應(yīng)的大小關(guān)系(發(fā)送發(fā)交給發(fā)送方TCP10個(gè)數(shù)據(jù)塊蠢甲,但接收方的TPC用了4個(gè)數(shù)據(jù)塊就把收到的字節(jié)流交付上層的應(yīng)用程序)僵刮。但接收方應(yīng)用程序收到的字節(jié)流必須和發(fā)送方應(yīng)用程序發(fā)送的字節(jié)流完全一樣。

TCP面向流的概念

TCP面向流的概念.png

應(yīng)當(dāng)注意

  • TCP 連接是一條虛連接而不是一條真正的物理連接。
  • TCP 對(duì)應(yīng)用進(jìn)程一次把多長的報(bào)文發(fā)送到TCP 的緩存中是不關(guān)心的搞糕。
  • TCP 根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞的程度來決定一個(gè)報(bào)文段應(yīng)包含多少個(gè)字節(jié)(UDP 發(fā)送的報(bào)文長度是應(yīng)用進(jìn)程給出的)勇吊。
  • TCP 可把太長的數(shù)據(jù)塊劃分短一些再傳送。TCP 也可等待積累有足夠多的字節(jié)后再構(gòu)成報(bào)文段發(fā)送出去窍仰。

TCP的連接

  • TCP 把連接作為最基本的抽象
  • 每一條 TCP 連接有兩個(gè)端點(diǎn)
  • TCP 連接的端點(diǎn)不是主機(jī)汉规,不是主機(jī)的IP 地址,不是應(yīng)用進(jìn)程驹吮,也不是運(yùn)輸層的協(xié)議端口针史。TCP 連接的端點(diǎn)叫做套接字(socket)插口
  • 端口號(hào)拼接到(contatenated with) IP 地址即構(gòu)成了套接字

套接字(socket)

套接字.png

每一條TCP連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定,即:

TCP連接.png

同一個(gè)名詞socket有多種不同的意思

  • 應(yīng)用編程接口 API 稱為 socket API, 簡(jiǎn)稱為 socket碟狞。
  • socket API 中使用的一個(gè)函數(shù)名也叫作 socket啄枕。
  • 調(diào)用 socket 函數(shù)的端點(diǎn)稱為 socket。
  • 調(diào)用 socket 函數(shù)時(shí)其返回值稱為 socket 描述符族沃,可簡(jiǎn)稱為 socket频祝。
  • 在操作系統(tǒng)內(nèi)核中連網(wǎng)協(xié)議的 Berkeley 實(shí)現(xiàn),稱為 socket 實(shí)現(xiàn)脆淹。

可靠傳輸?shù)墓ぷ髟?/h1>

TCP發(fā)送的報(bào)文段是交給IP層傳輸?shù)某?铡5獻(xiàn)P層只提供盡最大努力服務(wù),也就是說未辆,TCP下面的網(wǎng)絡(luò)所提供的是不可靠傳輸窟绷,因此锯玛,TCP必須采用適當(dāng)?shù)拇胧┎拍苁沟脙蓚€(gè)運(yùn)輸層之間的通信變得可靠咐柜。

可靠傳輸有以下兩個(gè)特點(diǎn)

  • 傳輸信道不產(chǎn)生差錯(cuò)
  • 不管發(fā)送方以多快的速度發(fā)送數(shù)據(jù),接收方總是來得及處理收到的數(shù)據(jù)

在這樣的理想傳輸條件下攘残,不需要采取任何措施就能夠?qū)崿F(xiàn)可靠傳輸拙友。然而實(shí)際的網(wǎng)絡(luò)都不具備以上兩個(gè)理想的條件。但我們可以使用一些可靠傳輸協(xié)議歼郭,當(dāng)出現(xiàn)差錯(cuò)時(shí)讓發(fā)送方重傳出現(xiàn)差錯(cuò)的數(shù)據(jù)遗契,同時(shí)在接收方來不及處理收到的數(shù)據(jù)時(shí),及時(shí)告訴發(fā)送方適當(dāng)?shù)慕档桶l(fā)送數(shù)據(jù)的速度病曾,這樣一來牍蜂,本來是不可靠的傳輸信道就能夠?qū)崿F(xiàn)可靠傳輸。

停止等待協(xié)議

停止等待協(xié)議.png
  • 在發(fā)送完一個(gè)分組后泰涂,必須暫時(shí)保留已發(fā)送的分組的副本
    為發(fā)生超時(shí)重傳而使用鲫竞,只有收到相應(yīng)的確認(rèn)報(bào)文時(shí)才能清除暫時(shí)保存的副本
  • 分組和確認(rèn)分組都必須進(jìn)行編號(hào)
    這樣才能明確是哪一個(gè)發(fā)送出去的分組收到了確認(rèn),而哪一個(gè)分組還沒收到確認(rèn)
  • 超時(shí)計(jì)時(shí)器的重傳時(shí)間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r(shí)間更長一些

確認(rèn)丟失和確認(rèn)遲到

確認(rèn)丟失和確認(rèn)遲到.png

可靠通信的實(shí)現(xiàn)

  • 使用上述的確認(rèn)和重傳機(jī)制逼蒙,我們就可以在不可靠的傳輸網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信
  • 這種可靠傳輸協(xié)議常稱為自動(dòng)重傳請(qǐng)求ARQ (Automatic Repeat reQuest)
  • ARQ 表明重傳的請(qǐng)求是自動(dòng)進(jìn)行的从绘。接收方不需要請(qǐng)求發(fā)送方重傳某個(gè)出錯(cuò)的分組

信道利用率

停止等待協(xié)議的優(yōu)點(diǎn)是簡(jiǎn)單,但缺點(diǎn)是信道利用率太低。

假定AB之間有一條直通的信道來傳送分組


信道利用率.png

這里的TD是A發(fā)送分組所需要的時(shí)間(顯然TD = 分組長度 / 數(shù)據(jù)速率)再假定TA是B發(fā)送確認(rèn)分組所需要的時(shí)間(A和B處理分組的時(shí)間都忽略不計(jì))那么A在經(jīng)過TD+RTT+TA時(shí)間后才能發(fā)送下一個(gè)分組僵井,這里的RTT是往返時(shí)間陕截,因?yàn)橹挥蠺D是采用來傳輸有用的數(shù)據(jù)(這個(gè)數(shù)據(jù)包括了分組首部,如果可以知道傳輸更精確的數(shù)據(jù)的時(shí)間批什,可以計(jì)算的更精確)农曲,所有信道利用率為


信道利用率公式.png

為了提高傳輸效率,發(fā)送方可以不使用低效率的停止等待協(xié)議驻债,而是采用流水線傳輸:就是發(fā)送方可以連續(xù)的發(fā)送多個(gè)分組朋蔫,不必每發(fā)完一個(gè)分組就停下來等待對(duì)方的確認(rèn)。這樣可使信道上一直有數(shù)據(jù)不間斷地在傳送却汉。顯然這種傳輸方式可以獲得很高的信道利用率

流水線傳輸.png

當(dāng)時(shí)使用流水線傳輸時(shí)驯妄,就要使用下面介紹的連續(xù)ARQ協(xié)議滑動(dòng)窗口協(xié)議

連續(xù)ARQ協(xié)議

滑動(dòng)窗口協(xié)議比較復(fù)雜,是TCP協(xié)議的精髓所在合砂,在這里先給出ARQ協(xié)議最基本的概念青扔,但不涉及到許多細(xì)節(jié)問題。

連續(xù)ARQ協(xié)議.png

位于發(fā)送窗口的分組都可以連續(xù)的發(fā)送出去翩伪,而不需要等待對(duì)方的確認(rèn)微猖,發(fā)送方每收到一個(gè)確認(rèn),就把發(fā)送窗口向前滑動(dòng)一個(gè)分組的位置缘屹。

詳細(xì)可以見P201

累計(jì)確認(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ā)送方反映出接收方已經(jīng)正確收到的所有分組的信息犁享。

Go - back - N(回退N)

  • 如果發(fā)送方發(fā)送了前 5 個(gè)分組,而中間的第 3 個(gè)分組丟失了豹休。這時(shí)接收方只能對(duì)前兩個(gè)分組發(fā)出確認(rèn)炊昆。發(fā)送方無法知道后面三個(gè)分組的下落,而只好把后面的三個(gè)分組都再重傳一次威根。
  • 這就叫做 Go-back-N(回退 N)凤巨,表示需要再退回來重傳已發(fā)送過的 N 個(gè)分組。
  • 可見當(dāng)通信線路質(zhì)量不好時(shí)洛搀,連續(xù) ARQ 協(xié)議會(huì)帶來負(fù)面的影響敢茁。

TCP可靠通信的具體實(shí)現(xiàn)

  • TCP 連接的每一端都必須設(shè)有兩個(gè)窗口——一個(gè)發(fā)送窗口和一個(gè)接收窗口
  • TCP 的可靠傳輸機(jī)制用字節(jié)的序號(hào)進(jìn)行控制姥卢。TCP 所有的確認(rèn)都是基于序號(hào)而不是基于報(bào)文段卷要。
  • TCP 兩端的四個(gè)窗口經(jīng)常處于動(dòng)態(tài)變化之中渣聚。
    TCP連接的往返時(shí)間 RTT 也不是固定不變的。需要使用特定的算法估算較為合理的重傳時(shí)間僧叉。

TCP報(bào)文段的首部格式

TCP雖然是面向字節(jié)流的奕枝,但是TCP傳送的數(shù)據(jù)單元卻是報(bào)文段(可以看上述TCP面向流的概念),而且TCP的全部功能都體現(xiàn)在它的首部中各個(gè)字段瓶堕。

TCP報(bào)文段的首部格式.png
  • 源端口和目的端口字段——各占 2 字節(jié)隘道。端口是運(yùn)輸層與應(yīng)用層的服務(wù)接口。運(yùn)輸層的復(fù)用和分用功能都要通過端口才能實(shí)現(xiàn)郎笆。
  • 序號(hào)字段——占 4 字節(jié)谭梗。TCP 連接中傳送的數(shù)據(jù)流中的每一個(gè)字節(jié)都編上一個(gè)序號(hào)。序號(hào)字段的值則指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)宛蚓。(如果不理解激捏,可以看P202)
  • 確認(rèn)號(hào)字段——占 4 字節(jié),是期望收到對(duì)方的下一個(gè)報(bào)文段的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)凄吏。例如远舅,B正確收到了A發(fā)送過來的一個(gè)報(bào)文段,其序號(hào)字段值是501痕钢,而數(shù)據(jù)長度是200字節(jié)(序號(hào)501 - 700)图柏,這表明B正確收到了A發(fā)送的到序號(hào)700為止的數(shù)據(jù),因此任连,B期望收到A的下一個(gè)數(shù)據(jù)序號(hào)為701蚤吹,于是B在發(fā)送給A的確認(rèn)報(bào)文段中把確認(rèn)號(hào)置位701。總之随抠,若確認(rèn)號(hào)為N裁着,則表明到N-1為止的所有數(shù)據(jù)都已正確收到
  • 數(shù)據(jù)偏移(即首部長度)——占 4 位暮刃,它指出 TCP 報(bào)文段的數(shù)據(jù)起始處距離 TCP 報(bào)文段的起始處有多遠(yuǎn)跨算。“數(shù)據(jù)偏移”的單位是 32 位字(以 4 字節(jié)為計(jì)算單位)椭懊。
  • 保留字段——占 6 位,保留為今后使用步势,但目前應(yīng)置為 0
  • 緊急 URG —— 當(dāng) URG = 1 時(shí)氧猬,表明緊急指針字段有效。它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù)坏瘩,應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級(jí)的數(shù)據(jù))
  • 確認(rèn) ACK —— 只有當(dāng) ACK = 1 時(shí)確認(rèn)號(hào)字段才有效盅抚。當(dāng) ACK = 0 時(shí),確認(rèn)號(hào)無效倔矾。TCP規(guī)定妄均,在建立連接后所有傳送的報(bào)文段都必須把ACK置1
  • 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的報(bào)文段柱锹,就盡快地交付接收應(yīng)用進(jìn)程,而不再等到整個(gè)緩存都填滿了后再向上交付丰包。
  • 復(fù)位 RST (ReSeT) —— 當(dāng) RST = 1 時(shí)禁熏,表明 TCP 連接中出現(xiàn)嚴(yán)重差錯(cuò)(如由于主機(jī)崩潰或其他原因),必須釋放連接邑彪,然后再重新建立運(yùn)輸連接瞧毙。
  • 同步 SYN —— 在連接建立時(shí)用來同步序號(hào),當(dāng)SYN = 1而ACK = 0時(shí)寄症,表明這是一個(gè)連接請(qǐng)求報(bào)文宙彪。對(duì)方若同意建立連接,則應(yīng)在響應(yīng)的報(bào)文段中使SYN = 1和ACK = 1有巧。所以释漆,SYN = 1 表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文
  • 終止 FIN (FINis) —— 用來釋放一個(gè)連接篮迎。FIN = 1 表明此報(bào)文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢灵汪,并要求釋放運(yùn)輸連接。
  • 窗口字段 —— 占 2 字節(jié)柑潦,窗口值是[0,2^16 -1]之間的整數(shù)享言。窗口指的是發(fā)送本報(bào)文段的一方的接收窗口(而不是自己的發(fā)送窗口)。窗口值告訴對(duì)方:從本報(bào)文段首部中的確認(rèn)號(hào)算起渗鬼,接收方目前允許對(duì)方發(fā)送的數(shù)據(jù)量览露。之所以要有這個(gè)限制,是因?yàn)榻邮辗降臄?shù)據(jù)緩存空間是有限的譬胎〔钆#總之窗口值作為接收方讓發(fā)送方設(shè)置其發(fā)送窗口的依據(jù)。例如堰乔。設(shè)確認(rèn)號(hào)是701偏化,窗口字段是1000.這就表明,從701號(hào)算起镐侯,發(fā)送此報(bào)文段的一方還有接收1000個(gè)字節(jié)數(shù)據(jù)(字節(jié)序號(hào)701-1700)的接收緩存空間侦讨。總之,窗口字段指出了現(xiàn)在允許對(duì)方發(fā)送的數(shù)據(jù)量苟翻。窗口值是經(jīng)常在動(dòng)態(tài)變化著
  • 檢驗(yàn)和 —— 占 2 字節(jié)韵卤。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分。與UDP一樣在計(jì)算檢驗(yàn)和時(shí)崇猫,要在 TCP 報(bào)文段的前面加上 12 字節(jié)的偽首部沈条。不同點(diǎn)可以見P204
  • 緊急指針字段 —— 占 16 位,僅在URG = 1時(shí)才有意義诅炉,它指出在本報(bào)文段中緊急數(shù)據(jù)共有多少個(gè)字節(jié)(緊急數(shù)據(jù)放在本報(bào)文段數(shù)據(jù)的最前面蜡歹,因此緊急指針指出了緊急數(shù)據(jù)的末尾在報(bào)文段中的位置)屋厘。
  • 選項(xiàng)字段 —— 長度可變。TCP 最初只規(guī)定了一種選項(xiàng)月而,即最大報(bào)文段長度 MSS汗洒。MSS 告訴對(duì)方 TCP:“我的緩存所能接收的報(bào)文段的數(shù)據(jù)字段的最大長度是 MSS 個(gè)字節(jié)【笆螅” MSS (Maximum Segment Size)是 TCP 報(bào)文段中的數(shù)據(jù)字段的最大長度仲翎。數(shù)據(jù)字段加上 TCP 首部才等于整個(gè)的 TCP 報(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í)間戳回送回答字段(4 字節(jié))。
    • 選擇確認(rèn)選項(xiàng)
      選項(xiàng)詳解請(qǐng)見P205
  • 填充字段 —— 這是為了使整個(gè)首部長度是** 4 字節(jié)**的整數(shù)倍包晰。

TCP可靠傳輸?shù)膶?shí)現(xiàn)

以字節(jié)為單位的滑動(dòng)窗口

詳解請(qǐng)見P206湿镀,注意圖中的后沿,前沿

以字節(jié)為單位的滑動(dòng)窗口01.png

從下圖可以看出來伐憾,要描述一個(gè)發(fā)送窗口的狀態(tài)需要三個(gè)指針:P1勉痴,P2,P3

以字節(jié)為單位的滑動(dòng)窗口02.png

以字節(jié)為單位的滑動(dòng)窗口03.png
以字節(jié)為單位的滑動(dòng)窗口04.png

有很多信息見P208树肃,這里不贅述

發(fā)送/接收緩存

發(fā)送方的應(yīng)用進(jìn)程把字節(jié)流寫入TCP的發(fā)送緩存蒸矛,接收方的應(yīng)用進(jìn)程從TCP的接收緩存中讀取字節(jié)流。下面進(jìn)一步討論前面講的窗口和緩存的關(guān)系

發(fā)送緩存

發(fā)送緩存.png

接收緩存
接收緩存.png

發(fā)送與接收緩存的作用

  • 發(fā)送緩存用來暫時(shí)存放:
    • 發(fā)送應(yīng)用程序傳送給發(fā)送方 TCP 準(zhǔn)備發(fā)送的數(shù)據(jù)胸嘴;
    • TCP 已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)雏掠。

發(fā)送窗口通常只是發(fā)送緩存的一部分,已被確認(rèn)的數(shù)據(jù)應(yīng)當(dāng)從發(fā)送緩存中刪除劣像,因此發(fā)送緩存和發(fā)送窗口的后沿是重合的乡话。發(fā)送應(yīng)用程序最后寫入發(fā)送緩存的字節(jié)減去最后被確認(rèn)的字節(jié),就是還保留在發(fā)送緩存中被寫入的字節(jié)耳奕。發(fā)送應(yīng)用程序必須控制寫入緩存的速率绑青,不能太快 ,否則發(fā)送緩存就會(huì)沒有存放數(shù)據(jù)的空間吮铭。

  • 接收緩存用來暫時(shí)存放:
    • 按序到達(dá)的时迫、但尚未被接收應(yīng)用程序讀取的數(shù)據(jù);
    • 不按序到達(dá)的數(shù)據(jù)谓晌。

如果收到的分組被檢測(cè)出有差錯(cuò),則要丟棄癞揉。如果接收應(yīng)用程序來不及讀取收到的數(shù)據(jù)纸肉,接收緩存最終就會(huì)被填滿溺欧,使接收窗口減少到零。反之柏肪,如果接收應(yīng)用程序能夠及時(shí)從接收緩存中讀取收到的數(shù)據(jù)姐刁,接收窗口就可以增大,但最大不能超過接收緩存的大小烦味。

需要強(qiáng)調(diào)三點(diǎn)
  • A 的發(fā)送窗口并不總是和 B 的接收窗口一樣大(因?yàn)橛幸欢ǖ臅r(shí)間滯后)聂使。
  • TCP 標(biāo)準(zhǔn)沒有規(guī)定對(duì)不按序到達(dá)的數(shù)據(jù)應(yīng)如何處理。通常是先臨時(shí)存放在接收窗口中谬俄,等到字節(jié)流中所缺少的字節(jié)收到后蝇更,再按序交付上層的應(yīng)用進(jìn)程恃逻。
  • TCP 要求接收方必須有累積確認(rèn)的功能,這樣可以減小傳輸開銷。

超時(shí)重傳時(shí)間的選擇

  • 重傳機(jī)制是 TCP 中最重要和最復(fù)雜的問題之一饭宾。
  • TCP 每發(fā)送一個(gè)報(bào)文段,就對(duì)這個(gè)報(bào)文段設(shè)置一次計(jì)時(shí)器惭适。只要計(jì)時(shí)器設(shè)置的重傳時(shí)間到但還沒有收到確認(rèn)科阎,就要重傳這一報(bào)文段。

往返時(shí)延的方差很大

  • 由于 TCP 的下層是一個(gè)互聯(lián)網(wǎng)環(huán)境算灸,IP 數(shù)據(jù)報(bào)所選擇的路由變化很大扼劈。因而運(yùn)輸層的往返時(shí)間的方差也很大。
往返時(shí)延的方差很大.png

加權(quán)平均往返時(shí)間RTT

TCP才用了一種自適應(yīng)算法菲驴,它記錄一個(gè)報(bào)文段發(fā)出的時(shí)間荐吵,以及收到相應(yīng)的確認(rèn)的時(shí)間。這兩個(gè)時(shí)間之差就是報(bào)文段的往返時(shí)間RTT谢翎。

TCP 保留了 RTT 的一個(gè)加權(quán)平均往返時(shí)間 RTTs(這又稱為平滑(smooth)的往返時(shí)間捍靠,因?yàn)槭羌訖?quán)平均,所以是平滑的)森逮。
第一次測(cè)量到 RTT 樣本時(shí)榨婆,RTTS 值就取為所測(cè)量到的 RTT 樣本值。以后每測(cè)量到一個(gè)新的 RTT 樣本褒侧,就按下式重新計(jì)算一次 RTTS:

加權(quán)平均公式.png

式中良风,0=<a<1。若 a 很接近于零闷供,表示 RTT 值更新較慢(新的RTTs值和舊的RTTs值相比變化不大)烟央。若選擇 a 接近于 1,則表示 RTT 值更新較快(新的RTTs值受新的RTT樣本的影響較大)歪脏。
RFC 2988 推薦的 a 值為 1/8疑俭,即 0.125。

超時(shí)重傳時(shí)間RTO

顯然婿失,RTO 應(yīng)略大于上面得出的加權(quán)平均往返時(shí)間 RTTs
RFC 2988 建議使用下式計(jì)算 RTO:

RTO.png

RTTD 是 RTT 的偏差的加權(quán)平均值钞艇,他與RTTs和新的RTT樣本之差有關(guān)啄寡。
RFC 2988 建議這樣計(jì)算 RTTD。第一次測(cè)量時(shí)哩照,RTTD 值取為測(cè)量到的 RTT 樣本值的一半挺物。在以后的測(cè)量中,則使用下式計(jì)算加權(quán)平均的 RTTD:

RTTD .png

β是個(gè)小于 1 的系數(shù)飘弧,其推薦值是 1/4识藤,即 0.25。

往返時(shí)間的測(cè)量相當(dāng)復(fù)雜

  • TCP 報(bào)文段 1 沒有收到確認(rèn)次伶。重傳(即報(bào)文段 2)后痴昧,收到了確認(rèn)報(bào)文段 ACK。
  • 如何判定此確認(rèn)報(bào)文段是對(duì)原來的報(bào)文段 1 的確認(rèn)学少,還是對(duì)重傳的報(bào)文段 2 的確認(rèn)剪个?
往返時(shí)間的測(cè)量相當(dāng)復(fù)雜.png

Karn算法

為了解決上面那個(gè)問題,Karn提出了一個(gè)算法

在計(jì)算平均往返時(shí)間 RTT 時(shí)版确,只要**報(bào)文段重傳了扣囊,就不采用其往返時(shí)間樣本。這樣得出的加權(quán)平均平均往返時(shí)間 RTTS 和超時(shí)重傳時(shí)間 RTO 就較準(zhǔn)確绒疗。 **

但是侵歇,這又有了新的問題、設(shè)想出現(xiàn)這樣的情況:報(bào)文段的時(shí)延突然增大了很多吓蘑。因此在原來得出的重傳時(shí)間內(nèi)惕虑,不會(huì)收到確認(rèn)報(bào)文段。于是就重傳報(bào)文段磨镶。但根據(jù)Karn算法溃蔫,不考慮重傳的報(bào)文段的往返時(shí)間樣本。這樣琳猫,超時(shí)重傳時(shí)間就無法更新伟叛。

修正的Karn算法

報(bào)文段每重傳一次,就把 RTO 增大一些:

修正的Karn算法.png

系數(shù) γ 的典型值是 2 脐嫂。
當(dāng)不再發(fā)生報(bào)文段的重傳時(shí)统刮,才根據(jù)報(bào)文段的往返時(shí)延更新平均往返時(shí)延 RTT 和超時(shí)重傳時(shí)間 RTO 的數(shù)值。
實(shí)踐證明账千,這種策略較為合理侥蒙。

選擇確認(rèn)SACK(selective ACK)

接收方收到了和前面的字節(jié)流不連續(xù)*的兩個(gè)字節(jié)塊(只是未按序號(hào),它是無差錯(cuò)的)

如果這些字節(jié)的序號(hào)都在接收窗口之內(nèi)匀奏,那么接收方就先收下這些數(shù)據(jù)鞭衩,但要把這些信息準(zhǔn)確地告訴發(fā)送方,使發(fā)送方不要再重復(fù)發(fā)送這些已收到的數(shù)據(jù)。

接收到不連續(xù)的字節(jié)流.png

和前后字節(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 2018的規(guī)定

  • TCP首部并沒有哪個(gè)字段能提供上述這些字節(jié)塊的邊界信息矢沿。如果要使用選擇確認(rèn)滥搭,那么在建立 TCP 連接時(shí),就要在 TCP 首部的選項(xiàng)中加上“允許 SACK”的選項(xiàng)捣鲸,而雙方必須都事先商定好瑟匆。
  • 如果使用選擇確認(rèn),那么原來首部中的“確認(rèn)號(hào)字段”的用法仍然不變栽惶。只是以后在 TCP 報(bào)文段的首部中都增加了 SACK 選項(xiàng)愁溜,以便報(bào)告收到的不連續(xù)的字節(jié)塊的邊界。
  • 由于首部選項(xiàng)的長度最多只有 40 字節(jié)外厂,而指明一個(gè)邊界就要用掉 4 字節(jié)冕象,因此在選項(xiàng)中最多只能指明 4 個(gè)字節(jié)塊的邊界信息。

詳見P211

TCP流量控制

利用滑動(dòng)窗口實(shí)現(xiàn)流量控制

一般說來汁蝶,我們總是希望數(shù)據(jù)傳輸?shù)酶煲恍┙グ纭5绻l(fā)送方把數(shù)據(jù)發(fā)送得過快,
接收方就可能來不及接收掖棉,這就會(huì)造成數(shù)據(jù)的丟失墓律。

流量控制(flow control)就是讓發(fā)送方的發(fā)送速率不要太快,既要讓接收方來得及接收幔亥,也不要使網(wǎng)絡(luò)發(fā)生擁塞耻讽。

利用滑動(dòng)窗口機(jī)制可以很方便地在 TCP 連接上實(shí)現(xiàn)流量控制。

流量控制舉例

A 向 B 發(fā)送數(shù)據(jù)紫谷。在連接建立時(shí)齐饮,?B 告訴 A:“我的接收窗口 rwnd = 400(字節(jié))”。看下TCP首部窗口字段的用處

流量控制舉例.png

接收方的主機(jī)B一共進(jìn)行了3次流量控制(藍(lán)線)

考慮一種情況笤昨,B向A發(fā)送了零窗口的報(bào)文段后不久祖驱,B的接收緩存又有了一些存儲(chǔ)空間。于是B向A發(fā)送了rwnd = 400的報(bào)文段瞒窒,然而這個(gè)報(bào)文段在傳輸過程中丟失了捺僻。A一直等收到B發(fā)送非零窗口的通知,B也一直等A發(fā)送數(shù)據(jù)來,就形成了死鎖匕坯。下面的持續(xù)計(jì)時(shí)器就是為了打破死鎖僵局的

持續(xù)計(jì)時(shí)器(persistence 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í)器礁遵。
  • 若窗口不是零,則死鎖的僵局就可以打破了采记。

必須考慮傳輸效率

應(yīng)用進(jìn)程把數(shù)據(jù)傳送到TCP發(fā)送緩存后佣耐,剩下的發(fā)送任務(wù)就由TCP來控制了∵罅洌可以用不同的機(jī)制來控制 TCP 報(bào)文段的發(fā)送時(shí)機(jī):

  • 第一種機(jī)制是 TCP 維持一個(gè)變量兼砖,它等于最大報(bào)文段長度 MSS。只要緩存中存放的數(shù)據(jù)達(dá)到 MSS 字節(jié)時(shí)既棺,就組裝成一個(gè) TCP 報(bào)文段發(fā)送出去讽挟。
  • 第二種機(jī)制是由發(fā)送方的應(yīng)用進(jìn)程指明要求發(fā)送報(bào)文段,即 TCP 支持的推送(push)操作援制。
  • 第三種機(jī)制是發(fā)送方的一個(gè)計(jì)時(shí)器期限到了戏挡,這時(shí)就把當(dāng)前已有的緩存數(shù)據(jù)裝入報(bào)文段(但長度不能超過 MSS)發(fā)送出去。

至于如何控制發(fā)送的 時(shí)機(jī) 詳見P213

TCP的擁塞控制

擁塞控制的一般原理

在某段時(shí)間晨仑,若對(duì)網(wǎng)絡(luò)中某資源的需求超過了該資源所能提供的可用部分褐墅,網(wǎng)絡(luò)的性能就要變壞——產(chǎn)生擁塞(congestion)

出現(xiàn)資源擁塞的條件: 對(duì)資源需求的總和 > 可用資源

若網(wǎng)絡(luò)中有許多資源同時(shí)產(chǎn)生擁塞,網(wǎng)絡(luò)的性能就要明顯變壞洪己,整個(gè)網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降妥凳。

解決擁塞的要點(diǎn)是平衡,要讓整個(gè)系統(tǒng)的性能想匹配(P214)答捕。

擁塞控制與流量控制關(guān)系密切

  • 擁塞控制所要做的都有一個(gè)前提逝钥,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷
  • 擁塞控制是一個(gè)全局性的過程拱镐,涉及到所有的主機(jī)艘款、所有的路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素沃琅。
  • 流量控制往往指在給定的發(fā)送端和接收端之間的點(diǎn)對(duì)點(diǎn)通信量的控制哗咆。
  • 流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收益眉。

擁塞控制所起的作用

橫坐標(biāo)為提供的負(fù)載晌柬,代表單位時(shí)間內(nèi)輸入給網(wǎng)絡(luò)的分組的數(shù)目(也叫作輸入負(fù)載或網(wǎng)絡(luò)負(fù)載)姥份,縱坐標(biāo)是吞吐量,代表單位時(shí)間內(nèi)從網(wǎng)絡(luò)輸出的分組數(shù)目年碘。

擁塞控制所起的作用.png

擁塞控制的一般原理

  • 擁塞控制是很難設(shè)計(jì)的澈歉,因?yàn)樗且粋€(gè)動(dòng)態(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è)計(jì)網(wǎng)絡(luò)時(shí)事先將有關(guān)發(fā)生擁塞的因素考慮周到拴竹,力求網(wǎng)絡(luò)在工作時(shí)不產(chǎn)生擁塞,但是系統(tǒng)運(yùn)行起來就不再中途更正了剧罩。
  • 閉環(huán)控制是基于反饋環(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)的問題。

檢測(cè)擁塞的指標(biāo)

由于缺少緩存空間而被丟棄的分組的百分?jǐn)?shù)镇防,平均隊(duì)列長度啦鸣,超時(shí)重傳的分組數(shù),平均分組時(shí)延来氧,分組時(shí)延的標(biāo)準(zhǔn)差等诫给,這些指標(biāo)的上升都標(biāo)志著擁塞的增長。

幾種擁塞控制方法

慢開始和擁塞避免

  • 發(fā)送方維持一個(gè)叫做擁塞窗口 cwnd (congestion window)的狀態(tài)變量啦扬。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度中狂,并且動(dòng)態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口扑毡。如再考慮到接收方的接收能力胃榕,則發(fā)送窗口還可能小于擁塞窗口。
  • 發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞瞄摊,擁塞窗口就再增大一些勋又,以便把更多的分組發(fā)送出去。但只要網(wǎng)絡(luò)出現(xiàn)擁塞换帜,擁塞窗口就減小一些楔壤,以減少注入到網(wǎng)絡(luò)中的分組數(shù)。

慢開始算法的原理

方便起見膜赃,我們用報(bào)文段的個(gè)數(shù)作為窗口大小的單位

  • 在主機(jī)剛剛開始發(fā)送報(bào)文段時(shí)可先設(shè)置擁塞窗口 cwnd = 1挺邀,即設(shè)置為一個(gè)最大報(bào)文段 MSS 的數(shù)值。
  • 在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后,將擁塞窗口加 1端铛,即增加一個(gè) MSS 的數(shù)值泣矛。
  • 用這樣的方法逐步增大發(fā)送端的擁塞窗口 cwnd,可以使分組注入到網(wǎng)絡(luò)的速率更加合理禾蚕。

傳播輪次(transmission round)

  • 使用慢開始算法后您朽,每經(jīng)過一個(gè)傳輸輪次擁塞窗口 cwnd 就加倍换淆。
  • 一個(gè)傳輸輪次所經(jīng)歷的時(shí)間其實(shí)就是往返時(shí)間 RTT哗总。
  • “傳輸輪次”更加強(qiáng)調(diào):把擁塞窗口 cwnd 所允許發(fā)送的報(bào)文段都連續(xù)發(fā)送出去,并收到了對(duì)已發(fā)送的最后一個(gè)字節(jié)的確認(rèn)倍试。
  • 例如讯屈,擁塞窗口 cwnd = 4,這時(shí)的往返時(shí)間 RTT 就是發(fā)送方連續(xù)發(fā)送 4 個(gè)報(bào)文段县习,并收到這 4 個(gè)報(bào)文段的確認(rèn)涮母,總共經(jīng)歷的時(shí)間。
慢開始算法.png

設(shè)置慢開始門限狀態(tài)變量 ssthresh

慢開始門限 ssthresh 的用法如下:

  • 當(dāng) cwnd < ssthresh 時(shí)躁愿,使用慢開始算法叛本。
  • 當(dāng) cwnd > ssthresh 時(shí),停止使用慢開始算法而改用擁塞避免算法彤钟。
  • 當(dāng) cwnd = ssthresh 時(shí)来候,既可使用慢開始算法,也可使用擁塞避免算法逸雹。

擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢地增大营搅,即每經(jīng)過一個(gè)往返時(shí)間 RTT 就把發(fā)送方的擁塞窗口 cwnd 加 1,而不是加倍峡眶,使擁塞窗口 cwnd 按線性規(guī)律緩慢增長剧防,比慢開始算法的擁塞窗口增長速率緩慢很多。

網(wǎng)絡(luò)出現(xiàn)擁塞時(shí)

  • 無論在慢開始階段還是在擁塞避免階段辫樱,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有按時(shí)收到確認(rèn))峭拘,就要把慢開始門限 ssthresh 設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送方窗口值的一半(但不能小于2)。
  • 然后把擁塞窗口 cwnd 重新設(shè)置為 1狮暑,執(zhí)行慢開始算法鸡挠。
  • 這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時(shí)間把隊(duì)列中積壓的分組處理完畢搬男。

慢開始和擁塞避免算法的實(shí)現(xiàn)舉例

當(dāng) TCP 連接進(jìn)行初始化時(shí)拣展,將擁塞窗口置為 1。圖中的窗口單位不使用字節(jié)而使用報(bào)文段缔逛。

慢開始門限的初始值設(shè)置為 16 個(gè)報(bào)文段备埃,即 ssthresh = 16姓惑。

發(fā)送端的發(fā)送窗口不能超過擁塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我們假定接收端窗口足夠大按脚,因此現(xiàn)在發(fā)送窗口的數(shù)值等于擁塞窗口的數(shù)值于毙。

慢開始和擁塞避免算法的實(shí)現(xiàn)舉例.png

下面的執(zhí)行步驟就是按照折現(xiàn)上的點(diǎn)的順序

  1. 在執(zhí)行慢開始算法時(shí),擁塞窗口 cwnd 的初始值為 1辅搬,發(fā)送第一個(gè)報(bào)文段 M0唯沮。
  2. 發(fā)送端每收到一個(gè)確認(rèn) ,就把 cwnd 加 1堪遂。于是發(fā)送端可以接著發(fā)送 M1 和 M2 兩個(gè)報(bào)文段介蛉。
  3. 接收端共發(fā)回兩個(gè)確認(rèn)。發(fā)送端每收到一個(gè)對(duì)新報(bào)文段的確認(rèn)溶褪,就把發(fā)送端的 cwnd 加 1”揖桑現(xiàn)在 cwnd 從 2 增大到 4,并可接著發(fā)送后面的 4 個(gè)報(bào)文段竿滨。
  4. 發(fā)送端每收到一個(gè)對(duì)新報(bào)文段的確認(rèn)佳恬,就把發(fā)送端的擁塞窗口加 1,因此擁塞窗口 cwnd 隨著傳輸輪次按指數(shù)規(guī)律增長于游。
  5. 當(dāng)擁塞窗口 cwnd 增長到慢開始門限值 ssthresh 時(shí)(即當(dāng) cwnd = 16 時(shí)),就改為執(zhí)行擁塞避免算法垫言,擁塞窗口按線性規(guī)律增長贰剥。
  6. 假定擁塞窗口的數(shù)值增長到 24 時(shí),網(wǎng)絡(luò)出現(xiàn)超時(shí)筷频,表明網(wǎng)絡(luò)擁塞了蚌成。
  7. 更新后的 ssthresh 值變?yōu)?12(即發(fā)送窗口數(shù)值 24 的一半),擁塞窗口再重新設(shè)置為 1凛捏,并執(zhí)行慢開始算法担忧。
  8. 當(dāng) cwnd = 12 時(shí)改為執(zhí)行擁塞避免算法,擁塞窗口按按線性規(guī)律增長坯癣,每經(jīng)過一個(gè)往返時(shí)延就增加一個(gè) MSS 的大小瓶盛。

乘法減小(multiplicative decrease)

  • “乘法減小“是指不論在慢開始階段還是擁塞避免階段示罗,只要出現(xiàn)一次超時(shí)(即出現(xiàn)一次網(wǎng)絡(luò)擁塞)惩猫,就把慢開始門限值 ssthresh 設(shè)置為當(dāng)前的擁塞窗口值乘以 0.5。
  • 當(dāng)網(wǎng)絡(luò)頻繁出現(xiàn)擁塞時(shí)蚜点,ssthresh 值就下降得很快轧房,以大大減少注入到網(wǎng)絡(luò)中的分組數(shù)。

加法增大(addictive increase)
“加法增大”是指執(zhí)行擁塞避免算法后绍绘,在收到對(duì)所有報(bào)文段的確認(rèn)后(即經(jīng)過一個(gè)往返時(shí)間)奶镶,就把擁塞窗口 cwnd增加一個(gè) MSS 大小迟赃,使擁塞窗口緩慢增大,以防止網(wǎng)絡(luò)過早出現(xiàn)擁塞厂镇。

要指出

  • “擁塞避免”并非指完全能夠避免了擁塞纤壁。利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的。
  • “擁塞避免”是說在擁塞避免階段把擁塞窗口控制為按線性規(guī)律增長剪撬,使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞摄乒。

快重傳和快恢復(fù)

快重傳

  • 快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)。這樣做可以讓發(fā)送方及早知道有報(bào)文段沒有到達(dá)接收方残黑。
  • 發(fā)送方只要一連收到三個(gè)重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段馍佑。
  • 不難看出,快重傳并非取消重傳計(jì)時(shí)器梨水,而是在某些情況下可更早地重傳丟失的報(bào)文段拭荤。

快重傳舉例.png

對(duì)上圖的解釋請(qǐng)見P220

快恢復(fù)算法

與快重傳配合使用的還有快恢復(fù)算法

  • 當(dāng)發(fā)送端收到連續(xù)三個(gè)重復(fù)的確認(rèn)時(shí),就執(zhí)行“乘法減小”算法疫诽,把慢開始門限 ssthresh 減半舅世。但接下去不執(zhí)行慢開始算法。
  • 由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒有發(fā)生擁塞奇徒,因此現(xiàn)在不執(zhí)行慢開始算法雏亚,即擁塞窗口 cwnd 現(xiàn)在不設(shè)置為 1,而是設(shè)置為慢開始門限 ssthresh 減半后的數(shù)值摩钙,然后開始執(zhí)行擁塞避免算法(“加法增大”)罢低,使擁塞窗口緩慢地線性增大。

從連續(xù)收到三個(gè)重復(fù)的確認(rèn)傳入擁塞避免(下圖)

從連續(xù)收到三個(gè)重復(fù)的確認(rèn)傳入擁塞避免.png

發(fā)送窗口的上限值

  • 發(fā)送方的發(fā)送窗口的上限值應(yīng)當(dāng)取為接收方窗口 rwnd擁塞窗口 cwnd 這兩個(gè)變量中較小的一個(gè)胖笛,即應(yīng)按以下公式確定:
發(fā)送窗口的上限值.png

當(dāng) rwnd < cwnd 時(shí)网持,是接收方的接收能力限制發(fā)送窗口的最大值。
當(dāng) cwnd < rwnd 時(shí)长踊,則是網(wǎng)絡(luò)的擁塞限制發(fā)送窗口的最大值功舀。

隨機(jī)早期檢測(cè)RED(Random Early Detection)

背景見P221
使路由器的隊(duì)列維持兩個(gè)參數(shù),即隊(duì)列長度最小門限 THmin 和最大門限 THmax身弊。
RED 對(duì)每一個(gè)到達(dá)的數(shù)據(jù)報(bào)都先計(jì)算平均隊(duì)列長度 LAV辟汰。

  1. 若平均隊(duì)列長度小于最小門限 THmin,則將新到達(dá)的數(shù)據(jù)報(bào)放入隊(duì)列進(jìn)行排隊(duì)佑刷。
  2. 若平均隊(duì)列長度超過最大門限 THmax莉擒,則將新到達(dá)的數(shù)據(jù)報(bào)丟棄。
  3. 若平均隊(duì)列長度在最小門限 THmin 和最大門限THmax 之間瘫絮,則按照某一概率 p 將新到達(dá)的數(shù)據(jù)報(bào)丟棄涨冀。
隨機(jī)早期檢測(cè)RED.png

隨機(jī)早期檢測(cè)的隨機(jī)就提現(xiàn)在3中,也就說麦萤,RED不是等到已經(jīng)發(fā)生網(wǎng)絡(luò)擁塞后才把所有在隊(duì)列尾部的分組全部丟棄鹿鳖,而是在檢測(cè)到網(wǎng)絡(luò)擁塞的早期征兆時(shí)(即路由器的平均隊(duì)列長度超過一定的門限值時(shí))扁眯,就先以概率p隨機(jī)丟棄個(gè)別的分組,讓擁塞控制只在個(gè)別的TCP連接上進(jìn)行翅帜,因而避免發(fā)生全局性的擁塞控制姻檀。

最小門限應(yīng)該足夠大,以保證連接路由器的輸出鏈路有較高的利用率涝滴。而最大門限和最小門限的差也應(yīng)該足夠大绣版,使得在一個(gè)TCP往返時(shí)間RTT中隊(duì)列的正常增長仍在最大門限之內(nèi)。經(jīng)驗(yàn)證明最大門限等于最小門限的兩倍是合適的

丟棄概率 p 與 THmin 和 Thmax 的關(guān)系

  • 當(dāng) LAV > Thmin 時(shí)歼疮,丟棄概率 p = 0杂抽。
  • 當(dāng) LAV < Thmax 時(shí),丟棄概率 p = 1韩脏。
  • 當(dāng) THmin < LAV < THmax時(shí)缩麸, 0 < p < 1 。
    例如赡矢,按線性規(guī)律變化杭朱,從 0 變到 pmax
丟棄概率 p 與 THmin 和 Thmax 的關(guān)系 .png

為什么要用平均隊(duì)列長度?我們知道計(jì)算機(jī)數(shù)據(jù)具有突發(fā)性的特點(diǎn)吹散,因此路由器中的隊(duì)列長度經(jīng)常會(huì)出現(xiàn)很快的起伏變化弧械。如果丟棄概率p按照瞬時(shí)隊(duì)列長度來計(jì)算,那就可能會(huì)出現(xiàn)一些不合理的現(xiàn)象空民。例如很短的突發(fā)數(shù)據(jù)不大可能使隊(duì)列溢出梦谜,因此對(duì)于這種數(shù)據(jù),如果僅因?yàn)樗矔r(shí)隊(duì)列長度超過了門限值THmin就將其丟棄就會(huì)產(chǎn)生不必要的擁塞控制

下圖也說明了這一點(diǎn)

平均隊(duì)列長度和瞬時(shí)隊(duì)列長度的區(qū)別.png

平均隊(duì)列長度以及p的計(jì)算

見P223

TCP運(yùn)輸連接管理

運(yùn)輸連接的三個(gè)階段

  • 運(yùn)輸連接就有三個(gè)階段袭景,即:連接建立數(shù)據(jù)傳送連接釋放闭树。運(yùn)輸連接的管理就是使運(yùn)輸連接的建立和釋放都能正常地進(jìn)行耸棒。

連接建立過程中要解決以下三個(gè)問題:

  • 要使每一方能夠確知對(duì)方的存在。
  • 要允許雙方協(xié)商一些參數(shù)(如最大報(bào)文段長度报辱,最大窗口大小与殃,服務(wù)質(zhì)量等)。
  • 能夠?qū)\(yùn)輸實(shí)體資源(如緩存大小碍现,連接表中的項(xiàng)目等)進(jìn)行分配幅疼。

客戶 - 服務(wù)器方式
TCP連接的建立都是采用客戶端服務(wù)器的方式,主動(dòng)發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶(client)昼接,被動(dòng)等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器(server)

TCP的連接建立(三次握手)

三次握手.png

本節(jié)在P225

  1. B的TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB(transmission control block爽篷,存儲(chǔ)了每一個(gè)連接中的一些重要信息:TCP連接表,到發(fā)送和接收緩存的指針慢睡,到重傳隊(duì)列的指針逐工,當(dāng)前的發(fā)送和接收序號(hào)等等)铡溪,準(zhǔn)備接受客戶進(jìn)程的連接請(qǐng)求。然后服務(wù)器進(jìn)程就處于LISTEN(收聽)狀態(tài)泪喊,等待客戶的連接請(qǐng)求棕硫。如果有就作出響應(yīng)
  2. A的TCP客戶進(jìn)程也是首先創(chuàng)建傳輸控制塊TCB,然后A 的 TCP 向 B 發(fā)出連接請(qǐng)求報(bào)文段袒啼,其首部中的同步位 SYN = 1哈扮,并選擇序號(hào) seq = x,表明傳送數(shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)是 x蚓再。
  3. B 的 TCP 收到連接請(qǐng)求報(bào)文段后滑肉,如同意,則發(fā)回確認(rèn)对途。B 在確認(rèn)報(bào)文段中應(yīng)使 SYN = 1赦邻,使 ACK = 1,其確認(rèn)號(hào)ack = x + 1实檀,自己選擇的序號(hào) seq = y惶洲。
  4. A 收到此報(bào)文段后向 B 給出確認(rèn),其 ACK = 1膳犹,確認(rèn)號(hào) ack = y + 1恬吕。A 的 TCP 通知上層應(yīng)用進(jìn)程,連接已經(jīng)建立须床。
  5. B 的 TCP 收到主機(jī) A 的確認(rèn)后铐料,也通知其上層應(yīng)用進(jìn)程:TCP 連接已經(jīng)建立。

三次握手建立TCP連接的各狀態(tài)

三次握手建立TCP連接的各狀態(tài).png

“三次”握手的原因

為什么A還要再發(fā)送一次數(shù)據(jù)呢豺旬?主要是為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了B钠惩,因而產(chǎn)生錯(cuò)誤。

所謂的“已失效的連接請(qǐng)求報(bào)文段”是這樣產(chǎn)生的族阅。

  • 考慮一種正常情況篓跛。A發(fā)送了連接請(qǐng)求,但是因?yàn)檫B接請(qǐng)求報(bào)文丟失而未收到確認(rèn)坦刀。于是A再重傳一次連接請(qǐng)求愧沟。后來收到了確認(rèn)十艾,建立了連接幽纷。數(shù)據(jù)傳輸完畢后,就釋放了連接寥枝。A共發(fā)送了兩個(gè)連接請(qǐng)求報(bào)文段盖奈,其中第一個(gè)丟失混坞,第二個(gè)到達(dá)了B。沒有“已失效的連接請(qǐng)求報(bào)文段 ”
  • 現(xiàn)假定出現(xiàn)一種異常情況卜朗,即A發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒有丟失拔第,而是在某些網(wǎng)絡(luò)結(jié)點(diǎn)長時(shí)間滯留了咕村,以至延誤到連接釋放后才到達(dá)B。本來這是一個(gè)早已經(jīng)失效的報(bào)文段蚊俺。但B收到此失效的連接請(qǐng)求報(bào)文后懈涛,就誤認(rèn)為是A又發(fā)來一次新的連接請(qǐng)求。于是就向A發(fā)送確認(rèn)報(bào)文泳猬,同意建立連接批钠。假定不采用三次握手,那么只要B發(fā)出確認(rèn)得封,新的連接就建成了埋心。由于現(xiàn)在A并沒有建立連接的請(qǐng)求,因此并不會(huì)理睬B的確認(rèn)忙上,也不會(huì)向B發(fā)送數(shù)據(jù)拷呆,但是B卻以為連接已經(jīng)建立,并一直等待A發(fā)送數(shù)據(jù)疫粥,B的許多資源就這樣白白浪費(fèi)了茬斧。采用三次握手就可以防止上述現(xiàn)象的發(fā)生。例如在剛才的情況下梗逮,A不會(huì)向B的確認(rèn)發(fā)出確認(rèn)项秉,B由于收不到第三次握手,就知道A并沒有要求建立連接慷彤。

TCP連接的釋放(四次握手)

TCP連接的釋放.png
  • 數(shù)據(jù)傳輸結(jié)束后娄蔼,通信的雙方都可釋放連接。現(xiàn)在 A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報(bào)文段底哗,并停止再發(fā)送數(shù)據(jù)岁诉,主動(dòng)關(guān)閉 TCP連接。A 把連接釋放報(bào)文段首部的 FIN = 1跋选,其序號(hào)seq = u(等于A前面?zhèn)鬏數(shù)淖詈笠粋€(gè)字節(jié)號(hào)+1)唉侄,等待 B 的確認(rèn)。
  • B 發(fā)出確認(rèn)野建,確認(rèn)號(hào) ack = u + 1,而這個(gè)報(bào)文段自己的序號(hào) seq = v(等于B前面?zhèn)鬏數(shù)淖詈笠粋€(gè)字節(jié)號(hào)+1)恬叹。TCP 服務(wù)器進(jìn)程通知高層應(yīng)用進(jìn)程候生。從 A 到 B 這個(gè)方向的連接就釋放了,TCP 連接處于半關(guān)閉狀態(tài)绽昼。B 若發(fā)送數(shù)據(jù)唯鸭,A 仍要接收。
  • 若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù)硅确,其應(yīng)用進(jìn)程就通知 TCP 釋放連接目溉,序號(hào)為seq = w(在半關(guān)閉狀態(tài)可能又發(fā)送了一些數(shù)據(jù)) ack = u+1(B還必須記錄上次已發(fā)送的確認(rèn)號(hào))明肮。
  • A 收到連接釋放報(bào)文段后,必須發(fā)出確認(rèn)缭付。在確認(rèn)報(bào)文段中 ACK = 1柿估,確認(rèn)號(hào) ack = w + 1,自己的序號(hào) seq = u + 1陷猫。
  • TCP 連接必須經(jīng)過時(shí)間 2MSL (最長報(bào)文壽命)后才真正釋放掉秫舌。

A必須等待2MSL的時(shí)間

  • 第一,為了保證 A 發(fā)送的最后一個(gè) ACK 報(bào)文段能夠到達(dá) B绣檬。
    這個(gè)報(bào)文段有可能丟失足陨,因?yàn)槭沟锰幱贚AST-ACK狀態(tài)的B收不到對(duì)已發(fā)送的FIN+ACK報(bào)文段的確認(rèn)。B會(huì)超時(shí)重傳這個(gè)FIN+ACK報(bào)文段娇未,而A就能在這2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段墨缘,接著A重傳一次確認(rèn),重新啟動(dòng)2MSL計(jì)時(shí)器直到雙方都關(guān)閉零抬。
  • 第二镊讼,防止 “已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。A 在發(fā)送完最后一個(gè) ACK 報(bào)文段后媚值,再經(jīng)過時(shí)間 2MSL狠毯,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段,都從網(wǎng)絡(luò)中消失褥芒。這樣就可以使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段嚼松。
    除時(shí)間等待計(jì)時(shí)器外,TCP還設(shè)有一個(gè)泵谭觯活計(jì)時(shí)器献酗,設(shè)想有這樣的情況:客戶已主動(dòng)與服務(wù)器建立了TCP連接。但后來客戶端的主機(jī)出現(xiàn)了故障坷牛。顯然罕偎,服務(wù)器以后就不再收到客戶發(fā)來的數(shù)據(jù),因此京闰,應(yīng)當(dāng)有措施使得服務(wù)器不會(huì)白白等下去颜及。這就是使用保活器蹂楣,時(shí)間設(shè)置通常為兩小時(shí)俏站,服務(wù)器每收到一次客戶的數(shù)據(jù),就重新設(shè)置比粒活器肄扎。若兩小時(shí)每收到客戶的數(shù)據(jù),服務(wù)器就發(fā)送一個(gè)嗅探報(bào)文段,以后則每隔75分鐘發(fā)送一次犯祠,若一連發(fā)送10個(gè)嗅探報(bào)文后客戶端仍無響應(yīng)旭等,服務(wù)器就認(rèn)定客戶端發(fā)送故障,就關(guān)閉這個(gè)連接衡载。

TCP有限狀態(tài)機(jī)

  • TCP 有限狀態(tài)機(jī)的圖中每一個(gè)方框都是 TCP 可能具有的狀態(tài)搔耕。
  • 每個(gè)方框中的大寫英文字符串是 TCP 標(biāo)準(zhǔn)所使用的 TCP 連接狀態(tài)名。狀態(tài)之間的箭頭表示可能發(fā)生的狀態(tài)變遷月劈。
  • 箭頭旁邊的字度迂,表明引起這種變遷的原因,或表明發(fā)生狀態(tài)變遷后又出現(xiàn)什么動(dòng)作猜揪。
  • 圖中有三種不同的箭頭惭墓。
    • 粗實(shí)線箭頭表示對(duì)客戶進(jìn)程的正常變遷。
    • 粗虛線箭頭表示對(duì)服務(wù)器進(jìn)程的正常變遷而姐。
    • 另一種細(xì)線箭頭表示異常變遷腊凶。
TCP有限狀態(tài)機(jī).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拴念,隨后出現(xiàn)的幾起案子钧萍,更是在濱河造成了極大的恐慌,老刑警劉巖政鼠,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件风瘦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡公般,警方通過查閱死者的電腦和手機(jī)万搔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來官帘,“玉大人瞬雹,你說我怎么就攤上這事」艉纾” “怎么了酗捌?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涌哲。 經(jīng)常有香客問我胖缤,道長,這世上最難降的妖魔是什么阀圾? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任草姻,我火速辦了婚禮,結(jié)果婚禮上稍刀,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好账月,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布综膀。 她就那樣靜靜地躺著,像睡著了一般局齿。 火紅的嫁衣襯著肌膚如雪剧劝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天抓歼,我揣著相機(jī)與錄音讥此,去河邊找鬼。 笑死谣妻,一個(gè)胖子當(dāng)著我的面吹牛萄喳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹋半,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼他巨,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了减江?” 一聲冷哼從身側(cè)響起染突,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辈灼,沒想到半個(gè)月后份企,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巡莹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年司志,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榕莺。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俐芯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钉鸯,到底是詐尸還是另有隱情吧史,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布唠雕,位于F島的核電站贸营,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岩睁。R本人自食惡果不足惜钞脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捕儒。 院中可真熱鬧冰啃,春花似錦邓夕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扇调,卻和暖如春矿咕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狼钮。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工碳柱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熬芜。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓莲镣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猛蔽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剥悟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本書結(jié)構(gòu)是自頂向下的,所以請(qǐng)按下列順序閱讀: 1.計(jì)算機(jī)網(wǎng)絡(luò)自頂向下--應(yīng)用層2.計(jì)算機(jī)網(wǎng)絡(luò)自頂向下--運(yùn)輸層3....
    牛富貴兒閱讀 2,778評(píng)論 0 3
  • 協(xié)議的定義 為了在計(jì)算機(jī)網(wǎng)絡(luò)中有條不紊地交換數(shù)據(jù),就必須遵守一些事先約定好的規(guī)則慈缔。這些規(guī)則明確規(guī)定了所交換數(shù)據(jù)的格...
    王偵閱讀 1,695評(píng)論 0 3
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】傳輸層 傳輸層協(xié)議概述 傳輸層協(xié)議為運(yùn)行在不同host上的進(jìn)程提供了一種邏輯通信機(jī)制。使得端到端不需...
    666真666閱讀 2,004評(píng)論 0 4
  • 注:本文的圖片均來源于謝希仁《計(jì)算機(jī)網(wǎng)絡(luò)》第六版的課件PPT 1.重點(diǎn)內(nèi)容 (1)運(yùn)輸層為相互通信的應(yīng)用進(jìn)程提供邏...
    zuyuxia閱讀 1,101評(píng)論 0 1
  • 五月雨 文||與你相識(shí) 你輕柔的 從誰的纖手里掙脫 在大地的溫婉里妖嬈 五月雨种玛,是誰的新娘 帶來風(fēng)的問候 直抵相思...
    與你相識(shí)_40fa閱讀 270評(píng)論 0 1