主頁 > 軟體設計 > 第五章:運輸層

第五章:運輸層

2021-10-03 07:44:44 軟體設計

5.1 運輸層協議概述

運輸層的主要功能:
1、 運輸層為應用行程之間提供端到端的邏輯通信(但網路層是為主機之間提供邏輯通信);
2、 運輸層還要對收到的報文進行差錯檢測;
3、 運輸層需要有兩種不同的運輸協議,即面向連接的 TCP 和無連接的UDP;

運輸層的兩個主要協議:
1、 用戶資料報協議 UDP:當運輸層采用無連接的 UDP 協議時,這種邏輯通信信道是一條不可靠信道;
2、 傳輸控制協議 TCP:當運輸層采用面向連接的 TCP 協議時,盡管下面的網路是不可靠的(只提供盡最大努力服務),但這種邏輯通信信道就相當于一條全雙工的可靠信道,

TCP 與 UDP
1、 TCP:TCP 傳送的資料單位協議是 TCP 報文段,TCP 則提供面向連接的服務,TCP 不提供廣播或多播服務,由于 TCP 要提供可靠的、面向連接的運輸服務,因此不可避免地增加了許多的開銷,這不僅使協議資料單元的首部增大很多,還要占用許多的處理機資源,
2、 UDP:UDP 傳送的資料單位協議是 UDP 報文或用戶資料報,UDP 在傳送資料之前不需要先建立連接,對方的運輸層在收到 UDP 報文后,不需要給出任何確認,雖然 UDP 不提供可靠交付,但在某些情況下 UDP是一種最有效的作業方式,

三類埠
1、 熟知埠:數值一般為 0~1023;
2、 登記埠號:數值為 1024~49151,為沒有熟知埠號的應用程式使用的,使用這個范圍的埠號必須在 IANA 登記,以防止重復;
3、 客戶埠號或短暫埠號:數值為 49152~65535,留給客戶行程選擇暫時使用,當服務器行程收到客戶行程的報文時,就知道了客戶行程所使用的動態埠號,通信結束后,這個埠號可供其他客戶行程以后使用,

5.2 用戶資料報協議 UDP

UDP 概述:UDP 只在 IP 的資料報服務之上增加了很少一點的功能,即埠的功能和差錯檢測的功能,

UDP 的主要特點:
1、 UDP 是無連接的,即發送資料之前不需要建立連接,
2、 UDP 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制,
3、 UDP 是面向報文的,UDP 沒有擁塞控制,很適合多媒體通信的要求,
4、 UDP 支持一對一、一對多、多對一和多對多的互動通信,
5、 UDP 的首部開銷小,只有 8 個位元組,

面向報文的 UDP 作業流程:
1、 發送方 UDP 對應用程式交下來的報文,在添加首部后就向下交付 IP層,UDP 對應用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界;
2、 應用層交給 UDP 多長的報文,UDP 就照樣發送,即一次發送一個報文;
3、 接收方 UDP 對 IP 層交上來的 UDP 用戶資料報,在去除首部后就原封不動地交付上層的應用行程,一次交付一個完整的報文;
4、 應用程式必須選擇合適大小的報文,

5.3 傳輸控制協議 TCP

TCP 的概述
1、 TCP 是面向連接的運輸層協議;
2、 每一條 TCP 連接只能有兩個端點(endpoint),每一條 TCP 連接只能是點對點的(一對一);
3、 TCP 提供可靠交付的服務;
4、 TCP 提供全雙工通信;
5、 面向位元組流,
在這里插入圖片描述
TCP 協議的注意點:
1、 TCP 連接是一條虛連接而不是一條真正的物理連接,
2、 TCP 對應用行程一次把多長的報文發送到 TCP 的快取中是不關心的,
3、 TCP 根據對方給出的視窗值和當前網路擁塞的程度來決定一個報文段應包含多少個位元組(UDP 發送的報文長度是應用行程給出的),
4、 TCP 可把太長的資料塊劃分短一些再傳送,TCP 也可等待積累有足夠多的位元組后再構成報文段發送出去,

TCP 的連接
1、 每一條 TCP 連接有兩個端點;
2、 TCP 連接的端點不是主機,不是主機的 IP 地址,不是應用行程,也不是運輸層的協議埠,TCP 連接的端點叫做套接字(socket)或插口;
3、 埠號拼接到(contatenatedwith)IP 地址即構成了套接字,
在這里插入圖片描述

5.4 可靠傳輸的作業原理

連續 ARQ 協議采用累計確認的方式:即不必對收到的分組逐個發送確認,而是對按序到達的最后一個分組發送確認,這樣就表示:到這個分組為止的所有分組都已正確收到了,

TCP 可靠通信的具體實作
1、 TCP 連接的每一端都必須設有兩個視窗——一個發送視窗和一個接收視窗;
2、 TCP 兩端的四個視窗經常處于動態變化之中,

5.5TCP 報文段的首部格式

TCP 報文段首部格式
在這里插入圖片描述
TCP 報文段首部一些重要的欄位
1、 確認 ACK——只有當 ACK=1 時確認號欄位才有效,當 ACK=0 時,確認號無效,
2、 推送 PSH(PuSH)——接收 TCP 收到 PSH=1 的報文段,就盡快地交付接收應用行程,而不再等到整個快取都填滿了后再向上交付,
3、 同步 SYN——同步 SYN=1 表示這是一個連接請求或連接接受報文,
4、 視窗欄位——占 2 位元組,用來讓對方設定發送視窗的依據,單位為位元組,
5、 選項欄位——長度可變,TCP 最初只規定了一種選項,即最大報文段長度 MSS,MSS 告訴對方 TCP:“我的快取所能接收的報文段的資料欄位的最大長度是 MSS 個位元組,”
6、 終止 FIN(FINis)——用來釋放一個連接,FIN=1 表明此報文段的發送端的資料已發送完畢,并要求釋放運輸連接,

5.7TCP 的流量控制

流量控制:流量控制(flowcontrol)就是讓發送方的發送速率不要太快,既要讓接收方來得及接收,也不要使網路發生擁塞,利用滑動視窗機制可以很方便地在 TCP 連接上實作流量控制,

持續計時器
1、 TCP 為每一個連接設有一個持續計時器,
2、 只要 TCP 連接的一方收到對方的零視窗通知,就啟動持續計時器,
3、 若持續計時器設定的時間到期,就發送一個零視窗探測報文段(僅攜帶1 位元組的資料),而對方就在確認這個探測報文段時給出了現在的視窗值,
4、 若視窗仍然是零,則收到這個報文段的一方就重新設定持續計時器,
5、 若視窗不是零,則死鎖的僵局就可以打破了,

在這里插入圖片描述

5.8TCP 的擁塞控制

擁塞控制與流量控制
1、 擁塞控制:擁塞控制所要做的都有一個前提,就是網路能夠承受現有的網路負荷,擁塞控制是一個全域性的程序,涉及到所有的主機、所有的路由器,以及與降低網路傳輸性能有關的所有因素,
2、 流量控制:擁塞控制是一個全域性的程序,涉及到所有的主機、所有的路由器,以及與降低網路傳輸性能有關的所有因素,流量控制所要做的就是抑制發送端發送資料的速率,以便使接收端來得及接收,

擁塞視窗:發送方維持一個叫做擁塞視窗 cwnd(congestionwindow)的狀態變數,擁塞視窗的大小取決于網路的擁塞程度,并且動態地在變化,發送方讓自己的發送視窗等于擁塞視窗,如再考慮到接收方的接收能力,則發送視窗還可能小于擁塞視窗,發送方控制擁塞視窗的原則是:只要網路沒有出現擁塞,擁塞視窗就再增大一些,以便把更多的分組發送出去,但只要網路出現擁塞,擁塞視窗就減小一些,以減少注入到網路中的分組數,

慢開始演算法的原理:
1、 在主機剛剛開始發送報文段時可先設定擁塞視窗 cwnd=1,即設定為一個最大報文段 MSS 的數值,
2、 在每收到一個對新的報文段的確認后,將擁塞視窗加 1,即增加一個MSS 的數值,
3、 用這樣的方法逐步增大發送端的擁塞視窗 cwnd,可以使分組注入到網路的速率更加合理,

設定慢開始門限狀態變數 ssthresh
1、 當 cwnd<ssthresh 時,使用慢開始演算法,
2、 當 cwnd>ssthresh 時,停止使用慢開始演算法而改用擁塞避免演算法,
3、 當 cwnd=ssthresh 時,既可使用慢開始演算法,也可使用擁塞避免演算法,

當網路出現擁塞時,無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網路出現擁塞(其根據就是沒有按時收到確認),就要把慢開始門限 ssthresh設定為出現擁塞時的發送方視窗值的一半(但不能小于 2),然后把擁塞視窗cwnd 重新設定為 1,執行慢開始演算法,
在這里插入圖片描述
1、 當 TCP 連接進行初始化時,將擁塞視窗置為 1,圖中的視窗單位不使用位元組而使用報文段,慢開始門限的初始值設定為 16 個報文段,即ssthresh=16,
2、 發送端的發送視窗不能超過擁塞視窗 cwnd 和接收端視窗 rwnd 中的最小值,我們假定接收端視窗足夠大,因此現在發送視窗的數值等于擁塞視窗的數值
3、 在執行慢開始演算法時,擁塞視窗 cwnd 的初始值為 1,發送第一個報文段 M0,
4、 發送端每收到一個確認,就把 cwnd 加 1,于是發送端可以接著發送M1 和 M2 兩個報文段,
5、 接收端共發回兩個確認,發送端每收到一個對新報文段的確認,就把發送端的 cwnd 加 1,現在cwnd 從 2 增大到 4,并可接著發送后面的 4個報文段,
6、 發送端每收到一個對新報文段的確認,就把發送端的擁塞視窗加 1,因此擁塞視窗 cwnd 隨著傳輸輪次按指數規律增長,
7、 當擁塞視窗 cwnd 增長到慢開始門限值 ssthresh 時(即當 cwnd=16時),就改為執行擁塞避免演算法,擁塞視窗按線性規律增長,
8、 假定擁塞視窗的數值增長到 24 時,網路出現超時,表明網路擁塞了,
9、 更新后的 ssthresh 值變為 12(即發送視窗數值 24 的一半),擁塞視窗再重新設定為 1,并執行慢開始演算法,
10、 當 cwnd=12 時改為執行擁塞避免演算法,擁塞視窗按按線性規律增長,每經過一個往返時延就增加一個 MSS 的大小,

乘法減小:“乘法減小“是指不論在慢開始階段還是擁塞避免階段,只要出現一次超時(即出現一次網路擁塞),就把慢開始門限值 ssthresh 設定為當前的擁塞視窗值乘以 0.5,

加法增大:“加法增大”是指執行擁塞避免演算法后,在收到對所有報文段的確認后(即經過一個往返時間),就把擁塞視窗 cwnd 增加一個 MSS 大小,使擁塞視窗緩慢增大,以防止網路過早出現擁塞,

快重傳:快重傳演算法首先要求接收方每收到一個失序的報文段后就立即發出重復確認,這樣做可以讓發送方及早知道有報文段沒有到達接收方,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,
在這里插入圖片描述
快恢復:當發送端收到連續三個重復的確認時,就執行“乘法減小”演算法,把慢開始門限 ssthresh 減半,但接下去不執行慢開始演算法,)由于發送方現在認為網路很可能沒有發生擁塞,因此現在不執行慢開始演算法,即擁塞視窗 cwnd現在不設定為 1,而是設定為慢開始門限 ssthresh 減半后的數值,然后開始執行擁塞避免演算法(“加法增大”),使擁塞視窗緩慢地線性增大,
在這里插入圖片描述
發送視窗的上限值:發送方的發送視窗的上限值應當取為接收方視窗 rwnd 和擁塞視窗 cwnd 這兩個變數中較小的一個,即應按以下公式確定:
在這里插入圖片描述
1、 當 rwnd<cwnd 時,是接收方的接收能力限制發送視窗的最大值,
2、 當 cwnd<rwnd 時,則是網路的擁塞限制發送視窗的最大值,

5.9TCP 的運輸連接管理

TCP 連接的建立:三次握手
1、 第一次握手
在這里插入圖片描述
2、 第二次握手
在這里插入圖片描述
3、 第三次握手
在這里插入圖片描述
TCP 連接的釋放:四次揮手
1、 第一次揮手
在這里插入圖片描述
2、 第二次揮手
在這里插入圖片描述
3、 第三次揮手
在這里插入圖片描述
4、 第四次揮手
在這里插入圖片描述
TCP 連接必須經過時間 2MSL 的連接釋放后才真正釋放掉
在這里插入圖片描述
1、 第一,為了保證 A 發送的最后一個 ACK 報文段能夠到達 B,
2、 第二,防止“已失效的連接請求報文段”出現在本連接中,A 在發送完最后一個 ACK 報文段后,再經過時間 2MSL,就可以使本連接持續的時間內所產生的所有報文段,都從網路中消失,這樣就可以使下一個新的連接中不會出現這種舊的連接請求報文段,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304890.html

標籤:其他

上一篇:限流量控制:高并發系統中我們如何操縱流量?

下一篇:網路TCP/IP基礎(資料傳輸)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more