UNIX網絡編程---傳輸層:TCP、UDP、SCTP(二)

UNIX網絡編程----傳輸層:TCP、UDP、SCTP編程

1、概述服務器

本章的焦點是傳輸層:包括TCP、UDP、和SCTP(流控制傳輸協議)。SCTP是一個較新的協議,最初設計用於跨因特網傳輸電話信令。網絡

UDP是一個簡單的、不可靠的數據報協議。TCP是一個複雜、可靠的字節流協議。SCTP與TCP相似之處在於它也是一個可靠的數據報協議,但它還提供消息邊界、傳輸級別多宿支持以及將頭端阻塞減小到最小的一種方法。須要關注的幾點:TCP的三路握手、TCP的連接終止序列和TCP的TIME_WAIT狀態,SCTP的思路握手和SCTP的連接終止,加上由套接字層提供的TCP、UDP和SCTP緩衝區機制。併發

2、總圖socket

從右向左查看該圖,最右邊的5個網絡應用在使用IPv6,函數


 

 

1)      TCP(傳輸控制協議Transmission Control Protocol)大數據

TCP是中面向連接的協議,爲用戶進程提供可靠的全雙工字節流。TCP套接字是一種流套接字。TCP關心確認、超時和重傳之類的細節。TCP既可使用IPv4,又可使用IPv6spa

2)UDP(用戶數據報協議 UserDatagram Protocol)設計

         UDP是一種無鏈接的協議。UDP套接字是一種數據報套接字。UDP數據報不能保證最終到達他們的目的地,IPv4和IPv6均可以使用。排序

3) SCTP(流控制協議 StreamContril Transmission Protocol)

SCTP是一個提供可靠全雙工關聯的面向鏈接的協議。SCTP是多宿的,從而每一個關聯的兩端均涉及一組IP地址和一個端口號。TCP既可使用IPv4,又可使用IPv6

4) ICMP(網際控制消息協議)

         ICMP處理在路由器和主機之間流通的錯誤和控制消息。這些消息一般有TCP/IP網絡支持軟件自己(而不是用戶進程)產生和處理,不過圖中展現的ping和tracerroute程序一樣適用ICMP。

5)IGMP(網際組管理協議) 因爲多播

6)ARP(地址解析協議)

         ARP把一個IPv4地址映射成一個硬件地址(如以太網地址)。ARP一般用於注入以太網、令牌環網和FDDI等廣播網絡,在點到點網絡上並不須要。

 

1、用戶數據報協議(UDP)

應用進程往一個UDP套接字寫入一個消息,該消息隨後被封裝到一個UDP數據報,該UDP數據報進而被封裝到一個IP數據報,而後發送到目的地。UDP不保證UDP數據會到達其最終目的地,不保證各個數據報的前後順序跨網絡後保證不變,也不保證每一個數據報只到達一次。它的重要特色就是缺少可靠性。若是數據報到達了其最終目的地,可是校驗和檢測發現有錯誤,或者改數據報在網絡傳輸中被丟棄了,它就沒法被投遞給UDP套接字,也不會被源端自動重傳。若是想保證一個數據報到達其目的地,能夠往應用程序中添加特性:來自對端的確認、本段的超時與重傳等。

每一個UDP數據報都有一個長度。若是一個數據報正確到達目的地,那麼數據報的長度將隨數據一道傳遞給接受端的應用進程。而TCP是一個字節流協議,沒有任何記錄邊界,這一點不一樣與UDP.

UDP提供無鏈接服務,由於UDP客戶與服務器之間沒必要存在任何長期的關係。距離說明,一個UDP客戶能夠建立一個套接字併發送一個數據報給一個給定的服務器,而後當即用同一個套接字大宋另外一個數據報給另外一個服務器。一樣,一個UDP服務器能夠用通一個UDP套接字從若干個不用的客戶接受數據報,每一個客戶一個數據報。

2、TCP(傳輸控制協議)

TCP首先和服務器創建鏈接,還提供了可靠性,當TCP向另外一端發送數據時,它要求對端但會一個確認。若是沒有確認,TCP就自動重傳數據並等待更長時間。在數次重傳失敗後,TCP才放棄,如此嘗試發送數據上所化的總時間通常爲4~1分鐘。

 

1)  TCP的幾個能力,首先可以估算客戶和服務器之間的往返之間

2)  TCP給傳輸的數據加上序號,並對所發送的數據進行排序。若是接收端TCP接受到雷子對端的重複數據,它能夠斷定數據時充當的,從而丟棄。若是數據非順序到達,接收端TCP將先根據他們的須要從新排序。還提供流量控制。TCP老是告知對端在任什麼時候刻它一次可以從對端接受對少字節的數據,稱爲通告窗口。任什麼時候刻,該窗口指出接受緩衝區當前可用的空間量,從而保證發送端發送數據不會使接受緩衝區溢出。該窗口時刻動態變化。也有可能爲0

3)  TCP鏈接是全雙工的,意味着在一個給定的鏈接上應用能夠在任什麼時候刻在進入方向上既能夠發送數據由接受數據。創建一個全雙工鏈接後,須要的話能夠把它轉換成一個單工鏈接。

4)  UDP能夠是全雙工的

1、流控制傳輸協議(SCTP)

SCTP是面向消息的。和UDP同樣,由發送端寫入的每條記錄的長度隨數據一道傳遞給接受端應用。

SCTP可以在所鏈接的端點之間提供多個流,每一個流各自可靠地按序遞送消息。一個流上某個消息的丟失不會阻塞通一個關聯其餘流上消息的投遞,這個作法和TCP相反,TCP字節丟失將阻塞鏈接上其後全部數據的遞送,直到該丟失被恢復爲止。

 

1、TCP鏈接的創建和終止

1)  服務器準備好接受外來的鏈接,使用socket、bind、listen這三個函數使套接字稱爲被動套接字,稱爲被動打開

2)  客戶經過connect鏈接固定IP固定端口的套接字,這致使客戶TCP發送一個SYN分節,它告訴服務器客戶講在鏈接中發送的數據的出事序列號。一般SYN分節不攜帶數據。

3)  服務器確認(ACK)客戶的SYN,同時本身也得發送一個SYN分節,它含有服務器在同一鏈接中發送的數據的初始化序列號。服務器在單個分節中發送SYN和對客戶SYN的ACK(確認)。

4)  客戶必須確認服務器的SYN。

 

 

 

客戶的初始序列號爲J,服務器的初始序列爲K。ACK中的確認號是發送這個ACK的一端所期待的下一個序列號。

1、    TCP鏈接終止

1)TCP創建一個鏈接須要3個分節,終止一個鏈接則須要4個字節。某個應用進程首先調用close,咱們稱該端執行主動關閉,該端的TCP因而發送一個FIN分節,表示數據發送完畢。

2)接受到這個FIN的對端執行被動關閉,這個FIN有TCP確認。它的接受也做爲一個文件結束符傳遞給接受端應用進程(放在已排隊等候該應用進程接受的任何其餘數據以後),由於FUN的接受一位這接受端應用進程在響應鏈接上再無額外數據可接受。

3)接受待這個文件結束符的應用進程將調用close關閉它的套接字。這道指它的TCP也發送一個FIN。

4)接受這個最終FIN的原發送端TCP(既執行主動關閉的那一端)確認這個FIN。

既然每一個方向都須要一個FIN和一個ACK,所以一般須要4個分節。


 

在步驟2與步驟3之間,從執行別動關閉一端到執行主動關閉一端流動數據時可能的,這稱爲半關閉,使用函數shutdown。

2、    TCP狀態轉換圖

TCP爲一個鏈接定義11種狀態。


 

例如:當某個應用進程在CLOSED狀態下執行主動打開時,TCP將發送一個SYN,且新的狀態是ESTABLISHED。

         自ESTABLISHED狀態引出的兩個箭頭處理鏈接的終止。若是某個應用進程在接受到一個FIN以前調用close(主動關閉),那就轉換到FIN_WAIT_1狀態。若是某個應用進程在ESTABLISHED狀態期間接受到一個FIN(被動關閉),那就轉換到CLOSE_WAIT狀態。

         咱們用粗線實線表示一般的客戶狀態轉換,用粗虛線表示一般的服務器狀態轉換。

一旦創建練級額,客戶就構造一個請求併發送給服務器。這裏假設該請求適合於單個TCP分節(既請求大小小於服務器通告的值爲1460字節的MSS)服務器處理請求併發送一個應答,假設該應答適合於單個分節(小於536字節)

 

1、TIME_WAIT狀態

1)  此狀態存在的理由

可靠地實現TCP全雙工鏈接的終止

容許老的重讀分節在網絡中消失

 

假設上圖中最後一個ACK丟失。服務器將從新發送它的最終那個FIN,所以客戶必須維護狀態信息,以容許他從新發送最中那個ACK。說明了爲何執行主動關閉的那一端是處於TIME_WAIT狀態的那一端,由於可能不得不重傳最終那個ACK的就是那一端。

對於第二個理由,咱們假設通一個IP和端口之間有一個TCP鏈接,咱們關閉這個鏈接,過一端時間後在相同的IP地址和端口號之間創建另外一個鏈接。後一個鏈接成爲前一個鏈接的化身,由於他們的IP地址和端口號相同。TCP必須防止來自某個鏈接的老的重複分組在該鏈接已經中國知網後再現,從而被誤解成同一個鏈接的某個新的化身。爲作到這一點,TCP將不給處於TIME_WAIT狀態的連接發起新的化身。既然TIME_WAIT狀態的持續時間是MSL的2倍,這就足以讓某個方向上的分組最多存貨MSL秒被丟棄。另外一個方向上的應答最多存貨MSL秒也被丟棄。

1、TCP/UDP輸出

1)  TCP輸出

每個TCP套接字有一個發送緩衝區,咱們可使用SO_SNDBUF套接字選項來更改穿衝去的大小。當某個應用進程調用write時,內核從該應用進程的緩衝區中複製全部數據到縮寫套接字的發送緩衝區。若是該套接字的發送緩衝區容不下該應用進程的全部數據(或是應用進程的緩衝區大於套接字的發送緩衝區,或是套接字的發送緩衝區已有其餘數據),該應用進程將被投入睡眠。這裏假設該套接字時阻塞的,它是一般的默認設置。內核將不從write系統調用返回,直到應用進程緩衝區中的全部數據都複製到套接字發送緩衝區。從寫一個TCP套接字的write或應用進程成功返回僅僅表示咱們能夠從新使用原來的應用緩衝區,並不代表對端的TCP或應用進程已接收到數據。

2)  UDP輸出

其實UDP套接字沒有發送緩衝區。任何UDP套接字都有發送緩衝區大小,不過它僅僅是可寫到該套接字的UDP數據報的大小的上限,若是一個應用進程寫一個大於套接字發送緩衝區大小的數據報,內核將返回進程一個EMSGSIEZE錯誤。既然UDP是不可靠的,它沒必要保存應用進程數據的一個副本,所以無需一個真正的發送緩衝區。若是某個UDP應用進程發送大數據報(好比2000字節的數據報),那麼他們相比TPC應用數據更有可能被分片,由於TCP會把應用數據劃分紅MSS大小的塊,而UDP卻沒有對等的手段。

從寫一個UDP套接字的WRITE調用成功返回表示所寫的數據報或其全部片斷已被加入數據鏈路層的輸出隊列。若是該對壘沒有足夠的空間存放該數據報或它的某個片斷,內核一般會返回一個ENOBUFS錯誤給他的應用進程。

3)  SCTP輸出

這個的輸出和TCP的輸出類似

相關文章
相關標籤/搜索