目錄
UDP協議
UDP協議段格式
UDP緩沖區?
TCP協議
TCP協議段格式
確認應答機制
超時重傳機制
連接管理機制
連接建立(三次握手)
連接關閉(四次揮手)
滑動窗口
流量控制
擁塞控制
延遲應答
捎帶應答
UDP協議
UDP協議段格式
16位UDP長度:UDP數據報的總長度,包括頭部和數據部分。最小值為8字節(僅頭部)
16位UDP校驗和:用于檢測UDP數據報在傳輸過程中是否發生錯誤。如果校驗和計算結果為0,則表示數據正確
如果校驗和出錯,就會直接丟棄
UDP的特點
- 無連接:知道對端的IP和端口號就直接進行傳輸,不需要建立連接
- 不可靠:沒有確認機制,也沒有重傳機制,若是出錯無法發到對方UDP協議層也不會給應用層返回任何錯誤信息
- 面向數據報:不能夠靈活的控制讀寫數據的次數和數量?
UDP緩沖區?
UDP沒有真正意義上的發送緩沖區,調用sendto會直接交給內核,由內核將數據傳給網絡層協議進行后續的傳輸動作
UDP具有接受緩沖區,但是這個緩沖區不能保證UDP報的順序和發送UDP報的順序一致。如果緩沖區滿再到達的UDP數據就會被丟棄?
TCP協議
TCP協議段格式
?
序列號:用于標識TCP數據段的順序。發送方為每個字節分配一個序列號,接收方通過序列號來重組數據。
確認序列號:接收方期望收到的下一個數據段的序列號。只有在ACK標志位為1時,確認號才有效。(若接收方收到1000-1999所有字節,那么會發送確認號為2000,代表期望收到序列號為2000的下一個字節)
首部長度:表示TCP頭部的長度,以32位字為單位。最小值為5(20字節),最大值為15(60字節)。
保留:保留字段,必須為0。
標志位:
-
URG(緊急指針有效):如果為1,表示緊急指針字段有效。
-
ACK(確認號有效):如果為1,表示確認號字段有效。
-
PSH(推送):如果為1,表示接收方應盡快將數據推送給上層應用。
-
RST(重置連接):如果為1,表示連接出現嚴重錯誤,需要重置。
-
SYN(同步序列號):用于建立連接,表示請求建立連接。
-
FIN(結束連接):用于關閉連接,表示請求關閉連接。
窗口大小:接收方的接收窗口大小,用于流量控制。表示接收方能夠接收的最大字節數。(為了防止對方發送超過接收方能夠接受的數據大小)
校驗和:用于檢測TCP頭部和數據部分在傳輸過程中是否發生錯誤。
緊急指針:指向緊急數據的指針,只有在URG標志位為1時才有效。
選項:用于擴展TCP的功能,提供額外的控制信息。選項字段的長度是可變的,通常用于協商連接參數、優化性能或實現其他高級功能。
確認應答機制
TCP的確認應答機制是TCP實現可靠傳輸的核心機制之一,通過確認號和序列號來確保數據的完整性和順序性。
具體步驟:
(1)發送方發送數據
-
發送方將數據封裝成TCP數據段,并為每個字節分配一個序列號。
-
發送方將數據段發送到網絡中。
(2)接收方接收數據
-
接收方收到數據段后,檢查數據段的序列號是否連續。
-
如果數據段的序列號是連續的,接收方將數據段中的數據存儲到接收緩沖區中。
-
如果數據段的序列號不連續,接收方會發送一個確認號,告訴發送方它期望收到的下一個數據段的序列號。
?(3)接收方發送確認應答
-
接收方發送一個確認應答報文,其中包含確認號。
-
確認號是接收方期望收到的下一個字節的序列號。
(4)發送方接收確認應答
-
發送方收到確認應答后,根據確認號判斷數據是否被成功接收。
-
如果確認號表明數據已被成功接收,發送方可以繼續發送后續的數據段。
-
如果發送方在超時時間內沒有收到確認應答,或者確認號表明某些數據段丟失,發送方會重新發送丟失的數據段。
超時重傳機制
當發送方發送一個數據段后,如果在規定的時間內沒有收到接收方的確認應答,發送方會認為該數據段可能丟失或在網絡中延遲過久,從而重新發送該數據段。
具體步驟:
(1)發送數據段
-
發送方發送一個數據段,并啟動一個定時器,等待接收方的確認應答。
超時時間的設定:
1. Linux中(Unix和Windows),超時以500ms為一個單位進行控制,每次判定超時重發的超時時間都是500ms的整數倍
2. 如果重發一次后仍然得不到應答,等待2*500ms后再進行重傳,如果仍然得不到應答,則 等待4*500ms,以指數形式遞增
3. 累計到一定的重傳次數,TCP認為網絡或者對端主機出現異常,強制關閉連接
(2)等待確認應答
-
發送方等待接收方的確認應答。
-
如果在超時時間內沒有收到確認應答,發送方認為數據段可能丟失或延遲過久,進入下一步。
(3)重傳數據段
-
發送方重新發送丟失的數據段,并重新啟動定時器。
-
每次重傳時,超時時間會根據一定的策略增加,以避免頻繁重傳對網絡造成過大壓力。?
連接管理機制
在正常情況下,TCP要經過三次握手建立連接,四次揮手斷開連接
連接建立(三次握手)
1. 第一次握手:SYN(同步序列號)
客戶端:客戶端向服務器發送一個帶有SYN標志的數據段,表示請求建立。數據段中的序列號字段設置為一個隨機值,稱為初始序列號,連接確認號字段為0。
2. 第二次握手:SYN-ACK(同步序列號 + 確認號)
服務器:服務器收到客戶端的SYN請求后,會發送一個帶有SYN和ACK標志的數據段作為響應,服務器在響應中設置自己的初始序列號,并確認客戶端的序列號,確認號字段設置為客戶端的初始序列號加1。
3. 第三次握手:ACK(確認號)
客戶端:客戶端收到服務器的SYN-ACK響應后,發送一個帶有ACK標志的數據段,確認服務器的序列號,確認號字段設置為服務器的初始序列號加1。
此時,連接建立完成,雙方可以開始數據傳輸
連接關閉(四次揮手)
1. 第一次揮手:FIN(結束連接)
客戶端:客戶端完成數據發送后,發送一個帶有FIN標志的數據段,表示請求關閉連接。客戶端進入FIN_WAIT_1狀態,等待服務器的確認。
2. 第二次揮手:ACK(確認號)
服務器:服務器收到客戶端的FIN請求后,發送一個帶有ACK標志的數據段作為響應,確認號字段設置為客戶端的序列號加1。服務器進入CLOSE_WAIT狀態,等待應用程序關閉連接,客戶端則進入FIN_WAIT_2狀態。
3. 第三次揮手:FIN(結束連接)?
服務器:服務器完成數據發送后,發送一個帶有FIN標志的數據段,表示請求關閉連接。隨后進入LAST_ACK狀態,等待客戶端的確認。
4. 第四次揮手:ACK(確認號)
客戶端:客戶端收到服務器的FIN請求后,發送一個帶有ACK標志的數據段作為響應,確認號字段設置為服務器的序列號加1。客戶端進入TIME_WAIT狀態,等待2倍的報文段最大生存時間(2MSL),以確保最后一個ACK被服務器接收
MSL在RFC1122中規定為兩分鐘,但是各操作系統的實現不同,在Centos7上默認配置的值是60s
之后,客戶端關閉連接
滑動窗口
滑動窗口是一種用于控制數據傳輸量的機制。它通過一個“窗口”來表示接收方能夠接收但尚未確認的數據量。
發送窗口:
發送方維護一個窗口,表示它可以發送但尚未收到確認的數據量,發送窗口的大小決定了發送方可以連續發送多少數據而無需等待確認。
接收窗口:
接收方維護一個窗口,表示它可以接收但尚未處理的數據量,接收窗口的大小由接收方根據其緩沖區的可用空間動態調整,并通過確認應答報文中的窗口字段通知發送方。
工作原理:
1. 接收方:接收方在收到數據后,會發送一個確認應答,其中包含確認號和窗口大小,窗口大小表示接收方當前能夠接收的數據量。
2. 發送方:發送方根據接收方的ACK中的窗口大小調整自己的發送窗口,如果接收方的窗口大小增加,發送方可以發送更多的數據,如果窗口大小減少,發送方需要減少未確認數據的量。
3. 動態調整:滑動窗口是動態的,隨著數據的發送和確認,窗口會向前滑動,每當發送方收到一個ACK,它會根據ACK中的窗口大小調整自己的發送窗口,并繼續發送數據。
?
流量控制
流量控制用于確保發送方不會發送超過接收方處理能力的數據量。主要目的是防止接收方緩沖區溢出,從而避免數據丟失。
工作原理:
1. 接收方:接收方將自己可以接收的緩沖區大小放入TCP首部的“窗口大小”字段,通過ACK端通知發送端,窗口大小字段越大, 說明網絡的吞吐量越高。一旦發現自己的緩沖區快滿了,?就會將窗口大小設置成一個更小的值通知給發送端。
2. 發送方:發送方接受到這個窗口之后, 就會減慢自己的發送速度
如果接收端緩沖區滿了, 就會將窗口置為0,這時發送方不再發送數據,但是需要定期發送一個窗口探測數據段, 使接收端把窗口大小告訴發送端
擁塞控制
擁塞控制是用于避免網絡擁塞并提高數據傳輸效率的關鍵機制。通過動態調整發送方的發送速率,確保網絡不會因為過多的數據流量而過載。
工作原理:
擁塞控制的核心是通過擁塞窗口來控制發送方可以發送的數據量。擁塞窗口的大小會根據網絡的擁塞情況動態調整。
(1)慢啟動(快速增加發送速率,直到檢測到網絡擁塞)
-
在連接建立初期,擁塞窗口以指數速度增長。
-
當擁塞窗口達到一個閾值(ssthresh)時,進入擁塞避免階段
(2)擁塞避免(緩慢增加發送速率,避免網絡擁塞)
-
擁塞窗口以線性速度增長。
-
每經過一個往返時間(RTT),擁塞窗口增加1個MSS。
(3)快速重傳(快速檢測丟包并重傳丟失的數據段)
-
如果發送方收到三個重復的ACK(即三個相同的確認號),它會認為某個數據段可能丟失。
-
發送方立即重傳丟失的數據段。
(4)快速恢復(在重傳后調整擁塞窗口,恢復發送速率)
-
當發送方觸發快速重傳后,進入快速恢復階段。
-
設置閾值(ssthresh)為當前擁塞窗口的一半。
-
將擁塞窗口設置為閾值大小,并進入擁塞避免階段。
延遲應答
延遲應答是一種優化機制,用于減少確認應答報文的數量,從而提高網絡效率。
延遲應答允許接收方在一定時間內延遲發送ACK,而不是立即對每個接收到的數據段發送確認。這種機制在某些情況下可以顯著減少網絡流量,尤其是在接收方頻繁接收數據時。
具體實現:
(1)等待時間
-
接收方在收到數據段后,會等待一個固定的時間(通常為200毫秒)再發送ACK。
-
如果在這段時間內接收到更多的數據段,接收方可以將多個ACK合并為一個。
(2)數據量閾值
-
如果接收方在等待時間內接收到足夠多的數據,它會立即發送ACK,而不是等待固定時間。(這種機制確保了即使在高流量情況下,ACK也不會延遲過久)?
(3)最大延遲時間
-
為了防止ACK延遲過久,TCP協議規定了最大延遲時間(通常為500毫秒)。
-
如果接收方在最大延遲時間內沒有發送ACK,它必須發送一個ACK,即使沒有收到更多的數據段。
捎帶應答
捎帶應答是一種優化機制,用于減少網絡中的報文數量,提高通信效率。
捎帶應答的核心思想是將確認應答與數據段一起發送,而不是單獨發送一個ACK報文。這樣可以減少網絡流量,同時提高協議的效率。?
工作原理:
1. 接收方:接收方收到發送方發送的數據段,檢查數據段的序列號,確認數據的完整性和順序。并準備好發送自己的數據段,在發送數據段時在TCP頭部中包含一個ACK字段,確認之前接收到的數據。
2. 發送方:發送方收到接收方發送的數據段,檢查TCP頭部中的ACK字段,確認接收方已經收到的數據,根據ACK字段更新自己的發送窗口,繼續發送后續數據。
完?