UNIX網絡編程卷一 第二章 傳輸層TCP UDP SCTP

這一章主要概述了TCP/IP協議族的各種協議,主要討論了傳輸層的 TCP UDP 和SCTP協議的通信過程。

一:總圖


該圖描繪了tcp/ip協議中各個協議的層次關係以及協議之間的關聯。

如ping 命令,是基於ICMP和ip協議的基礎之上的應用。

同時也能大致看出每一層包含哪些協議: api 以上的都屬於應用層, 傳輸層只有TCP UDP SCTP三個協議, ipv4 ipv6 icmp igmp arp rarp 都歸屬於網絡層, 鏈路層的協議則圖中沒有列出。 其中icmp 和 igmp 其實是位於IP之上的, arp 位於ip 之下,但是通常都把它們歸爲ip層。


二、 UDP協議

UDP 協議 是簡單的、無連接的、不可靠的、 有記錄邊界的協議。

簡單性 是指它沒有重傳機制,沒有擁塞控制機制等特性,因此具有很高傳輸效率,在良好的鏈路條件下也有一定的質量保證。

無連接性 是指它無需要事先建立鏈路,知道服務器IP 和端口後就直接將數據發送出去,不需要管服務器端狀態。

不可靠性 是指它傳輸的數據目的端不一定能收到,或者收到的數據不一定完全正確。

有記錄邊界 是指接收端在接收數據時會解析應用層裏面的數據,如UDP數據報的長度等信息, 而TCP協議這個長度信息是在TCP首部的,tcp是面向字節流的協議,它沒有記錄邊界,接收端只解析各層協議頭並不解析應用發送的內容。

應用層交給UDP的數據,UDP只加8字節的頭部然後交到IP層。


三、 TCP協議

TCP協議是一種面向連接的、可靠的、提供流量控制、基於字節流的全雙工傳輸層通信協議。

1. 面向連接: TCP在客戶和服務器在交換數據之前需要先建立一個連接(三路握手), 數據交換完成之後需要終止這個連接(四路)。

2. 提供了可靠性: 具有重傳機制保證可靠性

3. 流量控制:TCP總是告訴對方通告窗口大小 ,當接收端通告窗口越來越小時發送方發送的內容也相應減少,當通告窗口爲0時就暫停發送。

4. 基於字節流: 沒有記錄邊界。

三路握手:


1. 客戶端調用connect 主動打開連接。此時會向服務器發送 SYN (1B),圖中序號爲J。

2. 服務器調用accept 接收連接。 接收連接時向客戶 發送一個SYN字節,捎帶一個ACK響應客戶。

3. 客戶收到服務器響應後發送ACK響應服務器的SYN,然後connect返回,客戶狀態變爲連接建立狀態。

4. 服務器收到ack後,也進入連接建立狀態, accept返回, 這時TCP連接成功建立。


**************************************************************************************

20170323修改

上述步驟有誤:

第二步中,並非調用accept後才發送SYN字節,只要服務器端調用完listen後,TCP服務端就會自動發送SYN字節。

服務器調用完listen後會維護2個隊列,一個已建立連接的隊列,一個即將建立連接的隊列,SYN、ACK字節都是在這一過程自動處理的,調用accept只是將一建立連接隊列中的第一個套接字描述符返回,若沒有就阻塞。

**************************************************************************************



TCP連接終止:


圖中是客戶主動終止連接,實際中雙方都可以調用close終止連接,首先發起方最後會進入TIME_WAIT狀態(需要等待2MSL秒才進入關閉狀態,在此之前不能建立新的連接)

1. 客戶先調用close時,會發送FIN字節。進入FIN_WAIT1狀態。

2. 服務器接收到FIN後, read會返回0,tcp發送一個ACK響應客戶端。進入close_wait(半關閉)狀態

3. 服務器調用close,同時也會發送一個FIN字節。進入LAST_ACK狀態。

4. 客戶端接收到ACK 後,進入FIN_WAIT2狀態。

5. 客戶接收到FIN字節後,發送一個ACK響應。 進入TIME_WAIT狀態。

6. 服務器收到最後一個ACK後,進入closed狀態。


TCP狀態轉換圖:



進入TIME_WAIT狀態有2個作用:

1. 確保連接能正常關閉。eg:假如最後一個ack 丟失了,如果客戶已經進入了closed狀態,那麼服務器將不停重傳FIN,無法正常關閉。

2. 允許舊的數據報在網絡中丟棄。大致意思是爲了保證舊的TCP鏈接(已關閉)中的包,在新的TCP連接(剛打開,且和舊的TCP連接具有相同端口號)中需要丟棄,如果沒有

TIME_WAIT狀態,那麼這個事情就無法避免;TCP保證TIME_WAIT狀態時不能建立新的TCP連接。

四、 SCTP協議

這個協議與TCP協議類似,只是它支持多宿(每個套接字一段支持多個IP)。

SCTP使用四路握手建立關聯(相對TCP增加cookie的交換),三路交換終止關聯。它不需要進入TIME_WAIT狀態,因爲它使用了驗證標記。


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