本文主要分析運輸層的兩種協議TCP和UDP,重點在于TCP如何實現可靠傳輸,并且進行流量控制,以及TCP的三次握手和四次揮手的詳細過程。最後對TCP和TDP的兩種協議進行了比較。
主要内容:
- 運輸層的認識
- UDP的認識
- TCP認識
- UDP和TCP的區别
1、運輸層的認識
運輸層就是位于應用層和網絡層之間的,為運行在不同主機上的應用進程提供直接的通信服務是運輸層的任務。 物理層、數據鍊路層以及網絡層他們共同解決了将主機通過異構網絡互連起來所面臨的問題,實現了主機到主機的通信,而通信的真正實體是位于通信兩端主機中的進程。
因特網的運輸層為應用層提供了兩種不同的運輸協議,即面向連接的TCP和無連接的UDP UDP是無連接的,不可靠的運輸協議,TCP是面向連接的,可靠的運輸協議
運輸層在網絡通信中的作用:
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)1](/uploads3/large/tos-cn-i-qvj2lq49k0/7ab7e1519ce04334bc45274212bf1050.jpg)
運輸層在網絡通信中作用過程:
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)2](/uploads3/large/tos-cn-i-qvj2lq49k0/3e612bed1bc147e991e817f06431179a.jpg)
- 進程Ap1與Ap4之間進行基于網絡的通信,進程Ap2與Ap3之間進行基于網絡的通信
- 在運輸層使用不同的端口,來對應不同的應用進程
- 然後通過網絡層及其下層來傳輸應用層報文
- 接收方的運輸層通過不同的端口,将收到的應用層報文,交付給應用層中相應的應用進程
注:這裡所說的主機和主機之間的通信其實是主機進程之間的通信
C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
2、用戶數據報協議UDP
2.1 介紹
用戶數據報協議(User Datagram Protocol),是TCP/IP體系結構運輸層中的一個重要協議,這種邏輯通信信道是一條不可靠信道。 特點:
- 是無連接的協議,提供無連接服務
- UDP 傳送的數據單位協議是 UDP 報文或用戶數據報。
- 支持單播、多播、廣播
- 不提供可靠交付
- 不需要套接字(Socket)
2.2 運輸過程
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)3](/uploads3/large/tos-cn-i-qvj2lq49k0/83e4e31457c549e786c323060baef4a2.jpg)
說明:
- UDP報文是面向應用報文的,因此UDP對應用進程交下來的報文既不合并也不拆分,而是保留這些報文的邊界
- UDP報文以報文為單位進行發送和接收
3、傳輸控制協議TCP
3.1 介紹
TCP 是TCP/IP體系結構運輸層中的重要協議,當運輸層采用面向連接的 TCP 協議時,盡管下面的網絡是不可靠的(隻提供盡最大努力服務),但這種邏輯通信信道就相當于一條全雙工的可靠信道。 TCP 傳送的數據單位協議是 TCP 報文段(segment)
特點:
- 面向連接的協議,提供面向連接服務,TCP之間的通信必須要在兩個套接字(Socket)之間建立連接
- 其傳送的運輸協議數據單元TPDU是TCP報文
- 僅支持點對點單播,不支持多播和廣播
- 提供可靠服務
- TCP是面向字節流的,這正是TCP實現可靠傳輸、流量控制、以及擁塞控制的基礎
TCP傳輸過程
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)4](/uploads3/large/tos-cn-i-qvj2lq49k0/4fad6843274b4fbd8490f13f2d1f49f3.jpg)
說明: 發送方:
- TCP會把應用進程交付下來的數據塊看作是一連串無結構的字節流,TCP并不知道這些待傳送的字節流的含義
- TCP将相應的字節流進行編号,并存儲在自己發送緩存中
- TCP會根據發送策略,提取一定量的字節構建TCP報文并發送
接收方:
- 一方面從所接受到的TCP報文段中,取出數據載荷部分并存儲在接收緩存中;一方面将接收緩存中的一些字節交付給應用進程
- 接收方的應用進程必須有能力識别收到的字節流,把它還原成有意義的應用層數據
C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
3.2 超時重傳
3.2.1 介紹
在TCP傳輸中為了實現可靠傳輸和流量控制都需要涉及超時重傳,超時重傳中最為重要的是計算超時重傳的時間。 RTO是超時重傳時間,RTT是往返時間。
超時重傳時間不能遠大于往返時間,會浪費資源
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)5](/uploads3/large/tos-cn-i-qvj2lq49k0/9e14a84f9d094d6080da6215ec2508d2.jpg)
超時重傳時間不能小于往返時間,會造成不必要的重傳
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)6](/uploads3/large/tos-cn-i-qvj2lq49k0/df85d432087a454dacc8f6ddf67c8d07.jpg)
超時重傳時間應當略大于往返時間,為了避免誤差,應當選用一段時間内的加權的往返時間
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)7](/uploads3/large/tos-cn-i-qvj2lq49k0/4aa5f2837f2b4d3bbab78f6681675a27.jpg)
總結: 1、如果超時重傳時間RTO的值設置得比RTT的值小很多,這會引起報文段不必要的重傳,使網絡負荷增大 2、如果超時重傳時間RTO的值設置得遠大于RTT0的值,這會使重傳時間推遲的太長,使網絡的空閑時間增大,降低傳輸效率 3、因此需要将超時重傳時間設置的略大于一次往返時間。
3.2.3 超時重傳時間RTO的計算 超時重傳時間的要略大于一次往返時間,但一次往返時間是不固定的,因此超時重傳時間的計算是基于加權平均往返時間
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)8](/uploads3/large/tos-cn-i-qvj2lq49k0/0ab113569b1942e7975d3606f0cd0b24.jpg)
說明:
- 這是RFC6298建議使用下式計算超時重傳時間RTO
- 算法本身不再說明,隻要知道是根據加權平均往返時間計算的
3.2.4 往返時間RTT的測量 往返時間RTT的測量不能簡單的進行一次往返時間的計算,有如下問題需要處理
問題1:如果報文丢失或确認報文的遲到,都會導緻重傳報文。這樣兩次的報文發送使得無法準确計算一次往返時間。
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)9](/uploads3/large/tos-cn-i-qvj2lq49k0/c2573dcaad834f27a1b576594d4feda0.jpg)
- 超時重傳時,有兩個發送報文,一個确認報文,如果以第一個發送的報文來計算就會偏大
- 如果在超時重傳中,确認報文是第一個報文的确認報文,若當做重傳報文的确認來計算,就會偏小
解決1:Karn算法
- 在計算加權平均往返時間RTTs時,隻要報文段重傳了,就不采用其往返時間RTT樣本。
問題2: 對于問題1的解決會引入新問題
- 設想這樣的情景:報文段的時延突然增大了很多,并且之後很長一段時間都會保持這種時延。
- 因此在原來得出的重傳時間内,不會收到确認報文段,于是進行超時重傳
- 而通過Karn算法,不考慮重傳報文段的往返時間樣本。
- 這樣超時重傳的時間就無法更新了。這會導緻報文段反複被重傳
解決2:
- 因此要對Karn算法進行修正
- 方法是:報文段每重傳一次,就讓RTO增大一些
- 典型的做法是将新RTO的值取為舊RTO的2倍
總結- 超時重傳時間不能遠大于往返時間,會浪費資源
- 超時重傳時間不能小于往返時間,會造成不必要的重傳
- 超時重傳時間應當略大于往返時間,為了避免誤差,應當選用一段時間内的加權的往返時間
- 因為出現超時重傳時無法測準往返時間RTT的問題,因此需要判斷當報文段重傳後,就不能采用往返時間的樣本
3.3 流量控制
3.3.1 介紹 利用滑動窗口機制來實現流量控制,重點有兩個,一個是接收方通過對已接收的數據進行累計确認,并調整窗口大小,來對發送方進行流控,第二個就是啟動持續計時器來探知是否要發送零窗口探測報文,通過這兩個就可以讓接收方對發送方進行窗口大小的調控,以此做到了流量控制。
3.3.2 為什麼要提出流量控制 一般來說,我們總是希望數據傳輸的更快一些,但是如果發送方把數據發送的過快,接收方就可能來不及接收,這就會造成數據的丢失。所以就需要進行流量控制, 流量控制簡單說就是讓發送方的發送速率不要太快,要讓接收方來得及接收
3.3.3 流量控制 我們利用滑動窗口機制可以很方便的在TCP連接上實現對發送方的流量控制 重點在于接收方根據自己的存儲空間來決定自己的接收空間的大小,以此來限制發送方發送窗口的大小
過程:
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)10](/uploads3/large/tos-cn-i-qvj2lq49k0/40916217b236404d9964932b8f5bba1b.jpg)
說明:
- 接收方對發送方進行流控的時機就是自己接收窗口大小已經調整為0,或者超過一定時間還沒接收到數據時進行的
- 接收方返回的數據解析
- ACK=1,這表示這個報文是确認報文
- ack=201,表示累計确認的字節數的下一個
- 已經接收到了200,所以下一個就是201,所以累計确認報文中寫的ack就是201
- 表明讓發送方發送的報文字節數從201開始
- rwnd=300,表示窗口大小
- 這個也表示字節數
- TCP傳輸的數據是面向字節流的
- 丢失的數據并不會立即重傳,而是等到超時機制觸發後才重傳
- 在201-300号字節數據丢失後,得到接收方的累計确認,知道了自己的201-300的數據還需要重傳,但是并不會立即重傳,而是先重傳301-400号,401-500号字節數據
- 一直等到超時機制觸發後,才重傳舊的數據
- 也就是會先傳後面的數據,再傳丢失的數據(此時不會失序,因為接收是有窗口的)
- 接收窗口的調整是通過自己的存儲空間決定的,而發送窗口的大小是通過接收方發送的,每次進行流控都需要進行發送窗口的調控
3.3.4 打破死鎖
接收方給發送方發送的确認報文丢失後會形成A和B主機的相互等待,這樣就造成了死鎖,需要通過一個持續計時器,當計時器為0時發送零窗口探測報文詢問以此讓接收方再次發送确認報文。這樣就打破了死鎖
3.3.4.1 死鎖的形成
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)11](/uploads3/large/tos-cn-i-qvj2lq49k0/3d4c6a84df0342c1a24b78fd460455e3.jpg)
- 上述的流控當确認報文丢失後,會因A主機等待确認報文,B主機等待A主機的數據發送
- A主機和B主機形成互相等待現象,也就是死鎖
3.3.4.2 解鎖的解決
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)12](/uploads3/large/tos-cn-i-qvj2lq49k0/d5f3f8829dc84ddbb82f26af6eba123a.jpg)
說明:
- 持續計時器的啟動時機為接收到了接收方發來的窗口為0的确認報文
- 持續計時器超時後發送的是零窗口探測報文
- 對接收方進行詢問接收窗口是否為0,零窗口探測報文僅為一個字節數據
- 若接收方接接收到探測報文會進行确認,返回自己的窗口
- 如果返回的仍然是0窗口,那麼再次啟動計時器
- 如果零窗口探測報文丢失,會啟動零窗口報文段的計時器,如果零窗口報文段丢失後,會在這個計時器的超時機制下進行重傳
3.3.4.3 一些疑問 零窗口探測報文丢失後,是否仍然會死鎖?
- 不會,零窗口報文段發送後會啟動零窗口報文段的計時器,如果零窗口報文段丢失後,會在這個計時器的超時機制下進行重傳
零窗口探測報文發送到主機B時,主機B的接收窗口為0,還能接收零窗口探測報文嗎
- 是可以接收的
- TCP協議規定,即使接收窗口為0,也必須接收零窗口探測報文段、确認報文段、以及攜帶有緊急數據的報文段
3.3.5 總結- 一般來說我們總是希望數據傳輸的更快,但如果發送放把數據發送的過快,接收方就可能來不及接收,這樣會造成數據丢失,因此就需要流控
- 所謂流控,就是讓發送方的發送不要太快,要讓接收方來得及接收
- 利用滑動窗口機制可以很方便的在TCP連接上實現對發送方的流量控制 基本原理就是TCP接收方利用自己的接收窗口的大小來限制發送窗口的大小 TCP接收方根據自己的接收需要向發送方發送窗口大小。 如果TCP發送方收到接收方的零窗口通知後,應啟動持續計時器。 持續計時器超時後,向接收方發送零窗口探測報文。
3.4 可靠傳輸3.4.1 介紹
可靠傳輸是通過确認機制來實現的,接收方給發送方發送的确認報文帶有的字段決定了發送方是否要重傳,是否要滑動窗口的操作,以此做到了可靠傳輸
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)13](/uploads3/large/tos-cn-i-qvj2lq49k0/a6716cf473e941f9b2748930f57e1136.jpg)
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)14](/uploads3/large/tos-cn-i-qvj2lq49k0/3e4dab94bcf54ad7bb39b875e87db881.jpg)
說明:
- TCP基于以字節為單位的滑動窗口來實現可靠傳輸 發送方在未收到接收方的确認時,可将發送窗口内還未發送的數據全部發送出去。 接收方隻接收序号落入發送窗口内的數據
- 雖然發送方的發送窗口是根據接收方的接收窗口設置的,但在同一時刻,發送方的發送窗口并不綜合接收方的接收窗口一樣大,因為有一定的時間滞後
- 對于不按序到達的數據應如何處理,TCP并無明确規定
- TCP要求接收方必須有累積确認和捎帶确認機制,這樣可以減小傳輸開銷,接收方可以在核實的時候發送确認,也可以在自己有數據要發送的時候把确認信息順便捎帶上
- TCP的通信是全雙工通信。
C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
3.5 運輸連接管理3.5.1 介紹
TCP是面向連接的協議,它基于運輸連接來傳送TCP報文段,TCP運輸連接的建立和釋放是每一次面向連接的通信中必不可少的部分。 TCP的運輸連接管理就是使運輸連接的建立和釋放都能正常的進行。 共有三個階段
- 建立TCP連接(三次握手)
- 數據傳輸
- 釋放TCP連接(四次揮手)
3.5.2 三次握手過程
- TCP 連接的建立采用客戶服務器方式。
- 主動發起連接建立的應用進程叫做TCP客戶 (client)。
- 被動等待連接建立的應用進程叫做TCP服務器 (server)。
- “握手”需要在TCP客戶端和服務器之間交換三個TCP報文段
過程示意圖:
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)15](/uploads3/large/tos-cn-i-qvj2lq49k0/f1e942875b4244c4ade5fd5c79b91611.jpg)
說明:
- 第一次握手是客戶端向服務器端發送TCP連接請求 SYN=1表示的報文段不能攜帶數據,但會消耗掉一個序号 seq=x表示序号位 此時進入同步已發送狀态
- 第二次握手是服務器端向客戶端發送針對TCP連接請求的确認 ACK表示确認報文段 seq=y表示序号位,作為服務器進程所選擇的初始序号 ack=x 1為确認序号字段,這是對客戶進程所選擇的初始序号的确認 SYN=1,不能傳輸數據 進入同步已接收狀态
- 第三次握手是客戶端向服務器端發送針對TCP連接請求的确認的确認 這是一個普通的TCP确認報文段 客戶端發送後進入連接已建立狀态,服務器端接收到後也進入連接已建立狀态 可以攜帶數據,SYN不等于1
為什麼必須要三次握手,不能兩次握手?
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)16](/uploads3/large/tos-cn-i-qvj2lq49k0/3de734d5592b46ab836b724113e68fba.jpg)
采用三報文握手主要是為了防止已失效的連接請求報文段突然又傳送到了TCK服務器端,導緻服務器端無效浪費資源。
一端(client)A發出去的第一個連接請求報文并沒有丢失,而是因為某些未知的原因在某個網絡節點上發生滞留,導緻延遲到連接釋放以後的某個時間才到達另一端(server)B。本來這是一個早已失效的報文段,但是B收到此失效的報文之後,會誤認為是A再次發出的一個新的連接請求,于是B端就向A又發出連接确認報文,表示同意建立連接。如果不采用“三次握手”,那麼隻要B端發出确認報文就會認為新的連接已經建立了,但是A端并沒有發出建立連接的請求,因此不會去向B端發送數據,B端沒有收到數據就會一直等待,這樣B端就會白白浪費掉很多資源。3.5.3 四次揮手過程3.5.3.1 四次揮手過程
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)17](/uploads3/large/tos-cn-i-qvj2lq49k0/1785bbe046634b25bcedff37754a2318.jpg)
TCP客戶進程的應用進程通知其主動關閉TCP連接,TCP客戶進程會發送TCP連接釋放報文段,并進入終止等待1狀态TCP服務器進程收到TCP連接釋放報文段後,會發送一個普通的TCP确認報文段并進入關閉等待狀态TCP服務器進程通知高層應用進程,TCP客戶進程要斷開與自己的TCP連接,此時,從TCP客戶進程到TCP服務器進程這個方向的連接就釋放了,這時的TCP連接屬于半關閉狀态,也就是TCP客戶進程已經沒有數據要發送了但如果TCP服務器進程還有數據要發送,TCP客戶進程仍要接收,也就是說從TCP服務器進程到TCP客戶進程這個方向的連接并未關閉TCP客戶進程收到TCP确認報文段後就進入終止等待2狀态,等待TCP服務器進程發出的TCP連接釋放報文段若使用TCP服務器進程的應用進程已經沒有數據要發送了,應用進程就通知其TCP服務器進程釋放連接TCP服務器進程發送TCP連接釋放報文段并進入最後确認狀态TCP客戶進程收到TCP連接釋放報文段後,必須針對該報文段發送普通的TCP确認報文段,之後進入時間等待狀态TCP服務器進程收到該報文段後就進入關閉狀态,而TCP客戶進程還要經過時間後才能進入關閉狀态
3.5.3.2 為什麼需要四次揮手?
- TCP客戶端和服務器端兩方都需要在數據傳送結束後發出連接釋放的通知,
- 連接是雙向的,TCP客戶端發出的釋放連接請求,服務器端在發出确認報文後,這種情況隻是TCP客戶端到TCP服務器端這個連接關閉掉了。TCP服務器端到客戶端的連接還沒有關閉掉
- 所以還需要服務器端發送釋放連接請求報文,客戶端發送确認報文後,這種方向的連接才關閉掉。
- 因此需要四次揮手才可以将兩方的連接關閉掉
3.5.3.3 TCP客戶進程在發送完最後一個确認報文後,為什麼不直接進入關閉狀态?而是要進入時間等待狀态?
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)18](/uploads3/large/tos-cn-i-qvj2lq49k0/a86ddbeec8244a76ab5eec8143c78737.jpg)
- 因為時間等待狀态以及處于該狀态2MSL時長,可以确保TCP服務器進程可以收到最後一個TCP确認報文段而進入關閉狀态
- 另外,TCP客戶進程在發送完最後一個TCP确認報文段後,在經過2MSL時長,就可以使本次連接持續時間内所産生的所有報文段都從網絡中消失,這樣就可以使下一個新的TCP連接中,不會出現舊連接中的報文段
- C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
3.5.4 一台主機如何知道另一台主機出現了故障
TCP雙方已經建立了連接,後來,TCP客戶進程所在的主機突然出現了故障,TCP服務器進程以後就不能再收到TCP客戶進程發來的數據,因此,應當有措施使TCP服務器進程不要再白白等待下去
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)19](/uploads3/large/tos-cn-i-qvj2lq49k0/640ab31fbc7842bfac511b95d1a99dca.jpg)
4、TCP與UDP的對比
![tcp和udp區别和聯系(TCP和UDP的認識和區别) tcp和udp區别和聯系(TCP和UDP的認識和區别)20](/uploads3/large/tos-cn-i-qvj2lq49k0/ae226d89493741498a5b02ab3780ebfa.jpg)
, 更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!