這一章主要概述了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狀態,因爲它使用了驗證標記。