《TCP IP詳解》學習筆記(六) UDP 協議

2021-08-28 08:34:13 字數 1851 閱讀 6323

udp 是傳輸層協議,和 tcp 協議處於乙個分層中,但是與 tcp 協議不同,udp 協議並不提供超時重傳,出錯重傳等功能,也就是說其是不可靠的協議。

由於很多軟體需要用到 udp 協議,所以 udp 協議必須通過某個標誌用以區分不同的程式所需要的資料報。埠號的功能就在於此,例如某乙個 udp 程式 a 在系統中註冊了3000埠號,那麼以後從外面傳進來的目的埠號為3000的 udp 包都會交給該程式。埠號理論上可以有2^16這麼多。因為它的長度是16個 bit。

這是乙個可選的選項,並不是所有的系統都對 udp 資料報加以檢驗(相對 tcp 協議的必須來說),但是 rfc 中標準要求, 傳送端應該計算檢驗和。

udp 檢驗和覆蓋 udp 協議頭和資料,這和 ip 的檢驗和是不同的,ip 協議的檢驗和只是覆蓋 ip 資料頭,並不覆蓋所有的資料。udp 和 tcp 都包含 乙個偽首部,這是為了計算檢驗和而設定的。偽首部甚至還包含 ip 位址這樣的 ip 協議裡面都有的資訊,目的是 讓 udp 兩次檢查資料是否已經正確到達目的地。 如果傳送端沒有開啟檢驗和選項,而接收端計算檢驗和有差錯,那麼 udp 資料將會被悄悄的丟掉(不保證送達),而不產生任何差錯報文。

udp 可以很長很長,可以有65535位元組那麼長。但是一般網路在傳送的時候,一次一般傳送不了那麼長的協議(涉及到 mtu 的問 題),就只好對資料 分片,當然,這些是對 udp 等上級協議透明的,udp 不需要關心 ip 協議層對資料如何分片,下乙個章節將會稍微討論一些分片的策略。

ip在從上層接到資料以後,要根據ip位址來判斷從哪個介面傳送資料(通過選路),並進行mtu的查詢,如果資料大小超過mtu 就進行資料分片。資料的分片是對上層和下層透明,而資料也只是到達目的地才會被重新組裝,不過不用擔心,ip 層提供了足夠的資訊進行資料的再組裝。

在 ip 頭裡面,16bit 識別號唯一記錄了乙個 ip 包的 id,具有同乙個 id 的 ip 片將會被重新組裝;而13位片偏移則記錄了某 ip 片相對整個包的位置;而這兩個表示中間的3bit 標誌則標示著該分片後面是否還有新的分片。這三個標示就組成了 ip 分片的所有資訊;接收方就可以利用這些資訊對 ip 資料進行重新組織(就算是後面的分片比前面的分片先到,這些資訊也是足夠了)。

因為分片技術在網路上被經常的使用,所以偽造 ip 分片包進行流氓攻擊的軟體和人也就層出不窮。可以用 trancdroute 程式來進行簡單的 mtu 偵測。請參看教材。

這是不常被人注意到的乙個細節,這是針對一些系統地實現來說的。當 arp 快取還是空的時候。udp 在被傳送之前一定要傳送乙個 arp 請求來獲得目的主機的 mac 位址,如果這個 udp 的資料報足夠大,大到 ip 層一定要對其進行分片的時候,想象中,該 udp 資料報的第乙個分片會發出乙個 arp 查詢請求,,所有的分片都會等到這個查詢完成以後再傳送。事實上是這樣嗎?

結果是:某些系統會讓每乙個分片都傳送乙個 arp 查詢,所有的分片都在等待,但是接受到第乙個回應的時候,主機卻只傳送了最後乙個資料片而拋棄了其他,這實在是讓人匪夷所思。這樣,因為分片的資料不能被及時組裝,接受主機將會在一段時間內將永遠無法組裝的 ip 資料報拋棄,並且傳送組裝超時的 icmp 報文(其實很多系統不產生這個差錯),以保證接收主機自己的接收端快取不被那些永遠得不到組裝的分片滿。

當目標主機的處理速度趕不上資料接收的速度,因為接受主機的 ip 層快取會被佔滿,所以主機就會發出乙個「我受不了」的乙個 icmp 報文。

udp 協議的某些特性將會影響我們的伺服器程式設計,大致總結如下:

關於資料輸入:通常伺服器系統的每乙個埠號都會和一塊輸入緩衝區對應,進來的輸入根據先來後到的原則等待伺服器的處理,所以難免會出現緩衝區溢位的問題,這種情況下,udp 資料報可能會被丟棄,而應用伺服器程式本身並不知道這個問題。

伺服器應該限制本地ip位址,就是說它應該可以把自己繫結到某乙個網路介面的某乙個埠上。

TCP IP筆記 六 TCP與UDP

tcp ip中有兩個具有代表性的傳輸層協議,分別為 套接字 socket 使用tcp或udp時,會廣泛使用到套接字 socket 的api。套接字原本是由bsd unix開發的,但是後被移植到了windows的winsock以及嵌入式作業系統中。應用程式利用套接字,可以設定對端的ip位址 埠號,並實...

TCP IP筆記 六 TCP與UDP

tcp ip中有兩個具有代表性的傳輸層協議,分別為 套接字 socket 使用tcp或udp時,會廣泛使用到套接字 socket 的api。套接字原本是由bsd unix開發的,但是後被移植到了windows的winsock以及嵌入式作業系統中。應用程式利用套接字,可以設定對端的ip位址 埠號,並實...

TCP IP詳解學習筆記 6 UDP協議

udp是傳輸層協議,和tcp協議處於乙個分層中,但是與tcp協議不同,udp協議並不提供超時重傳,出錯重傳等功能,也就是說其是不可靠的協議。2.1.udp埠號 由於很多軟體需要用到udp協議,所以udp協議必須通過某個標誌用以區分不同的程式所需要的資料報。埠號的功能就在於此,例如某乙個udp程式a在...