【計(jì)算機(jī)網(wǎng)絡(luò)】傳輸層

【計(jì)算機(jī)網(wǎng)絡(luò)】傳輸層

傳輸層協(xié)議概述

傳輸層協(xié)議為運(yùn)行在不同host上的進(jìn)程提供了一種邏輯通信機(jī)制。使得端到端不需要關(guān)心中間的過程,直接可以看作是可以通信的進(jìn)程型雳。

網(wǎng)絡(luò)層和傳輸層的區(qū)別

網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信颈将,運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯通信。

傳輸層對(duì)收到的報(bào)文進(jìn)行差錯(cuò)檢測烘挫,IP數(shù)據(jù)報(bào)首部中的校驗(yàn)和字段只檢驗(yàn)頭部是否出現(xiàn)差錯(cuò),而不檢查數(shù)據(jù)部分柬甥。

傳輸層位于網(wǎng)絡(luò)層之上饮六,依賴于網(wǎng)絡(luò)層服務(wù),對(duì)網(wǎng)絡(luò)層服務(wù)進(jìn)行增強(qiáng)苛蒲,向高層屏蔽了下面網(wǎng)絡(luò)核心的細(xì)節(jié)卤橄。它使應(yīng)用進(jìn)程看見的就好像在兩個(gè)運(yùn)輸層實(shí)體之間有一條端到端的邏輯通信信道。

傳輸層的協(xié)議

兩個(gè)對(duì)等運(yùn)輸實(shí)體在通信時(shí)傳送的數(shù)據(jù)單元叫做運(yùn)輸協(xié)議數(shù)據(jù)單元TPDU臂外,但在TCP/IP體系中窟扑,TCP叫報(bào)文段,UDP叫數(shù)據(jù)報(bào)漏健。

  • UDP
    • 不需要先建立連接
    • 遠(yuǎn)程主機(jī)的傳輸層在收到UDP報(bào)文后嚎货,不需要給出任何確認(rèn)
    • 不可靠的交付服務(wù)
    • 基于“盡力而為”的網(wǎng)絡(luò)層,沒有做可靠性方面的擴(kuò)展
  • TCP
    • 可靠蔫浆、按序的交付服務(wù)
    • 擁塞控制
    • 流量控制
    • 連接建立殖属、數(shù)據(jù)報(bào)傳送結(jié)束后要釋放連接
    • 額外開銷:確認(rèn)、流量控制瓦盛、計(jì)時(shí)器洗显、連接管理

兩種服務(wù)均不保證:延遲外潜、帶寬

常見應(yīng)用使用的協(xié)議

傳輸層的端口

在協(xié)議棧層間的抽象的協(xié)議端口是軟件端口,硬件端口是不同硬件設(shè)備進(jìn)行交互的接口挠唆,而軟件端口是應(yīng)用層的各種協(xié)議進(jìn)程與傳輸實(shí)體間進(jìn)行層間交互的一種地址橡卤。端口號(hào)只具有本地意義。

兩大類端口號(hào):

  • 服務(wù)器使用的端口號(hào)
    • 熟知端口號(hào)
    • 系統(tǒng)端口號(hào)
  • 客戶端使用的端口號(hào)

多路復(fù)用和多路分用

如果某層的一個(gè)協(xié)議對(duì)應(yīng)直接上層的多個(gè)協(xié)議/實(shí)體损搬,則需要復(fù)用/分用碧库。

接收端進(jìn)行多路分用:傳輸層依據(jù)頭部信息將接收到的Segment交給正確的Socket,即不同的進(jìn)程
發(fā)送端進(jìn)行多路復(fù)用:從多個(gè)Socket接收數(shù)據(jù)巧勤,為每塊數(shù)據(jù)封裝上頭部信息嵌灰,生成Segment,交給網(wǎng)絡(luò)層颅悉。

分用的流程:

  • 主機(jī)接收到IP數(shù)據(jù)報(bào)
    • 每個(gè)數(shù)據(jù)報(bào)攜帶源IP地址沽瞭,目的IP地址
    • 每個(gè)數(shù)據(jù)報(bào)攜帶一個(gè)傳輸層的段
    • 每個(gè)段攜帶源端口號(hào)和目的端口號(hào)
  • 主機(jī)收到Segment后,傳輸層協(xié)議提取IP地址和端口號(hào)信息剩瓶,將Segment導(dǎo)向相應(yīng)的Socket
    • TCP更多處理

無連接分用:

  • 利用端口號(hào)創(chuàng)建Socket
  • UDP的Socket用二元組標(biāo)識(shí)(目的IP地址驹溃,目的端口號(hào))
  • 主機(jī)收到UDP段后
    • 檢查段中的目的端口號(hào)
    • 將UDP段導(dǎo)向綁定在該端口號(hào)的Socket
  • 來自同源的IP地址和端口號(hào)的IP數(shù)據(jù)報(bào)被導(dǎo)向同一個(gè)Socket
  • 源端口號(hào)提供“返回地址”,返回?cái)?shù)據(jù)

面向連接的分用:

  • TCP的Socket的四元組標(biāo)識(shí)
    • 源IP地址
    • 源端口號(hào)
    • 目的IP地址
    • 目的端口號(hào)
  • 接收端利用所有的四個(gè)值將Segment導(dǎo)向合適的Socket
  • 服務(wù)器可能同時(shí)支持多個(gè)TCP Socket
  • Web服務(wù)器為每個(gè)客戶端開不同的Socket
端口分用

用戶數(shù)據(jù)包協(xié)議UDP

UDP概述

用戶數(shù)據(jù)包協(xié)議UDP只在IP的數(shù)據(jù)報(bào)服務(wù)上增加了很少一點(diǎn)的功能延曙,就是復(fù)用和分用的功能記憶差錯(cuò)檢測功能豌鹤。

UDP的特點(diǎn)

  • 無連接
    • 不需要握手
    • 每個(gè)UDP段的處理獨(dú)立于其他段
    • 減少了開銷和發(fā)送數(shù)據(jù)之前的時(shí)延
  • "盡力而為"服務(wù)
    • 丟失
    • 非按序到達(dá)
    • 不需要維持復(fù)雜的連接狀態(tài)表
  • 面向報(bào)文
    • 對(duì)應(yīng)用層的報(bào)文,添加首部后就向下交付給IP層枝缔,UDP對(duì)于應(yīng)用層的報(bào)文既不合并布疙,也不拆分,保留這些報(bào)文的邊界愿卸。應(yīng)用層給多長的報(bào)文灵临,UDP就照發(fā),即一次發(fā)送一個(gè)報(bào)文趴荸。交付時(shí)也是一次交付一整個(gè)報(bào)文儒溉。因此應(yīng)用層需要選擇合適大小的報(bào)文,若報(bào)文太長发钝,IP層在發(fā)送時(shí)可能要進(jìn)行分片顿涣,會(huì)降低IP層的效率
  • 沒用擁塞控制
    • 網(wǎng)絡(luò)的擁塞不會(huì)使源主機(jī)的發(fā)送速率降低,允許丟失一些數(shù)據(jù)
  • UDP支持一對(duì)一笼平、一對(duì)多园骆、多對(duì)一和多對(duì)多的交互通信
  • UDP首部開銷小
    • 只有8字節(jié),TCP20字節(jié)
UDP面向報(bào)文

UDP的首部格式

UDP有兩個(gè)字段:數(shù)據(jù)字段和首部字段寓调。

首部字段有8字節(jié):

  • 源端口
  • 目的端口
  • 長度
  • 校驗(yàn)和:檢測UDP用戶數(shù)據(jù)包在傳輸中是否有錯(cuò),有錯(cuò)就丟棄
UDP首部

如果接收方UDP的目的端口號(hào)不正確锄码,就丟棄該報(bào)文夺英,并有ICMP發(fā)送“端口不可達(dá)“差錯(cuò)報(bào)文給發(fā)送方晌涕。

UDP 校驗(yàn)和(checksum)

目的:檢查UDP段在傳輸中是否發(fā)生錯(cuò)誤(如位翻轉(zhuǎn))

發(fā)送方:

  • 將段的內(nèi)容視為16-bit整數(shù)
  • 校驗(yàn)和計(jì)算:計(jì)算所有整數(shù)的和,進(jìn)位加在和的后面痛悯,將得到的值按位求反余黎,得到校驗(yàn)和
  • 發(fā)送方將校驗(yàn)和放入校驗(yàn)和字段

接收方:

  • 計(jì)算所收到段的校驗(yàn)和
  • 將其與校驗(yàn)和字段進(jìn)行對(duì)比
    • 不相等:檢測出錯(cuò)誤
    • 相等:沒有檢測出錯(cuò)誤(但有可能有錯(cuò)誤)
計(jì)算校驗(yàn)和

TCP 概述

TCP主要特點(diǎn)

  • 面向連接
    • 必須建立連接和釋放連接
  • 每條TCP連接只能有兩個(gè)端點(diǎn),每條TCP連接只能是點(diǎn)對(duì)點(diǎn)
  • TCP提供可靠交付的服務(wù)
    • 無差錯(cuò)
    • 不丟失
    • 不重復(fù)
    • 按序到達(dá)
  • 全雙工通信
    • TCP允許通信雙方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)载萌,TCP連接的兩端都舍友發(fā)送緩存接收緩存
    • 發(fā)送時(shí)惧财,應(yīng)用程序在把數(shù)據(jù)傳送給TCP的緩存后,就可以做自己的事情扭仁,而TCP在合適的時(shí)候把數(shù)據(jù)發(fā)送出去垮衷。接收時(shí)同理。
  • 面向字節(jié)流
    • ”流“指的是流入到進(jìn)程或從進(jìn)程流出的字節(jié)序列乖坠。
    • 雖然應(yīng)用程序和TCP的交互式一次一個(gè)數(shù)據(jù)塊(大小不等)搀突,但TCP把應(yīng)用程序交下來數(shù)據(jù)看成僅僅是一連串的無結(jié)構(gòu)的字節(jié)流。TCP并不知道所傳送的字節(jié)流的含義熊泵。
    • TCP不保證接收方收到的數(shù)據(jù)塊和應(yīng)用方所發(fā)出的數(shù)據(jù)塊具有對(duì)應(yīng)大小的關(guān)系(例如發(fā)送方發(fā)給TCP10各數(shù)據(jù)塊仰迁,但接收方TCP可能只用了4個(gè)數(shù)據(jù)塊就把所有字節(jié)流交付給上層了)
    • 注意:TCP連接是一條虛連接而不會(huì)一條真正的物理連接。
    • TCP對(duì)應(yīng)用進(jìn)程一次把多長的報(bào)文發(fā)送到TCP的緩存中是不關(guān)心的顽分,TCP根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞程序決定報(bào)文段包含多少字節(jié)(UDP的報(bào)文長度直接由應(yīng)用進(jìn)程決定)徐许。如果TCP緩存的數(shù)據(jù)塊太長,TCP就可以把它劃分短一些再傳送卒蘸,如果進(jìn)程只發(fā)送一個(gè)字節(jié)绊寻,TCP也會(huì)等待積累有足夠字節(jié)后再構(gòu)成報(bào)文段發(fā)送出去。
TCP面向流的概念

TCP連接

TCP 把連接作為最基本的抽象悬秉。

每條TCP連接都有兩個(gè)端點(diǎn)澄步,這兩個(gè)端點(diǎn)叫做套接字socket。端口號(hào)拼接到IP地址即構(gòu)成了socket和泌。

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

理想傳輸條件的兩個(gè)特點(diǎn):

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

停止等待協(xié)議

”停止等待“就是每發(fā)送完一個(gè)分組就停止發(fā)送,等待對(duì)方的確認(rèn)武氓,在收到確認(rèn)后再發(fā)送下一個(gè)分組梯皿。

無差錯(cuò)情況
停止等待協(xié)議
出現(xiàn)差錯(cuò)

如果接收方接收到數(shù)據(jù)時(shí),檢測出了錯(cuò)誤县恕,就丟棄數(shù)據(jù)东羹,其他什么都不做,也可能是數(shù)據(jù)報(bào)在傳輸過程中丟失了忠烛。這兩種情況属提,接收方不發(fā)送任何信息。

可靠傳輸協(xié)議是這么設(shè)計(jì)的:發(fā)送方超過一段時(shí)間仍然沒有收到確認(rèn)消息,就認(rèn)為剛發(fā)送的分組丟失了冤议,因而重傳前面發(fā)送過的分組斟薇,這就是超時(shí)重傳

完成超時(shí)重傳恕酸,就要每發(fā)送完一個(gè)分組設(shè)置一個(gè)定時(shí)器堪滨。如果在超時(shí)計(jì)時(shí)器到期之前就收到了對(duì)方的確認(rèn),就撤銷已設(shè)置的超時(shí)計(jì)時(shí)器蕊温。

注意點(diǎn):

  • 發(fā)送方發(fā)送完一個(gè)分組后袱箱,必須暫時(shí)保留已發(fā)送的分組的副本(為發(fā)生超時(shí)重傳時(shí)使用),只有在收到相應(yīng)的確認(rèn)后才能清除暫時(shí)保留的分組副本
  • 分組和確認(rèn)分組都必須進(jìn)行編號(hào)义矛,這樣才能明確是哪一個(gè)發(fā)送出去的分組收到了確認(rèn)发笔,而哪一個(gè)沒收到。對(duì)于等待停止協(xié)議症革,只要用1位編號(hào)(0和1)即可筐咧,可重復(fù)使用,但這種編號(hào)不能保證可靠傳輸噪矛。
  • 超時(shí)計(jì)時(shí)器設(shè)置的重傳時(shí)間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r(shí)間更長一些量蕊。如果太長,通信效率就很低艇挨,太短残炮,就產(chǎn)生必須要的重傳,浪費(fèi)網(wǎng)絡(luò)資源缩滨。
確認(rèn)丟失和確認(rèn)遲到

確認(rèn)丟失時(shí)势就,發(fā)送方重傳數(shù)據(jù),接收方丟失這個(gè)重復(fù)的分組,并且要再次向發(fā)送方發(fā)送確認(rèn)

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

上訴的這種可靠傳輸協(xié)議稱為自動(dòng)重傳請(qǐng)求ARQ

信道利用率

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

流線線協(xié)議

  • 允許發(fā)送方在收到ACK之前連續(xù)發(fā)送多個(gè)分組
    • 更大的序列號(hào)范圍
    • 發(fā)送方和接收方需要更大的存儲(chǔ)空間以及緩存分組

連續(xù)ARQ協(xié)議窟感、滑動(dòng)窗口協(xié)議

為提高傳輸效率稠歉,可采用流水線傳輸,采用連續(xù)ARQ協(xié)議滑動(dòng)窗口協(xié)議,滑動(dòng)窗口協(xié)議較復(fù)雜,是TCP協(xié)議的精髓皇忿,后面介紹。

連續(xù)ARQ協(xié)議坦仍,發(fā)送方維持發(fā)送窗口鳍烁,意義是:位于發(fā)送窗口內(nèi)的5個(gè)分組都可以連續(xù)發(fā)送出去,而不需要等待對(duì)方的確認(rèn)繁扎。這樣幔荒,信道利用率就提高了。發(fā)送方每收到一個(gè)確認(rèn),就把發(fā)送方窗口向前滑動(dòng)一個(gè)分組的位置铺峭。

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

接收方一般采用累積確認(rèn)的方式墓怀,接收方不必對(duì)收到的分組逐個(gè)發(fā)送確認(rèn)汽纠,而可以在收到幾個(gè)分組后卫键,對(duì)按序到達(dá)的最后一個(gè)分組發(fā)送確認(rèn),表示到這個(gè)分組為止的所有分組都已正確收到了虱朵。

累計(jì)確認(rèn)優(yōu)點(diǎn)容易實(shí)現(xiàn)莉炉,缺點(diǎn)不能向發(fā)送方反映出接收方已經(jīng)確認(rèn)收到的所有分組的信息。比如碴犬,發(fā)送方發(fā)送了5個(gè)分組絮宁,但中間的第三個(gè)丟失了,這時(shí)接收方只能對(duì)前兩個(gè)分組發(fā)出確認(rèn)服协,發(fā)送方無法知道后面三個(gè)分組的下落绍昂,只好把后面的三個(gè)分組都重發(fā),浪費(fèi)網(wǎng)絡(luò)資源偿荷。

滑動(dòng)窗口協(xié)議

  • 窗口
    • 允許使用的序列號(hào)范圍
    • 窗口尺寸為N窘游,最多有N個(gè)等待確認(rèn)的消息
  • 滑動(dòng)窗口
    • 隨著協(xié)議的運(yùn)行,窗口在序列號(hào)空間內(nèi)向前滑動(dòng)
  • 滑動(dòng)窗口協(xié)議:GBN跳纳,SR

Selctive Repeat 協(xié)議

  • 接收方對(duì)每個(gè)分組單獨(dú)進(jìn)行確認(rèn)
    • 設(shè)置緩存機(jī)制忍饰,緩存亂序到達(dá)的分組
  • 發(fā)送方只重傳那些沒收到ACK的分組
    • 為每個(gè)分組設(shè)置定時(shí)器
  • 發(fā)送方窗口
    • N個(gè)連續(xù)的序列號(hào)
    • 限制已發(fā)送未確認(rèn)的分組

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

TCP首部的20個(gè)字節(jié)是固定的,后面4N字節(jié)是根據(jù)需要而增加的寺庄。

TCP首部結(jié)構(gòu)

各個(gè)字段:

  • 源端口和目的端口
  • 序號(hào)(seq)
    • 范圍0-2的32次方-1艾蓝,序列號(hào)增加到最大,下一個(gè)序號(hào)就返回0斗塘。
    • TCP是面向字節(jié)流的赢织,在TCP連接中傳送的字節(jié)流中的每一個(gè)字節(jié)都按順序編號(hào),整個(gè)要傳送的字節(jié)流的起始序列號(hào)必須在連接建立時(shí)設(shè)置馍盟。首部中的序號(hào)字段值指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)于置。
    • 例如,一報(bào)文段的序號(hào)字段值是 301朽合,攜帶的數(shù)據(jù)共有100字節(jié)俱两。這表明:這個(gè)報(bào)文段的第一個(gè)字節(jié)的序號(hào)是301,最后一個(gè)字節(jié)的序號(hào)是400曹步,顯然宪彩,下一段報(bào)文段的序號(hào)應(yīng)當(dāng)從401開始。
  • 確認(rèn)號(hào)(ack)
    • 占4個(gè)字節(jié)讲婚,期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)
    • 例如尿孔,接收方收到一個(gè)報(bào)文段,其序號(hào)字段值是501,而數(shù)據(jù)長度是200字節(jié)活合,這表明接收方收到了900為止的數(shù)據(jù)雏婶,所以接收方期望收到的下一個(gè)數(shù)據(jù)序號(hào)是701,接收方發(fā)送給發(fā)送方的確認(rèn)報(bào)文段中把確認(rèn)號(hào)置為701白指。
    • 記琢敉怼:若確認(rèn)號(hào) = N,表明到序號(hào)N-1為止的所有數(shù)據(jù)都已正確收到告嘲。
  • 數(shù)據(jù)偏移
    • TCP首部長度
  • 保留
  • 緊急URG
  • 確認(rèn)ACK
    • 僅當(dāng)ACK = 1時(shí)错维,確認(rèn)號(hào)字段才有效,當(dāng)ACK = 0橄唬,確認(rèn)號(hào)無效
    • TCP規(guī)定赋焕,連接建立后所有傳送的報(bào)文段都必須把ACK置1
  • 推送PSH
    • 盡快交付,不等到整個(gè)緩存填滿再發(fā)送
  • 復(fù)位RST
    • RST = 1仰楚,TCP連接出現(xiàn)嚴(yán)重錯(cuò)誤隆判,必須釋放連接,在重新建立運(yùn)輸連接僧界。
  • 同步SYN
    • 在連接建立時(shí)用來同步序號(hào)侨嘀,當(dāng)SYN = 1 而ACK = 0時(shí),表明這是一個(gè)請(qǐng)求報(bào)文段捎泻。
    • 對(duì)方若同意建立飒炎,則SYN = 1,ACk = 1笆豁,發(fā)送響應(yīng)報(bào)文段
    • SYN = 1就表示連接請(qǐng)求或連接接受報(bào)文
  • 終止FIN
    • FIN = 1郎汪,釋放一個(gè)連接
  • 窗口
    • 指的是發(fā)送報(bào)文段的一方的接收窗口,窗口值:允許對(duì)方發(fā)送的數(shù)據(jù)量闯狱。
    • 因?yàn)榻邮辗接芯彺婵臻g的限制煞赢。
    • 窗口值作為接收方讓發(fā)送方設(shè)置其發(fā)送窗口的依據(jù)
  • 校驗(yàn)和
    • 檢驗(yàn)首部和數(shù)據(jù)
  • 緊急指針
  • 選項(xiàng)
    • TCP最初只規(guī)定了一種選項(xiàng),最大報(bào)文段長度 MSS哄孤,MSS是每個(gè)TCP報(bào)文段中的數(shù)據(jù)字段的最大長度

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

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

舉例:A收到B發(fā)來的確認(rèn)報(bào)文段照筑,其中窗口是20字節(jié),確認(rèn)號(hào)是21(表明B期望的下一個(gè)序號(hào)是31瘦陈,30之前的數(shù)據(jù)已經(jīng)收到了)凝危,下圖就是A構(gòu)造的自己的發(fā)送窗口

發(fā)送窗口:在沒有收到B的確認(rèn)的情況下,A可以連續(xù)把窗口內(nèi)的數(shù)據(jù)都發(fā)送出去晨逝,凡是發(fā)送過的數(shù)據(jù)蛾默,在未收到確認(rèn)之前都必須暫時(shí)保留,以便超時(shí)重傳時(shí)使用捉貌。

發(fā)送窗口的位置由窗口前沿和后沿的位置共同確定支鸡。前沿可能向后收縮冬念,發(fā)生在對(duì)方通知的窗口縮小。

緩存空間和序號(hào)空間都是有限的牧挣,并且都是循環(huán)使用的急前。

發(fā)送緩存用來暫時(shí)存放:

  • 發(fā)送應(yīng)用程序傳送給發(fā)送方TCp準(zhǔn)備發(fā)送的數(shù)據(jù)
  • TCP已發(fā)送出但尚未收到確認(rèn)的數(shù)據(jù)

接收方緩存:

  • 按序到達(dá)的,但尚未被應(yīng)用程序讀取的數(shù)據(jù)
  • 未按序到達(dá)的數(shù)據(jù)

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

TCP采用一種自適應(yīng)的算法瀑构,它記錄一個(gè)報(bào)文段發(fā)出的時(shí)間裆针,以及收到相應(yīng)的確認(rèn)的時(shí)間,這兩個(gè)時(shí)間之差就是報(bào)文段的往返時(shí)間RTT检碗。

選擇確認(rèn)SACK

若收到的報(bào)文段無差錯(cuò)据块,只是未按序號(hào)码邻,中間缺少一些序號(hào)的數(shù)據(jù)折剃,那么能否只重傳未正確達(dá)到的數(shù)據(jù),選擇確認(rèn)就是一種處理方法像屋。

如果要使用選擇確認(rèn)怕犁,在建立連接時(shí),在TCP首部增加”允許SACK“的選項(xiàng)己莺。

TCP的流量控制

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

流量控制就是讓發(fā)送方的發(fā)送速率不要太快奏甫,要讓接收方來得及接收。

利用滑動(dòng)窗口機(jī)制可以很方便地在TCP連接上實(shí)現(xiàn)對(duì)發(fā)送方的流量控制凌受。在建立連接時(shí)阵子,接收方要告訴發(fā)送方自己的接收窗口,發(fā)送方的發(fā)送窗口不能超過接收方給出的接收窗口的數(shù)值胜蛉。

持續(xù)計(jì)時(shí)器(防止非零窗口的通知丟失):只要TCP連接的一方收到對(duì)方的零窗口通知挠进,就啟動(dòng)持續(xù)計(jì)時(shí)器,若持續(xù)計(jì)時(shí)器設(shè)置的時(shí)間到期誊册,就發(fā)送一個(gè)零窗口探測報(bào)文段(僅1字節(jié))领突,而對(duì)方就在確認(rèn)這個(gè)探測報(bào)文段時(shí)給出了現(xiàn)在的窗口值,如果窗口仍然為0案怯,那就重置這個(gè)持續(xù)計(jì)時(shí)器君旦,如果窗口不是0,那么死鎖的僵局就打破了嘲碱。

考慮傳輸效率

TCP報(bào)文段發(fā)送時(shí)機(jī)的三種機(jī)制:

  • TCP維持一個(gè)變量金砍,表示當(dāng)前放入緩存是數(shù)據(jù),它等于最大報(bào)文段長度MSS時(shí)麦锯,就組裝成一個(gè)TCP報(bào)文段發(fā)出去
  • 由發(fā)送方應(yīng)用進(jìn)程明確要求發(fā)送報(bào)文段恕稠,即TCP支持的推送操作。
  • 發(fā)送方的一個(gè)計(jì)時(shí)器期限到了离咐,就把當(dāng)前已有的緩存數(shù)據(jù)裝入報(bào)文段發(fā)出谱俭。

TCP擁塞控制

擁塞控制的一般原理

若網(wǎng)絡(luò)中的許多資源同時(shí)呈現(xiàn)供應(yīng)不足奉件,網(wǎng)絡(luò)的性能就要明顯變壞,整個(gè)網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降昆著,這種情況叫做擁塞县貌。

吞吐量:網(wǎng)絡(luò)中的數(shù)據(jù)是由一個(gè)個(gè)數(shù)據(jù)包組成,防火墻對(duì)每個(gè)數(shù)據(jù)包的處理要耗費(fèi)資源凑懂。吞吐量是指在沒有幀丟失的情況下煤痕,設(shè)備能夠接受的最大速率。其測試方法是:在測試中以一定速率發(fā)送一定數(shù)量的幀接谨,并計(jì)算待測設(shè)備傳輸?shù)膸诘铮绻l(fā)送的幀與接收的幀數(shù)量相等,那么就將發(fā)送速率提高并重新測試脓豪;如果接收幀少于發(fā)送幀則降低發(fā)送速率重新測試巷帝,直至得出最終結(jié)果。吞吐量測試結(jié)果以比特/秒或字節(jié)/秒表示扫夜。

擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中楞泼,這樣就可以使網(wǎng)絡(luò)中的路由器或鏈路不止過載。流量控制往往指點(diǎn)對(duì)點(diǎn)通信量的控制笤闯,是個(gè)端到端的問題堕阔,流量控制就是要做抑制發(fā)送方數(shù)據(jù)的速率,以便接收到來得及接收颗味。

造成擁塞的原因很復(fù)雜:

  • 結(jié)點(diǎn)路由器緩存的存儲(chǔ)空間太小
  • 處理機(jī)處理的速率太慢
  • ...
網(wǎng)絡(luò)吞吐量與負(fù)載的關(guān)系

擁塞控制是一個(gè)動(dòng)態(tài)的問題超陆,分為開環(huán)控制閉環(huán)控制兩種方法。開環(huán)控制方法就是在設(shè)置網(wǎng)絡(luò)事先將有關(guān)擁塞的因素考慮周到浦马,力求網(wǎng)絡(luò)在工作時(shí)不產(chǎn)生擁塞时呀。

閉環(huán)控制的措施:

  • 檢測網(wǎng)絡(luò)系統(tǒng)以便檢測到擁塞在何時(shí)何處發(fā)生
  • 把擁塞發(fā)生的信息傳送到可采取行動(dòng)的地方
  • 調(diào)整網(wǎng)絡(luò)系統(tǒng)的運(yùn)行以解決出現(xiàn)的問題

幾種擁塞控制方法

四種算法:

  • 慢開始
  • 擁塞避免
  • 快重傳
  • 快恢復(fù)
慢開始和擁塞避免

發(fā)送方維持一個(gè)擁塞窗口的狀態(tài)變量,擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程序捐韩,并動(dòng)態(tài)變化退唠,發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口。只要網(wǎng)絡(luò)沒出現(xiàn)擁塞荤胁,擁塞窗口就再增大一些瞧预。

慢開始算法:由小到大逐漸增大發(fā)送窗口,通常在剛剛開始發(fā)送時(shí)仅政,先把擁塞窗口cwnd設(shè)置為一個(gè)最大報(bào)文段MSS垢油,每收到一個(gè)確認(rèn)后,擁塞窗口增加至多一個(gè)MSS圆丹,每經(jīng)過一個(gè)傳輸輪次滩愁,擁塞窗口cwnd就加倍。發(fā)生擁塞(計(jì)時(shí)器超時(shí)還未收到確認(rèn))就將擁塞窗口值減到1辫封,再開始慢開始算法硝枉。

擁塞避免算法:慢開始之后廉丽,進(jìn)入擁塞避免階段,擁塞窗口每次增加1妻味,按線性規(guī)律慢慢增長正压。

快重傳和快恢復(fù)

快重傳:要求接收方每收到一個(gè)失序的報(bào)文段 就立即發(fā)出重復(fù)確認(rèn),盡早重傳未確認(rèn)的報(bào)文段

TCP的連接管理

TCP連接過程解決的問題:

  • 要是每一方能夠確知對(duì)方的存在
  • 要允許雙方協(xié)商一些參數(shù)(最大窗口值等)
  • 能夠?qū)\(yùn)輸實(shí)體資源進(jìn)行分配

TCP連接建立

三次握手建立TCP連接

流程:

  • B的TCP服務(wù)進(jìn)程先創(chuàng)建傳輸控制塊TCB责球,準(zhǔn)備接受客戶進(jìn)程的連接請(qǐng)求焦履,服務(wù)器進(jìn)程處于LISTEN狀態(tài),等待客戶的連接請(qǐng)求
  • A的TCP客戶進(jìn)程也首先創(chuàng)建傳輸控制模塊TCB雏逾,向B發(fā)出連接請(qǐng)求嘉裤。首部中的同步位 SYN = 1,同時(shí)選擇一個(gè)初始序號(hào) seq = x栖博。TCP規(guī)定屑宠,SYN = 1的報(bào)文段不能攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào)笛匙。TCP客戶端進(jìn)入 SYN-SENT(同步已發(fā)送)狀態(tài)侨把。
  • B收到連接請(qǐng)求報(bào)文段后,如同意建立連接妹孙,則向A發(fā)送確認(rèn),在確認(rèn)報(bào)文段中把 SYN 和 ACK(大寫)都置為1获枝,確認(rèn)號(hào)ack(小寫)= x + 1蠢正,同事也為自己選擇一個(gè)初始序號(hào)seq = y。注意省店,這個(gè)報(bào)文段也不攜帶數(shù)據(jù)嚣崭,同樣消耗一個(gè)序號(hào),這時(shí)TCP服務(wù)器進(jìn)程進(jìn)入 SYN-RCVD(同步收到)狀態(tài)懦傍。
  • TCP客戶端進(jìn)程收到B的確認(rèn)后雹舀,還要向B給出確認(rèn)。確認(rèn)報(bào)文段的ACK = 1粗俱,確認(rèn)號(hào)ack = y + 1说榆,自己的序號(hào)seq = x + 1。注意:ACK報(bào)文段可以攜帶數(shù)據(jù)寸认,但如果不攜帶數(shù)據(jù)則不消耗序號(hào)签财,這種情況下,下一個(gè)數(shù)據(jù)報(bào)文段的序號(hào)仍是seq = x + 1偏塞。這時(shí)TCP連接已建立唱蒸,A進(jìn)入ESTABLISHED狀態(tài)。

說明:A還要發(fā)送一次確認(rèn)灸叼,是為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送了B神汹,因而產(chǎn)生錯(cuò)誤庆捺。具體情況:A發(fā)出第一個(gè)連接請(qǐng)求,但延遲了屁魏,A就重發(fā)了一個(gè)請(qǐng)求疼燥,第一個(gè)請(qǐng)求延誤到連接釋放后的某個(gè)時(shí)間才到達(dá)B,這本來是一個(gè)失效的連接請(qǐng)求蚁堤,但B以為是一個(gè)新的請(qǐng)求醉者,就會(huì)給A一個(gè)確認(rèn),如果沒有第三次握手披诗,那么連接就建立了撬即,會(huì)造成資源浪費(fèi),有了第三次握手呈队,A并不會(huì)理財(cái)B的確認(rèn)剥槐,這樣連接就不會(huì)建立。

TCP連接釋放

四次握手TCP連接釋放

流程:

  • 數(shù)據(jù)傳輸結(jié)束后宪摧,通信的雙方都可釋放連接粒竖。
  • A和B都處于ESTABLISHED狀態(tài),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朽砰,它等于前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1,這時(shí)A進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)喉刘,等待B的確認(rèn)瞧柔。注意:TCP規(guī)定,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù)睦裳,也消耗一個(gè)序號(hào)造锅。
  • B收到連接釋放報(bào)文段后,即發(fā)出確認(rèn)廉邑,確認(rèn)號(hào)ack = u+1哥蔚,自己的序號(hào)seq = v,等于B前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1鬓催,B就進(jìn)入 CLOSE-WAIT(關(guān)閉等待)狀態(tài)肺素。TCP服務(wù)器進(jìn)程這時(shí)通知高層應(yīng)用進(jìn)程,從A到B這個(gè)方向的連接就釋放了宇驾。這時(shí)TCP處于半關(guān)閉狀態(tài)倍靡,即A已經(jīng)沒有數(shù)據(jù)要發(fā)送,但B發(fā)送數(shù)據(jù)课舍,A還能接收塌西。
  • A收到來自B的確認(rèn)后他挎,就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報(bào)文段捡需。
  • 若B已經(jīng)沒有要向A發(fā)送的數(shù)據(jù)办桨,就發(fā)出連接釋放報(bào)文段,F(xiàn)IN = 1站辉,B進(jìn)入(LAST-ACK)狀態(tài)呢撞,等待A確認(rèn)
  • A發(fā)送確認(rèn)報(bào)文段,ACK = 1饰剥,進(jìn)入TIME-WAIT狀態(tài)殊霞,這時(shí)TCP還沒有釋放掉,必須經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間后汰蓉,A才能進(jìn)入CLOSE狀態(tài)绷蹲。

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

TCP有限狀態(tài)機(jī)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顾孽,隨后出現(xiàn)的幾起案子祝钢,更是在濱河造成了極大的恐慌,老刑警劉巖若厚,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦英,死亡現(xiàn)場離奇詭異,居然都是意外死亡盹沈,警方通過查閱死者的電腦和手機(jī)龄章,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乞封,“玉大人,你說我怎么就攤上這事岗憋∷嗤恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵仔戈,是天一觀的道長关串。 經(jīng)常有香客問我,道長监徘,這世上最難降的妖魔是什么晋修? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凰盔,結(jié)果婚禮上墓卦,老公的妹妹穿的比我還像新娘。我一直安慰自己户敬,他們只是感情好落剪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布睁本。 她就那樣靜靜地躺著,像睡著了一般忠怖。 火紅的嫁衣襯著肌膚如雪呢堰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天凡泣,我揣著相機(jī)與錄音枉疼,去河邊找鬼。 笑死鞋拟,一個(gè)胖子當(dāng)著我的面吹牛骂维,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播严卖,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼席舍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哮笆?” 一聲冷哼從身側(cè)響起来颤,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠肘,沒想到半個(gè)月后福铅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡项阴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年滑黔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环揽。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡略荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歉胶,到底是詐尸還是另有隱情汛兜,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布通今,位于F島的核電站粥谬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辫塌。R本人自食惡果不足惜漏策,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臼氨。 院中可真熱鬧掺喻,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抑月,卻和暖如春树叽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谦絮。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工题诵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层皱。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓性锭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叫胖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子草冈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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