《Linux防火墙(第4版)》——1.3 传输层机制
本節書摘來自異步社區《Linux防火墻(第4版)》一書中的第1章,第1.3節,作者:【美】Steve Suehring(史蒂夫 蘇哈林)著,更多章節內容可以訪問云棲社區“異步社區”公眾號查看
1.3 傳輸層機制
IP協議定義了OSI模型中的網絡層協議。其實仍有一些其他的網絡層協議,但我只聚焦在IP上,因為它是目前最流行的網絡層協議。OSI模型中,網絡層之上的是傳輸層。正如您所料,傳輸層有它自己的一組協議簇。我們對兩個傳輸層的協議比較感興趣:UDP和TCP。本節將分別詳細介紹這些協議。
1.3.1 UDP
用戶數據報協議(User Datagram Protocol,UDP)是無連接協議,用于DNS查詢、SNMP(簡單網絡管理協議)和RADIUS(遠程用戶撥號認證系統)等。作為無連接協議,UDP協議的工作方式類似于“發送,然后遺忘”??蛻舳税l送一個UDP數據包(有時稱為數據報),并假設服務器將會收到該數據包。它依賴更高層的協議來將數據包按順序組合。UDP的報頭為8字節,見圖1.4。
UDP報頭以源端口號和目的端口號開始。接下來是包括數據在內的整個數據包的長度。顯然,由于UDP報頭的長度為8字節,因此這部分的最小值為8。最后的部分是UDP頭部的校驗和,它包括了數據和報頭(對數據和報頭一起計算校驗和)。
1.3.2 TCP
TCP是傳輸控制協議(Transmission Control Protocol)的縮寫,它是常用的面向連接的協議,常和IP一起使用。TCP作為面向連接的協議,意味著它向上層提供可靠的服務?;叵氡菊虑懊媾e出的電話會話的例子。在這個類比中,兩個應用程序想要使用TCP進行通信則必須建立一個連接(有時被稱為會話)。TCP報頭見圖1.5。
就像您在圖1.5中看到的那樣。20字節的TCP頭部明顯比本章的其他協議頭部更加復雜。與UDP協議相似的是,TCP頭部也以源端口和目的端口開始。而源端口、目的端口與發送者、接收者的IP地址相結合唯一確定了這個連接。TCP報頭有32比特的序列號和32比特的確認序列號。TCP是面向連接的協議并且提供可靠的服務。序列號和確認序列號是(但不是唯一)用于提供可靠性的基礎機制。隨著數據從傳輸層向下傳遞,TCP會將數據劃分成它認為合適的大小。這些分片即是TCP報文段(segment)。在TCP沿協議棧向下傳遞數據的過程中,它創建了序列號,指明了給定報文段中數據的第一個字節。在通信的另一端,接收者發送一個確認消息,指明它已經收到的報文段。發送者維護一個定時器,一旦一個確認序列號未按時接收,該數據段則會被重新發送。
TCP保障可靠性的另一個機制是在報頭和數據上計算的校驗和。如果接收者接收到的發送者發送的報頭中的校驗和與接收者計算的校驗和不匹配,則接收者將不會發送確認消息。如果確認消息在傳輸中丟失,則發送者可能會使用同樣的序列號再發送一遍報文段。在這種情況下,接收者將簡單地丟棄重復的報文段。
一個4比特的域(此處指數據偏移)被用來表示包括所有選項在內的報頭長度(單位是32比特)。TCP報頭中有許多獨立的比特標志:URG、ACK、PSH、RST、SYN、FIN、NS、CWR和ECE。對于這些標志的描述見表1.4。
16比特的窗口域提供了滑動窗口機制。接收者設置窗口值以指明接收者準備接收的數據大小(從確認序號開始的大小)。這是TCP流控制中的一種。
16比特的緊急指針指明了緊急數據結束處的偏移量,該偏移量從序列號開始。它能讓發送者指明偏移量內的數據是緊急數據,應該以緊急方式進行處理。這個指針可以和PSH標志結合使用。
現在您對TCP報頭有了直觀的感覺了,是時候看看TCP連接是如何建立和終止的了。
TCP連接
UDP是無連接的協議,而TCP卻是面向連接的協議。UDP中沒有連接的概念,在UDP數據報中只有發送者和接收者。對于TCP而言,連接的任一方都可以發送或接收數據,也可以同時接收和發送。TCP是全雙工(full-duplex)的協議。建立一個TCP連接的過程有時被稱為三次握手(three-way handshake),很快您就會看到這個稱呼的來由。
由于是面向連接的協議,在建立TCP連接時,會發生一個特定的過程。在該過程中,存在許多TCP連接的狀態。連接建立的過程和相應的狀態會在接下來的部分詳細介紹。
要發起通信的一方(客戶端)會在發送的TCP報文中設置SYN標志、初始序列號(Initial Sequence Number, ISN)以及它要通信的另一方的端口號,通常連接的另一方是服務器。該報文通常被稱為SYN數據包或者SYN報文段,此時該TCP連接處于SYN_SENT狀態。
此連接的服務器一方會發送一個同時設置了SYN標志和ACK標志的TCP報文段作為應答。此外,服務器還會將確認序列號設置為客戶端所發送的初始序列號加一。該報文通常被稱為SYN-ACK數據包或SYN-ACK報文段,此時該TCP連接處于SYN_RCVD狀態。
接下來,客戶端會應答SYN-ACK數據包:發送一個設置了ACK標志,并且確認序列號為SYN-ACK序列號加一的報文段。至此,三次握手已經結束,該連接已建立,進入了ESTABLISHED狀態。
與初始化連接的協議(這里的協議指的是建立連接的過程)相對應,還有一個終止連接的過程。用于終止TCP連接的過程與建立連接的三步相對,共有四個步驟。多出的一個步驟來自于TCP連接的全雙工特性,因為任何一邊都可能在任何時候發送數據。
通過發送設置了FIN標志的TCP報文段,TCP連接的某一方可以關閉該方向的連接。連接的任何一方都可以發送FIN標志,以表明它已經將數據發送完畢。而連接的另一方則可以繼續發送數據。然而,實際上,當FIN被接收時,連接的終止過程通常將開始。在下面的討論中,我把想要終止連接的一方稱為客戶端。
終止過程從客戶端發送一個設置了FIN標志的報文段開始,此時服務器端的狀態為CLOSE_WAIT,而客戶端的狀態為FIN_WAIT_1。在服務端接收到FIN后,服務端將向客戶端回復ACK,同時將序列號加一。此時,客戶端進入FIN_WAIT_2狀態。服務端同時向它的高層協議指出連接已終止。接下來,服務端將關閉連接,這會導致一個設置了FIN標志的報文段被發送到客戶端,然后服務端將進入LAST_ACK狀態,而客戶端則進入TIME_WAIT狀態。最后,客戶端發送報文段確認此FIN標志(設置ACK標志,并將序列號加一),然后該連接便進入了CLOSED狀態。由于TCP連接可以被任何一方終止,因此,一個TCP連接能夠以半關閉的狀態存在,此時一端已發起了FIN終止序列,但另一端則并沒有這樣做。
TCP連接也能夠由任何一方發送一個設置了重置(RESET)標志的報文段而終止。這通知連接的另一端使用一種中止的方式來釋放連接。它與通常的結束TCP連接的那種常被稱為有序釋放的方式不同。
TCP連接序列中有一個可選擇部分是最大報文段長度(Maximum Segment Size,MSS)。MSS是通信的雙方各自所能接收的最大的數據塊的大小。由于MSS是連接的兩方所能接收到的最大的大小,通常發送比MSS小一些的數據塊更合適。一般而言,您應該考慮使用一個大一些的MSS,然而請牢記應避免分片(會在IP層進行),因為分片會增加系統開銷(數據包分片需要額外的IP和TCP報頭的字節)。
總結
以上是生活随笔為你收集整理的《Linux防火墙(第4版)》——1.3 传输层机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《深入理解Android:卷III A》
- 下一篇: Excel-怎样实现行列转置