UDP是什麼?
UDP是一個簡單的面向數據報的傳輸層協議,產生的數據包封裝成IP報之後經過網絡層,數據鏈路層層層傳遞
UDP的特點
- UDP是數據報不是流,所以不會像TCP那樣有分包的概念,不管數據包是怎麼樣的就直接發送出去。所以纔會產生IP分片,而TCP會進行流量控制,會分包組合,所以一般不會導致很多的IP分片產生
- UDP不提供可靠性,直接發出去也不會再去保留,只能算是盡力交付
UDP主要的三大應用
- 查詢類:DNS等 要求就是快快快 並行查詢要快
- 數據和傳輸 TFTP(巨慢,因爲要應用層這邊做確認數據)
- 嵌入式無盤工作站 因爲沒有那麼大地方存數據緩存,所以UDP發送出去就刪掉數據
- 視頻數據流 支持廣播和多播 丟包沒影響的,而且數據量大還要快的
UDP校驗和
- 覆蓋UDP的頭部以及UDP的數據。與此不同的是,IP首部的校驗和,只覆蓋IP頭部
- UDP數據可以出現奇數,但是由於校驗和都是16bit字節相加的所以需要補上一些0在後面,只爲了校驗,不會傳輸過去
- UDP數據報與TCP數據報都包含一個12字節的僞首部,要對前面的IP頭部等等進行校驗,爲首不包含IP地址,只要IP地址唄NAT修改,每次MD5的校驗出來的哈希值就不會一致
- 送出的數據報與接收數據報具有相同的校驗和,說明只是原地址和目標地址交換了位置,最後校驗出來的結果都是一樣的
- 但是如果採用哈希校驗的話就必須所有位都是一致的不能有改變
IP分片
IP分片的步驟
- IP首先會與MTU數據長度進行比較
- 如果需要分片,分片可能會出現在主機或者是路由器,對於協議本身來說網絡層的分片是透明的。
- UDP的數據包結構裏面是由表示分片與否的標誌位的
- 最前面是16位的標識們對於發送端發送過來的每一份IP數據來說,其中的標識符包含唯一的值,這個值被複制到每一個分片內部。
- 接着3位就是標誌位 第一個CU基本不用
- DF代表不分片位,置爲1代表着進制分片直接丟棄並且返回一個ICMP的報文,報文內部包含路由器的mtu大小,用來調整包的大小。
- MF代表着更多分片位,如果爲0代表是最後一個分片。後面13位是記錄片偏移位的地方,爲了組合的時候找到自己的位置。
分片的規則
分片應該是數據量(不包含頭部)小於MTU並且爲8的整數倍
回顯echo
回顯數據前後的數據包大小必須是一致的,而且惡臭設置DF爲。echo-replay其實也會複製相應的設置。一個連接的暢通要保證來回都是通的,有的時候網絡不通其實不是去的時候不通而是,回來的時候沒用通。
路徑MTU
如果想要實現不分片,就需要將數據包限制爲路徑上最小的MTU(路徑MTU)
可以使用Tracetoute來查看路徑MTU,就是逐漸減少直到通過所有的路由設備,不斷去測試得到最小的路徑MTU
VPN這種虛擬的連接方式的MTU其實會小於路由器實際的MTU,因爲一個VPN的數據包是要在前面加上一個VPN的頭部,所以還會佔用一部分的空間。
UDP與ARP之間交互作用
假設我們需要發送一個很大很大的包,這個包會分成六片發送過來。但是發現底層的MAC地址還沒有找到,所以還會發送ARP請求,每一個片發送一個ARP請求,就是六個ARP的請求。但是當ARP解析之後只會將最後一個分片發過來。
除非接收到第一個數據包分片,不然是不會出發ICMP的報文的。
最大UDP數據報長度
IP數據包的最大長度爲65535但是實際上卻沒有這麼大,主要有三個原因
- 程序接口的限制,socket API設置了接受與發送緩存的大小。
- 來自於內核對TCP IP協議族的實現過程
- 與源端和目的端的實現有關
數據報截斷
ip可以發送特定長度的數據包,但是不意味着接收應用程序都可以接收這些數據,若是接收的數據大小大於應用程序的限制大小,後果取決於不同的API接口的實現
源站抑制ICMP(中間路由發送)
由於路由器緩存快滿了,希望發送端那邊減小發送速度,但是一般來說UDP會忽略源站抑制信息,而TCP則更傾向於希望收到這個包
廣播與多播
3種IP地址:單播地址、廣播地址、多播地址
廣播和多播只有UDP可以實現,將報文發送給多個接收者們。
一個主機要向網上所有其他的主機發送廣播幀
在操作系統角度分析廣播爲啥不好?
網卡有兩個模式
普通模式:接收屬於自己的包,單播,多播、廣播都可以
混合模式:爲了抓包而設計的模式:抓寶時,不管是否爲自己的包都統統抓過來
數據包的傳遞過程
物理層
網卡校驗數據對不上校驗和直接丟棄
設備驅動程序
- 幀類型中必須要指定使用的協議,IP,ARP等等
- 進行多播過濾來檢查是否數據多播組 (不在組內,多播包就此停止,但是廣播包此時還是不知道)
網絡層走IP協議
根據IP地址中的源地址和目的地址進行更多的過濾檢測,但是也不能判斷是否屬於廣播對象
UDP協議層
收到IP發送過來的數據還需要檢查端口號並且檢查什麼程序正在監聽這個端口,之後如果沒有的話就會丟棄,入股有的華就會交付。
廣播的包不僅發的範圍廣,而且每一次判斷都要走到傳輸層纔可以知道是否是廣播的對象,所以解包的層數就多了很多。