運輸層向它上面的應用層提供通信服務. 兩個主機進行通信就是兩個主機中的應用進程互相通信. 從運輸層的角度看, 通信的真正端點并不是主機而是主機的進程. 運輸層提供應用進程間的邏輯通信. 運輸層之間的通信好像是沿水平方向傳輸數據.但事實上這兩個運輸層之間并沒有一條水平方向的物理連接.要傳送的數據是沿著圖中的虛線向(經過多個層次)傳送的 .
5.1 運輸層協議概述
5.1.1 進程之間的通信
- 網絡層是為了主機之間提供邏輯通信,而運輸層為應用進程之間提供端到端的邏輯通信.
- 運輸層向高層用戶屏蔽了下面網絡核心的細節,它使應用進程看見的就是好像在兩個運輸層實體之間有一條端到端的邏輯通信信道.
- 當運輸層采用面向連接的TCP協議時,盡管下面的網絡是不可靠的,但這種邏輯通信信道就相當于一條全雙工的可信信道.
- 采用UDP協議時,這種邏輯通信信道仍然是一條不可靠信道.
5.1.2 運輸層的兩個主要協議.
- UDP(User Datagram Protocol)[RFC 768]
- TCP(Transmission Control Protocol)[RFC793] UDP在傳送數據之間不需要先建立連接. TCP 提供面向連接的服務.
5.1.3 運輸層的端口.
通過端口解決通信的目的地.雖然通信的終點是應用進程,但我們只要把要傳送的報文交到目的主機的某一個合適的目的端口,剩下的工作(即最后交付給目的進程)就由TCP來完成. 在協議棧層間的抽象的協議端口是軟件端口,軟件端口是應用層的各種協議進程與運輸試題進行層間交換的一種地址 . 端口號只具有本地意義.
5.2 UDP
5.2.1 UDP概述
- 無連接
- 盡最大努力交付.
- 面向報文.
- 沒有擁塞控制.
- 支持1對1,1對n,n-1和n-n交互通信.
- 首部開銷小. 只有8個字節.
5.2.2 UDP的首部格式
- 源端口
- 目的端口
- 長度
- 校驗和
5.3 TCP
5.3.1 TCP最主要的特點 TCP 是TCP/IP體系中非常復雜的一個協議.
- 面向連接的運輸層協議.也就是說,應用程序在使用TCP協議之前,必須先建立TCP連接.在傳送數據完畢后,必須釋放已經建立的TCP連接.
- 每一條TCP連接只能有兩個端點(endpoint),每一條TCP連接只能是點對點.
- TCP提供可靠交付的服務.
- TCP提供全雙工通信. TCP允許通信雙方的應用進程在任何時候都能發送數據.TCP連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的數據.在發送時,應用程序在把數據傳送給TCP的緩存后,就可以做自己的事,而TCP在合適的時候吧數據發送出去.在接受時,TCP把收到的數據放在緩存,上層的應用進程在合適的時候讀取緩存中的數據.
- 面向字節流. TCP中的流(stream指的是流入到進程或從進程流出的字節序列. 雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序叫下來的數據看成僅僅是一連串的 無結構的字節流. TCP并不知道所傳送的字節流的含義.TCP不保證接收方應用程序鎖收到的數據塊和發送方應用程序所發出的數據塊具有對應大小的關系(例如,發送方應用程序交給發送方的TCP供10個數據塊,但接收方的TCP可能只用了4個數據塊就把收到的字節流交付給了上層的應用程序).但接收方應用程序收到的字節流必須和發送方應用程序發送的字節流完全一樣.當然接收方的應用程序必須有能力識別收到的字節流,把它還原成有意義的應用層數據.
5.3.2 TCP的連接
TCP把連接作為最基本的抽象. 每一條TCP連接有兩個端點. TCP 連接的端點叫做套接字(socket)或者插口. 根據RFC793的定義:端口號拼接到(conatenated with)IP地址即構成了套接字.
5.4 可靠傳輸的工作原理
理想的傳輸條件有以下兩個特點:
- 傳輸信道不產生差錯.
- 不管發送方以多快的速度發送數據,接收方總是來得及處理收到的數據. 在以上理想傳輸條件下,不需要采取任何措施就能夠實現可靠傳輸
5.4.1 停止等待協議
- 無差錯情況.
- 出現差錯情況.
- 確認丟失和確認遲到
- 信道利用率
5.4.1 連續ARQ協議
滑動窗口協議比較復雜,是TCP協議的精髓所在.
5.5 TCP報文段的首部格式.
TCP雖然是面向字節流的,但TCP傳送的數據單元確實報文段.一個TCP報文段分為首部和數據兩個部分.
首部不頂部分個字段的意義
- 源端口和目的端口
- 序號
- 確認號
- 數據便宜
- 保留
- 緊急URG
- 確認ACK
- 推送PSH
- 復位RST
- 同步SYN
- 終止FIN
- 窗口
- 校驗和
- 緊急指針
- 選項
5.6 TCP可靠傳輸的實現
5.6.1 以字節為單位的滑動窗口
5.6.2 超時重傳時間的選擇
TCP采用自適應算法,記錄一個報文段發出的時間,以及受到相應的確認的時間.這兩個時間之差就是報文段的往返時間RTT.TCP保留了RTT的一個加權平均往返時間RTTs.
5.6.3選擇確認SACK
5.7TCP的流量控制
5.7.1 利用滑動窗口實現流量控制.
流量控制(flow control)就是讓發送方的發送速率不要太快,要讓接收方來得及接受. 發送方的發送窗口不能超過接收方給出的接受窗口的數值.
5.9TCP的運輸連接管理
連接建立,數據傳送 連接釋放. TCP連接建立過程中要解決以下三個問題:
- 要使每一方能夠確知對方的存在.
- 要允許雙方協商一些參數(如最大窗口值,是否使用窗口擴大選項和時間戳選項及服務質量等)
- 能夠對運輸實體資源(如緩存大小,連接表中的項目等)進行分配. TCP連接的建立采用客戶服務器方式.主動發起連接建立的應用進程叫做客戶(client).而被動等待連接建立的應用進程叫做服務器(server).
5.9.1 TCP連接的建立
為什么A還要發送一次確認呢,這主要是為了防止已失效的連接請求報文段突然又傳送到了B,而產生錯誤. A發出的第一個連接請求報文沒有丟失,滯留在網絡上,延誤到連接釋放以后的某個時間才到達B.本來這個是早已失效的報文段.但是B收到此失效的連接請求報文段后,就誤認為是A有發出一次新的連接請求.于是就向A發出確認報文段,同意建立連接.假定不采用三次握手,那么只要B發出確認,新的連接就建立了. 由于現在A并沒有發出建立連接的請求,因此不會理財B的確認.也不會向B發送數據.但是B卻以為新的運輸連接已經建立了,并一直等待A發送數據.B的許多資源就這樣白白浪費的.
5.9.2TCP的連接釋放
數據傳輸結束后,通信的雙方都可釋放連接.