【計(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ù)均不保證:延遲外潜、帶寬
傳輸層的端口
在協(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的首部格式
UDP有兩個(gè)字段:數(shù)據(jù)字段和首部字段寓调。
首部字段有8字節(jié):
- 源端口
- 目的端口
- 長度
- 校驗(yàn)和:檢測UDP用戶數(shù)據(jù)包在傳輸中是否有錯(cuò),有錯(cuò)就丟棄
如果接收方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ò)誤)
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連接都有兩個(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à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)
上訴的這種可靠傳輸協(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è)分組的位置铺峭。
接收方一般采用累積確認(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ù)需要而增加的寺庄。
各個(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ī)處理的速率太慢
- ...
擁塞控制是一個(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連接建立
流程:
- 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連接釋放
流程:
- 數(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)绷蹲。