## 5.1 傳輸層的由來
有了MAC地址和IP地址,我們已經可以在互聯網上任意兩臺主機上建立通信。
接下來的問題是,同一臺主機上有許多程序都需要用到網絡,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎么知道,它是表示網頁的內容,還是表示在線聊天的內容?
也就是說,我們還需要一個參數,表示這個數據包到底供哪個程序(進程)使用。這個參數就叫做"端口"(port),它其實是每一個使用網卡的程序的編號。每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。
"端口"是0到65535之間的一個整數,正好16個二進制位。0到1023的端口被系統占用,用戶只能選用大于1023的端口。不管是瀏覽網頁還是在線聊天,應用程序會隨機選用一個端口,然后與服務器的相應端口聯系。
"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網絡層"的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。因此,Unix系統就把主機+端口,叫做"套接字"(socket)。有了它,就可以進行網絡應用程序開發了。
## 5.2 UDP協議
現在,我們必須在數據包中加入端口信息,這就需要新的協議。最簡單的實現叫做UDP協議,它的格式幾乎就是在數據前面,加上端口號。
UDP數據包,也是由"標頭"和"數據"兩部分組成。

"標頭"部分主要定義了發出端口和接收端口,"數據"部分就是具體的內容。然后,把整個UDP數據包放入IP數據包的"數據"部分,而前面說過,IP數據包又是放在以太網數據包之中的,所以整個以太網數據包現在變成了下面這樣:

UDP數據包非常簡單,"標頭"部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。
## 5.3 TCP協議
UDP協議的優點是比較簡單,容易實現,但是缺點是可靠性較差,一旦數據包發出,無法知道對方是否收到。
為了解決這個問題,提高網絡可靠性,TCP協議就誕生了。這個協議非常復雜,但可以近似認為,它就是有確認機制的UDP協議,每發出一個數據包都要求確認。如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。
因此,TCP協議能夠確保數據不會遺失。它的缺點是過程復雜、實現困難、消耗較多的資源。
TCP數據包和UDP數據包一樣,都是內嵌在IP數據包的"數據"部分。TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。