#### 第7章:
#### 傳輸層
#### 7.1 傳輸層的基本功能
傳輸層既是面向通信的最高層,又是用戶功能的最低層。在通信網絡的路由器中只用到了下三層的功能,只有在主機的協議棧中才有傳輸層。
傳輸層的基本功能是利用通信子網為兩臺主機的應用進程之間提供 `端---端` 的性能可靠,價格合理、透明傳輸的通信服務。
:-: 
傳輸層提供端-端通信服務
上圖表示傳輸層為應用進程(AP1~AP4)之間提供邏輯通信。(包括AP1、AP2之間以及AP1AP2和AP3AP4之間)。所謂“邏輯通信”指應用進程的報文交給傳輸層后,傳輸層似乎是沿著水平方向直接傳送到遠地的傳輸層,但事實上應用進程之間并沒有這一水平的物理連接,被傳送的數據實際上是沿著圖中細線方向經過傳輸層以下各層及通信網絡來傳送的。
AP1與AP3通信的同時AP2與AP4也在通信。說明傳輸層同時支持多個進程的連接,具有`復用`和`分用`的功能。
傳輸層還具有`流量控制`、`擁塞控制`、`差錯控制`,既要負責報文`無差錯`、`不丟失`、`不重復`,還要保證報文的`順序性`。
##### 傳輸層的協議
因特網有兩個傳輸協議:
`UDP無連接的用戶數據報協議(UDP用戶數據報)`,傳輸數據前不必建立連接,遠程計算機不需要給確認信息。
`TCP面向連接的傳輸控制協議(TCP報文段)`,傳送數據前必須先建立連接,傳送完釋放資源。由于提供可靠的、面向連接的傳輸服務,它比UDP要花費更多開銷,占用更多處理資源。
當采用面向連接的TCP協議時,盡管下面的網絡層是不可靠的(只提供盡最大努力的服務由網絡層提供),這條邏輯通信信道仍然相當于一條全雙工可靠的信道。
當采用無連接的UDP協議時,這條邏輯通信信道則是一條不可靠信道。
:-: 
TCP/IP體系中傳輸層協議與相鄰層協議之間的關系
##### 傳輸層的端口
傳輸層與網路層最大的區別是傳輸層提供了進程通信的能力(端-端通信)。計算機的進程是用進程標識符來標志的。不同的操作系統使用不同的格式的進程標識符,因此各種應用進程不應當采用由計算機操作系統所指派的進程標識符,必須使用統一的方法對TCP/IP的應用進程進行標識。
在TCP/IP體系中,解決上述問題的方法就是在傳輸層使用協議端口號(傳輸層的服務訪問點TSAP),簡稱為`端口`。應用層的各種進程都是通過相應的端口與傳輸實體進行交互的。傳輸層對每個端口都賦予一個16位(二進制)的端口號。這個端口號只具有本地意義。由于TCP和UDP是彼此獨立的兩個軟件模塊,它們的端口號允許相同。
:-: 
端口在進程通信中的作用
傳輸層的端口號可分為兩大類:
1. 服務器使用的端口號(熟知端口號),0-1023.
例如:
Echo 7;FTP 20;FTP 21;TELNET 23;SMTP 25;DNS 53;TFTP 69; HTTP 80; POP3 110; SNMP 161;SNMP 162;BGP 179; RIP 520·······
2. 客戶端使用的端口號(或稱為臨時端口號),其數值為49152~65535。此類端口供客戶進程運行時臨時選擇使用。當客戶進程需要傳輸服務時,可向本地操作系統動態申請,操作系統隨記返回一個本地唯一的端口號。一旦通信結束,收回此端口號供其他客戶進程使用。
#### 7.2 UDP
用戶數據報協議UDP只在網際協議IP的基礎上增加了復用/分用的功能和差錯檢測功能,為網絡用戶提供高效率的數據傳輸服務。
UDP有以下特點:
1. UDP是無連接的,沒有建立連接和釋放連接的過程。
2. UDP只能盡最大努力交付,提供不可靠的傳輸服務。對出現差錯的報文進行丟棄處理。
3. UDP是面向報文的,與應用層交付的是完整的報文,既不合并,也不拆分,保留原始的報文邊界。因此,應用層必須選擇合適的報文長度,以免在IP層進行分片工作,從而降低IP層的效率。
4. UDP沒有擁塞控制的功能。即使網絡擁塞也不會使源主機降低發送速率,寧愿丟失數據,也不允許傳送的數據存在較大的時延,適合實時應用(IP電話、視頻會議)。
5. UDP的首部簡短只有8B(字節),減少了通信開銷。
UDP報文由首部和數據字段兩個部分組成。
:-: 
UDP報文格式
首部字段由4個字段組成供8B(Byte字節):
1. 源端口16b(16比特位)。源主機的端口號
2. 目的端口16b(16比特位)。目的主機的端口號
3. 長度16b(16比特位)。指明包括首部在內的UDP報文的總長度。該字段的只是便于目的端的UDP從用戶數據報提供的信息中計算出數據長度。
4. 校驗和16b(16個比特位)。用于校驗UDP報文在傳輸中是否存在差錯。校驗范圍是整個UDP報文(包括首部和數據)。
5. 偽首部不是UDP報文的真正首部,只是在計算校驗和時,臨時性地與UDP報文拼接在一起,構成一個臨時性的UDP報文。
#### 7.3 TCP
TCP的主要特點:
1. 面向連接的。應用進程間進行通信必須建立連接,數據傳輸、釋放連接。
2. 應用進程間通信通過TCP連接來進行的。每條TCP有2端點,只能實現`點--點`的通信。
3. TCP提供可靠交付的服務。也就是通過TCP連接傳輸的數據,不存在`差錯`、`丟失`和`重復`現象,能按序到達目的端。
4. TCP提供全雙工通信。TCP允許通信雙方的用戶進程同時發送數據。在連接兩端都設有發送緩存和接收緩存,緩存是發送(或接收)數據的臨時存放點。
5. TCP是面向字節流的。"面向字節流"的含義是:TCP把應用層下傳給傳輸層的數據塊看成是一串無結構的字節序列流。它不保證發送端和接收端的數據塊大小一樣,但保證接收端應用進程收到的字節流與發送端發出的字節流是完全一樣的。(想象端和端之間有一條管道)
##### TCP連接
每條TCP連接有兩個端點。TCP連接的這個端點稱為套接字或插口。根據RFC 793的定義:`端口號拼接到IP地址即構成了套接字`。
`套接字:: = (IP地址:端口號)`
例如IP地址是130.8.16.86,端口號是80,那么得到的套接字就是(130.8.16.86:80)。
每一條TCP連接可用通信兩端的兩個端點(兩個套接字)來標識
`TCP連接:: = {socket1,socket2} = {(IP1:port1),(IP2:port2)}`
所以,TCP連接是協議軟件所提供的一種抽象,是為兩個進程之間通信而建立的一條TCP連接,其端點是套接字,即(IP地址:端口號)。基于傳輸層有支持多個進程通信的功能,同一個IP地址可以有多條不同的TCP連接,而同一個端口號也可以出現在多個不同的TCP連接中。
##### TCP報文格式
TCP把所使用的傳輸協議數據單元(TPDU)稱為TCP報文段。一個TCP報文段由首部和數據兩個部分組成。
:-: 
TCP報文段的格式
首部由`基本部分20B`和`選項(4N字節,N為整數)組成。基本部分含義如下`
1. 源端口(16b)和目的端口(16b)。兩個字段分別填入發送該報文段應用程序的源端口號和接收該報文段的應用程序的目的端口號。
2. 序列號(32b)。標識本報文段所發送的字節流第一個字節的序號。(除了SYN標志被置位的情況)。例如該報文段的序列號為101,所攜帶的數據為200B,則最后一個字節的序列號應為300。下個報文段的序列號則應從301開始。建立連接時,通信雙方都使用隨機器產生的初始序列號。
3. 確認號(32b)。表示期望收到對方下一個報文的第一個數據字節的序號。例如接收端已經收到序列號為101,數據為200B。下一個序列號應該是301開始,則接收端發送的確認報文中將確認號字段設置為301。
4. 數據偏移(又稱TCP首部長度,4b)。它指出首部的長度,即數據部分離本報文段開始的偏移量。數據偏移字段為4b所對應的最大十進制為15。首部長度以32b為單位。因此此數據的最大偏移量是60B,選項長度不超過40(有固定長度20B)。(這里的15對應60字節長)
5. 保留(6b)。留待后用。
6. 標志(6b)。又稱為控制字段,其中每一位都具有特定的控制意義。用于TCP的流量控制、連接建立和釋放以及數據傳送等方面。
1. 緊急URG。表示本報文端中數據的緊急程度。URG=1表示后面的緊急指針字段有效,說明本報文具有高優先級,應該盡快發送。接收端收到URG=1會利用緊急指針的值從報文段中提取緊急數據,不再按順序將它交給應用程序。
2. 確認ACK。僅當ACK=1時,確認號字段才有意義,
3. 推送PSH。PSH=1表示接收端TCP應該將本報文段立即推送到應用層。
4. 復位RST。RST=1表示TCP連接中出現了嚴重錯誤,必須立即釋放傳輸連接,而后再重連。
5. 同步SYN。該位再連接建立時候使用,起著序號同步的作用。
6. 終止FIN。用來釋放一個連接。FIN=1表達與發送的數據已發送完畢,要求釋放傳輸連接。
7. 窗口。用于流量控制。
8. 校驗和。該字段的校驗范圍是整個報文段(首部和數據)。
9. 緊急指針。當URG=1是才有意義,指出緊急數據末尾在報文段的位置。
10. 選項和可變。
##### TCP傳輸控制機制
1. 可靠傳輸
1)停止等待協議
2)連續ARQ(流水線分組傳輸,每個分組開啟超時計時器配合停等協議)
2. 序號確認
3. 流量控制(傳輸方希望快速傳輸,但一定使得接收方能夠來得及接收,利用`滑動窗口`實現流量控制)
4. 發送控制
5. 重傳控制
##### TCP擁塞控制
網絡擁塞的條件表示為
`∑對資源的需求>可用資源`
TCP采用擁塞控制的方法:
1. 慢啟動和擁塞避免
每一個TCP連接需要設定兩個窗口變量
1. 接收端窗口(接收端的流量控制)
2. 擁塞窗口(發送端的流量控制)
慢啟動算法的基本思想:當創建或打開一個連接時,傳輸實體將”擁塞窗口“初始化為1。也就是值允許發送一個報文段,在傳送第二個報文段之前等待確認應答的到來。以后每次接收到報文段的應答,將窗口值增加1(實際上是2的指數規律增長)。出現超時后將擁塞窗口降到1。
實際上是:
1)設慢啟動的門限值為ssthresh為出現擁塞時發送窗口值的一半。
2)設置cwnd=1,并執行慢啟動的過程,直到cwnd=ssthresh。
3)當cwnd>=ssthresh時,則每一個往返時延RTT就對cwnd加1,使得cwnd按線性增長。
2. 快重傳和快恢復。
##### 連接和釋放
建立連接:三次握手
1)主機A向主機B發出連接請求
2)主機B向主機A發出確認連接請求
3)主機A向主機B發出確認
釋放連接:四次揮手
1)主機A發送數據并主動關閉向主機B發送釋放請求
2)主機B仍可發送數據,并通知應用層進程(半關閉狀態)
3) 主機B被動關閉,不再發送數據,向主機A發送連接釋放
4) 主機A向主機B發出確認釋放