TCP和UDP詳解

本篇文章主要是從運(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ā)的時候只有用到下三層的功能粱胜。

image
image

應(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)輸層之間并沒有一條水平方向的物理連接。
image
image

運(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ù)報正勒。
image
image
  • 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)用程序必須選擇合適大小的報文
image
image
image
image
  • 用戶數(shù)據(jù)報 UDP 有兩個字段:數(shù)據(jù)字段和首部字段咕别。首部字段有 8 個字節(jié)技健,由 4 個字段組成,每個字段都是兩個字節(jié)顷级。
  • 在計算檢驗(yàn)和時凫乖,臨時把“偽首部”和 UDP 用戶數(shù)據(jù)報連接在一起。偽首部僅僅是為了計算檢驗(yàn)和弓颈。


    image
    image

三帽芽、傳輸控制協(xié)議 TCP 概述

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

  • TCP 是面向連接的運(yùn)輸層協(xié)議。
  • 每一條 TCP 連接只能有兩個端點(diǎn)(endpoint)翔冀,每一條 TCP 連接只能是點(diǎn)對點(diǎn)的(一對一)导街。
  • TCP 提供可靠交付的服務(wù)。
  • TCP 提供全雙工通信纤子。
  • 面向字節(jié)流搬瑰。
image
image

注意:

  • 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é)議

image
image
  • 在發(fā)送完一個分組后陪踩,必須暫時保留已發(fā)送的分組的副本杖们。
  • 分組和確認(rèn)分組都必須進(jìn)行編號。
  • 超時計時器的重傳時間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些膊毁。
image
image
  • 使用上述的確認(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ù)不間斷地傳送步绸,這種傳輸方式可獲得很高的信道利用率。
image
image

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

image
image

累積確認(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報文段的首部格式

image
image
  • 源端口和目的端口字段——各占 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é)為單位的滑動窗口

image
image
image
image
image
image
image
image

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

  • 發(fā)送緩存用來暫時存放:
    • 發(fā)送應(yīng)用程序傳送給發(fā)送方 TCP 準(zhǔn)備發(fā)送的數(shù)據(jù)奠伪;
    • TCP 已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)跌帐。
image
image
  • 接收緩存用來暫時存放:
    • 按序到達(dá)的、但尚未被接收應(yīng)用程序讀取的數(shù)據(jù)绊率;
    • 不按序到達(dá)的數(shù)據(jù)谨敛。
image
image

需要強(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 樣本|
  • 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
    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
    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
    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
    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í)行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大枢劝。
image
image

發(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)。
image
image
  • 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的釋放

image
image
  • 數(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)這種舊的連接請求報文段妒貌。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末通危,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灌曙,更是在濱河造成了極大的恐慌菊碟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在刺,死亡現(xiàn)場離奇詭異逆害,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚣驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門魄幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颖杏,“玉大人纯陨,你說我怎么就攤上這事留储∫跤保” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長损晤。 經(jīng)常有香客問我软棺,道長红竭,這世上最難降的妖魔是什么尤勋? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茵宪,結(jié)果婚禮上最冰,老公的妹妹穿的比我還像新娘。我一直安慰自己稀火,他們只是感情好暖哨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凰狞,像睡著了一般篇裁。 火紅的嫁衣襯著肌膚如雪沛慢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天达布,我揣著相機(jī)與錄音团甲,去河邊找鬼。 笑死黍聂,一個胖子當(dāng)著我的面吹牛躺苦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播产还,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匹厘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脐区?” 一聲冷哼從身側(cè)響起愈诚,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牛隅,沒想到半個月后扰路,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倔叼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年汗唱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈攒。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡哩罪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巡验,到底是詐尸還是另有隱情际插,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布显设,位于F島的核電站框弛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捕捂。R本人自食惡果不足惜瑟枫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望指攒。 院中可真熱鬧慷妙,春花似錦、人聲如沸允悦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至架馋,卻和暖如春狞山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叉寂。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工铣墨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人办绝。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓伊约,卻偏偏與公主長得像,于是被迫代替她去往敵國和親孕蝉。 傳聞我的和親對象是個殘疾皇子屡律,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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

  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的降淮,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,068評論 6 174
  • 1 運(yùn)輸層協(xié)議概述 1.1 進(jìn)程之間的通信 網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信超埋,而運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯...
    Mr希靈閱讀 8,093評論 0 34
  • 個人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記佳鳖,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評論 0 8
  • 本書結(jié)構(gòu)是自頂向下的霍殴,所以請按下列順序閱讀: 1.計算機(jī)網(wǎng)絡(luò)自頂向下--應(yīng)用層2.計算機(jī)網(wǎng)絡(luò)自頂向下--運(yùn)輸層3....
    牛富貴兒閱讀 2,775評論 0 3
  • 注:本文的圖片均來源于謝希仁《計算機(jī)網(wǎng)絡(luò)》第六版的課件PPT 1.重點(diǎn)內(nèi)容 (1)運(yùn)輸層為相互通信的應(yīng)用進(jìn)程提供邏...
    zuyuxia閱讀 1,101評論 0 1