《TCP/IP详解》学习笔记(六):UDP 协议
UDP 簡要介紹
UDP 是傳輸層協(xié)議,和 TCP 協(xié)議處于一個分層中,但是與 TCP 協(xié)議不同,UDP 協(xié)議并不提供超時重傳,出錯重傳等功能,也就是說其是不可靠的協(xié)議。
UDP 協(xié)議頭
1UDP 端口號
由于很多軟件需要用到 UDP 協(xié)議,所以 UDP 協(xié)議必須通過某個標志用以區(qū)分不同的程序所需要的數(shù)據(jù)包。端口號的功能就在于此,例如某一個 UDP 程序 A 在系統(tǒng)中注冊了3000端口號,那么以后從外面?zhèn)鬟M來的目的端口號為3000的 UDP 包都會交給該程序。端口號理論上可以有2^16這么多。因為它的長度是16個 bit。
?
2.UDP 檢驗和
這是一個可選的選項,并不是所有的系統(tǒng)都對 UDP 數(shù)據(jù)包加以檢驗(相對 TCP 協(xié)議的必須來說),但是 RFC 中標準要求, 發(fā)送端應該計算檢驗和。
UDP 檢驗和覆蓋 UDP 協(xié)議頭和數(shù)據(jù),這和 IP 的檢驗和是不同的,IP 協(xié)議的檢驗和只是覆蓋 IP 數(shù)據(jù)頭,并不覆蓋所有的數(shù)據(jù)。UDP 和 TCP 都包含 一個偽首部,這是為了計算檢驗和而設置的。偽首部甚至還包含 IP 地址這樣的 IP 協(xié)議里面都有的信息,目的是 讓 UDP 兩次檢查數(shù)據(jù)是否已經(jīng)正確到達目的地。 如果發(fā)送端沒有打開檢驗和選項,而接收端計算檢驗和有差錯,那么 UDP 數(shù)據(jù)將會被悄悄的丟掉(不保證送達),而不產(chǎn)生任何差錯報文。
?
3UDP 長度
UDP 可以很長很長,可以有65535字節(jié)那么長。但是一般網(wǎng)絡在傳送的時候,一次一般傳送不了那么長的協(xié)議(涉及到 MTU 的問 題),就只好對數(shù)據(jù) 分片,當然,這些是對 UDP 等上級協(xié)議透明的,UDP 不需要關心 IP 協(xié)議層對數(shù)據(jù)如何分片,下一個章節(jié)將會稍微討論一些分片的策略。
IP 分片
IP在從上層接到數(shù)據(jù)以后,要根據(jù)IP地址來判斷從哪個接口發(fā)送數(shù)據(jù)(通過選路),并進行MTU的查詢,如果數(shù)據(jù)大小超過MTU 就進行數(shù)據(jù)分片。數(shù)據(jù)的分片是對上層和下層透明,而數(shù)據(jù)也只是到達目的地才會被重新組裝,不過不用擔心,IP 層提供了足夠的信息進行數(shù)據(jù)的再組裝。
在 IP 頭里面,16bit 識別號唯一記錄了一個 IP 包的 ID,具有同一個 ID 的 IP 片將會被重新組裝;而13位片偏移則記錄了某 IP 片相對整個包的位置;而這兩個表示中間的3bit 標志則標示著該分片后面是否還有新的分片。這三個標示就組成了 IP 分片的所有信息;接收方就可以利用這些信息對 IP 數(shù)據(jù)進行重新組織(就算是后面的分片比前面的分片先到,這些信息也是足夠了)。
因為分片技術在網(wǎng)絡上被經(jīng)常的使用,所以偽造 IP 分片包進行流氓攻擊的軟件和人也就層出不窮??梢杂?Trancdroute 程序來進行簡單的 MTU 偵測。請參看教材。
UDP 和 ARP 之間的交互式用
這是不常被人注意到的一個細節(jié),這是針對一些系統(tǒng)地實現(xiàn)來說的。當 ARP 緩存還是空的時候。UDP 在被發(fā)送之前一定要發(fā)送一個 ARP 請求來獲得目的主機的 MAC 地址,如果這個 UDP 的數(shù)據(jù)包足夠大,大到 IP 層一定要對其進行分片的時候,想象中,該 UDP 數(shù)據(jù)包的第一個分片會發(fā)出一個 ARP 查詢請求,,所有的分片都會等到這個查詢完成以后再發(fā)送。事實上是這樣嗎?
結果是:某些系統(tǒng)會讓每一個分片都發(fā)送一個 ARP 查詢,所有的分片都在等待,但是接受到第一個回應的時候,主機卻只發(fā)送了最后一個數(shù)據(jù)片而拋棄了其他,這實在是讓人匪夷所思。這樣,因為分片的數(shù)據(jù)不能被及時組裝,接受主機將會在一段時間內將永遠無法組裝的 IP 數(shù)據(jù)包拋棄,并且發(fā)送組裝超時的 ICMP 報文(其實很多系統(tǒng)不產(chǎn)生這個差錯),以保證接收主機自己的接收端緩存不被那些永遠得不到組裝的分片滿。
ICMP 源站抑制差錯
當目標主機的處理速度趕不上數(shù)據(jù)接收的速度,因為接受主機的 IP 層緩存會被占滿,所以主機就會發(fā)出一個“我受不了”的一個 ICMP 報文。
UDP 服務器設計
UDP 協(xié)議的某些特性將會影響我們的服務器程序設計,大致總結如下:
?
- 關于客戶IP和地址:服務器必須有根據(jù)客戶IP地址和端口號判斷數(shù)據(jù)包是否合法的能力(這似乎要求每一個服務器都要具備)
- 關于目的地址:服務器必須要有過濾廣播地址的能力。
- 關于數(shù)據(jù)輸入:通常服務器系統(tǒng)的每一個端口號都會和一塊輸入緩沖區(qū)對應,進來的輸入根據(jù)先來后到的原則等待服務器的處理,所以難免會出現(xiàn)緩沖區(qū)溢出的問題,這種情況下,UDP 數(shù)據(jù)包可能會被丟棄,而應用服務器程序本身并不知道這個問題。
- 服務器應該限制本地IP地址,就是說它應該可以把自己綁定到某一個網(wǎng)絡接口的某一個端口上。
總結
以上是生活随笔為你收集整理的《TCP/IP详解》学习笔记(六):UDP 协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: persfw.exe是什么进程 pers
- 下一篇: pg_ctl.exe进程是什么文件 pg