Unix網絡編程二:傳輸層:TCP、UDP、SCTP

一、概述

        UDP是一個簡單的、不可靠的數據報協議,TCP是一個複雜的、可靠的字節流協議。SCTP(Stream control transmission protocol)與TCP類似之處在於他也是一個可靠的傳輸協議,但它還提供消息邊界、傳輸級別多宿支持以及將頭阻塞減少到最小的一種方法。

        本章描述以下相關主題:TCP的三路握手、TCP的連接終止序列和TCP的TIME_WAIT狀態,SCTP的四路握手和連接終止,加上由套接字層提供的TCP、UDP和SCTP的緩衝機制等。

二、總圖

        圖2-1展示了TCP/IP協議族的概況。從右往左查看該圖,最右邊的5個網絡應用在使用IPv6,隨後的6個網絡應用使用IPv4。最左邊的名爲tcpdump的網絡應用或者使用BSD分組過濾器,或者使用數據鏈路提供者接口(datalink provider interface,DLPI)直接與數據鏈路層進行通信。

這裏寫圖片描述

  • IPv4:網際協議版本4,IPv4自20世紀80年代早期以來一直是網際協議族的主力協議,他使用32爲地址。IPv4爲RCP、UDP、SCTP、ICMP和IGMP提供分組傳遞服務
  • IPv6:網際協議版本6。IPv6在20世紀90年代中期作爲IPv4的一個替代品設計的。其主要變化是使用128位更大的地址以應對20世紀90年代因特網的爆發性增長。IPv6爲RCP、UDP、SCTP、ICMPv6提供分組傳遞服務
  • TCP:傳輸控制協議,TCP是一個面向連接的協議,爲用戶進程提供可靠的全雙工字節流。TCP套接字是一種流套接字。TCP關心確認、超時和重傳之類的細節。大多數因特網應用程序使用TCP
  • UDP:用戶數據報協議,UDP是一個無連接協議。UDP套接字是一種數據報套接字。UDP的數據報不能保證最終達到他們的目的地。
  • SCTP:流控制傳輸協議,SCTP是一個通過可靠全雙工的面向連接的協議,我們使用“關聯”一詞來指稱SCTP中的連接,因爲SCTP是多宿的,從而每個關聯的兩端均涉及一組IP地址和一個端口號。SCTP提供消息服務,也就是維護來自應用層的記錄邊界
  • ICMP:網際控制消息協議(Internet control Message Protocol),處理在路由器和主機之間的錯誤和控制消息。這些消息通常由TCP/IP網絡支持軟件本身(而不是用戶進程)產生和處理
  • IGMP:網際組管理協議,用於多播
  • ARP:地址解析協議,ARP把一個IPv4地址映射成一個硬件地址
  • RARP:反向地址解析協議,把一個硬件地址映射成一個IPv4地址
  • ICMPv6:網際控制消息協議版本6,總和了ICMPv4、IGMP和ARP的功能
  • BPF:BSD分組過濾器,該接口提供對於數據鏈路層的訪問能力
  • DLPI:數據鏈路提供者接口,該接口也提供對於數據鏈路層的訪問能力

三、用戶數據報協議

        應用進程往一個UDP套接字寫入一個消息,該消息隨後被封裝到一個UDP數據報,該UDP數據吧進而又被封裝到一個IP數據報,然後發送到目的地。UDP不保證UDP數據會到達其最終目的地,不保證各個數據報的先後順序跨網絡後保持不變,也不保證每個數據報只到達一次

四、傳輸控制協議

        TCP提供客戶與服務器之間的連接,TCP客戶先與某個服務器建立一個連接,在跨該連接與那個服務器交換數據,然後終止這個連接。

        其次,TCP還提供了可靠性,當TCP向另一端發送數據時,它要求對端返回一個確認。如果沒有收到確認,TCP就自動重傳數據並等待更長的時間。在數次重傳失敗後,TCP才放棄。

        TCP含有用於動態估算客戶和服務器之間的往返時間的算法,以便他知道等待一個確認需要多少時間。

        TCP通過給其中每個字節關聯一個序列號對所發生的數據進行排序。

        TCP提供流量控制,TCP總是告知對端在任何時刻它依次能夠從對端接收多少字節的數據,這稱爲通告窗口。在任何時刻,該窗口指出接收緩衝區中當前可用的空間量,從而確保發送端發送的數據不會使接收緩衝區溢出。該窗口時刻動態變化,當接收到來自發送端的數據時,窗口大小就減小,但是當接收端應用從緩衝區讀取數據時,窗口大小就增大。

        TCP連接是全雙工的。這意味着在一個給定的連接上應用可以在任何時刻在兩個方向上既發送數據又接收數據。因此,TCP必須爲每個數據流方向跟蹤諸如序列號和通告窗口等狀態信息

五、流控制傳輸協議

        SCTP在客戶和服務器之間提供關聯,並像TCP那樣給應用提供可靠性、排序、流量控制以及全雙工的數據傳送,SCTP中使用關聯一詞指代兩個系統之間的一次通信,他可能是因爲SCTP是吃多宿而涉及不止兩個地址。

        與TCP不同的是,SCTP是面向消息的,它提供各個記錄的按序遞送服務。SCTP能夠在所連接的端口之間提供多個流,每個流各自可靠的按序遞送消息。一個流上某個消息的丟失不會阻塞同一關聯其他流上消息的投遞。

六、TCP連接的建立與終止

三次握手

  • 服務器必須準備好接收外來連接。這通常通過調用socket、bind、listen這三個函數來完成,我們稱之爲被動打開
  • 客戶通過調用connect發起主動打開,這導致客戶TCP發送一個SYN(同步)分節,他告訴服務器客戶將在連接中發送的數據的初始序列號。通常SYN分節不攜帶數據,其所在的IP數據報只含有一個IP首部,一個TCP首部以及可能有的TCP選項
  • 服務器發送確認客戶的SYN,同時自己也得發送一個SYN分節,它含有服務器將在同一連接中發送的數據的初始序列號。服務器在單個分節中發送SYN和對客戶SYN的ACK(確認)
  • 客戶必須確認服務器的SYN

        這種交換至少需要三個分組,因此稱之爲TCP的三次握手,圖2-2展示了所交換的3個字節。客戶的初始序列號爲J,服務器的初始序列號爲K,ACK中的確認號是發送這個ACK的一端所期待的下一個序列號。因爲SYN佔據一個字節的序列號空間,所以每一個SYN的ACK中的確認號就是該STN的初始號加1,類似的,每一個FIN的ACK中的確認號爲該FIN的序列號加1

這裏寫圖片描述

        TCP選項:每一個SYN可以含有多個TCP選項,下面是常用的TCP選項
- MSS選項:發生SYN的TCP一端使用本選項通過對端它的最大分節大小(maximum segment size),也就是它在本連接的每個TCP分節中願意接收的最大數據量。
- 窗口規模選項:TCP連接的任何一端能夠通告對端的的最大窗口大小是65535,因爲在TCP首部中相應的字段佔16位。
- 時間戳選項:可以防止由失而復現的分組可能造成的數據破壞

**TCP連接終止

        TCP連接需3個分片,終止一個連接則需要4個分節**
- 某個應用程序首先調用close,我們稱該端執行主動關閉。該端的TCP於是發送一個FIN分節,表示數據發送完畢
- 接收到這個FIN的對端執行被動關閉,這個FIN由TCP確認,他的接收也作爲一個文件結束符傳遞給接收端應用進程(放在已排序等待該應用進程接收的任何其他數據之後),因爲FIN的接收意味着接收端應用進程在相應的連接上再無額外數據可接收
- 一段時間後,接收到這個文件結束符的應用進程將調用close關閉它的套接字。這導致它的TCP也發送一個FIN
- 接收到這個最終FIN的原發送端TCP確認這個FIN
        圖2-3展示了這些分節,類似SYN,一個FIN也佔據一個字節的空間號序列,因此每個FIN的ACK確認好就是這個FIN的序列號加1
這裏寫圖片描述

        當套接字被關閉時,其所在端TCP各自發送一個FIN,我們在圖中指出,這是由應用進程調用close而發生的,不過需認識到,當一個Unix進程無論自願地(調用exit或從main函數返回)或者非自願地(收到一個終止本進程的信號)終止時,所有打開的描述符都是被關閉,這也導致仍然打開的任何TCP連接上也發送一個FIN

TCP狀態轉換圖

        TCP爲一個連接定義了11種狀態,並且TCP規則規定了如何基於當前狀態及在改狀態下所接收的分節從一個狀態轉換到另一個狀態。舉例來說,當某個應用進程在CLOSED狀態下執行主動打開時,TCP將發送一個SYN,且新的狀態是SYN_SENT,如果這個TCP接收收到一個帶有ACK的SYN,它將發送一個ACK,且新的狀態是ESTABLISHED。

        自ESTABLISHED狀態引入兩個箭頭處理連接終止。如果某個應用程序在接收到一個FIN之前調用close(主動關閉),那就轉換髮哦FIN_WAIT_1狀態,但是如果某個應用進程在ESTABLISHED狀態接收期間接收到一個FIN(被動關閉),那就轉換到CLOSE_WAIT狀態

        用粗實線表示通常客戶狀態轉換,用粗虛線表示通常服務器狀態轉換。圖中存在兩個爲討論的轉換:同時打開(發生在兩端幾乎同時發送AYN並且這兩個SYN在網絡中交錯的情形下),同時關閉(發生在兩端幾乎同時發送FIN的情形下)。它們可能發生,但非常罕見

這裏寫圖片描述

觀察分組

        圖2-5展示了一個完整的TCP連接送發生的實際分組交換情況,包括連接建立、數據傳送和連接終止三個階段。

        一旦建立一個連接,客戶就構造一個請求發送給服務器。服務器處理併發送一個應答。注意,服務器對客戶請求的確認是伴隨其應答發送的,這種做法稱爲捎帶
這裏寫圖片描述

七、TIME_WAIT狀態

八、SCTP關聯的建立和終止

九、端口號

十、TCP端口號和併發服務器

十一、緩衝區大小及限制

十二、標準因特網服務

十三、常見因特網應用的協議使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章