什么是UDP協(xié)議?
User Datagram Protocal 屉更,用戶數(shù)據(jù)報協(xié)議徙融,它跟TCP協(xié)議不同,TCP協(xié)議是基于流的瑰谜,發(fā)送的數(shù)據(jù)跟IP數(shù)據(jù)報個數(shù)無關欺冀。而UDP數(shù)據(jù)則直接封裝成IP數(shù)據(jù)報發(fā)送(當然,如果UDP數(shù)據(jù)過長萨脑,會導致IP數(shù)據(jù)報分片發(fā)送)隐轩。所以UDP是簡單的基于IP數(shù)據(jù)報的傳輸,而IP數(shù)據(jù)報的傳輸是不保證可到達渤早,不保證傳輸順序职车,所以UDP不提供任何的可靠性。
首部格式
- 「Source port」 源端口號,可選的悴灵,如果不用可全部置0.如果喜歡接收方能回復扛芽,則源端口號很重要,要不然別人也不知道回復哪個端口称勋,我們知道胸哥,系統(tǒng)內核是通過端口號來映射應用程序的
- 「Destination port」 和「 「Source port」 一樣的語義,通過指定接收方的端口號來指定特定應用程序接收到此UDP數(shù)據(jù)報
- 「Length」 指UDP數(shù)據(jù)報的長度赡鲜,注意空厌,包括「首部」 和 「數(shù)據(jù)報內容」 的總長度
-
「Check sum」 檢驗和,和 「IP」 檢驗和一樣银酬,不同的是UDP的檢驗和針對首部和內容全部計算得出檢驗和嘲更。
*「Data octets」 UDP數(shù)據(jù)報內容,可以為空
UDP協(xié)議格式
IP分片
前面已經說過揩瞪,UDP協(xié)議是基于IP協(xié)議的簡單封裝赋朦,而IP協(xié)議對應的鏈路層有MTU的概念 ,即物理鏈路傳輸數(shù)據(jù)時有最大傳輸單元限制李破,這樣當IP數(shù)據(jù)包長送的時候宠哄,會將MTU和當前的數(shù)據(jù)包長度進行比較,如果必要嗤攻,則要進行IP分片傳輸毛嫉。我們知道,以太網(wǎng)鏈路層的MTU是1500妇菱,則每次傳輸?shù)淖畲髷?shù)據(jù)不能超過1500字節(jié)(byte)承粤,如果超過了就要進行分片傳輸。
上圖所描述的示例中闯团,如果我們發(fā)送一個超過了MTU長度的UDP數(shù)據(jù)辛臊,比如1473字節(jié),加上IP首部20字節(jié)和UDP首部8個字節(jié)房交,即1501字節(jié)彻舰,它比以太網(wǎng)鏈路層的MTU:1500多1個字節(jié),所以要進行IP分片后傳輸涌萤。分片的第一個分組包含了UDP首部(8個字節(jié))和UDP數(shù)據(jù)(1472)個字節(jié)淹遵。第二個分組只包含了UDP數(shù)據(jù)的最后一個字節(jié)內容。我們可以了解到负溪,對于分片發(fā)送的UDP數(shù)據(jù),只有第一個分組擁有UDP首部的信息济炎,如果所有的分組中第一片分組丟失的話川抡,則所有分組都要丟棄,因我們知道UDP首部中包含了重要的信息,如「Destination port」崖堤,如果不知道目的地端口號侍咱,則系統(tǒng)不知道將該數(shù)據(jù)交給哪個應用程序去處理。所以密幔,利用UDP傳輸?shù)膽贸绦蛐ǜ瑧摽刂茢?shù)據(jù)報的升序,盡量避免分片進行胯甩。
關于接收端在接收到一個IP數(shù)據(jù)報的分片數(shù)據(jù)時昧廷,如果進行重組,即把所有分片數(shù)據(jù)再次按順序組合起來呢偎箫,這就要利用IP首部中一些字段標識木柬,我們一起來復習下前面文章中的IP協(xié)議:
- Identification(唯一標識): 每一個IP數(shù)據(jù)報都要有唯一的標識字段,這樣在分片和重組時不至于混淆兩個完全不同的分片數(shù)據(jù)淹办。就是說眉枕,一個IP數(shù)據(jù)報分片后隧出,每個分片的IP首部中录别,該字段相同,這樣接收端就知道這些分片來自一個數(shù)據(jù)報
- Flages(標志): 這個字段也是為IP數(shù)據(jù)報的分片和重組作用的锋爪。用于標識收到的分片后續(xù)是否還有分片待接收副硅。1代表后續(xù)還有分處姥宝,0代表分片結束,所以最后一個分片該值為0
- Fragment offset(分片偏移):指當前分片數(shù)據(jù)在整體IP數(shù)據(jù)報中所處的偏移量想许,以8字節(jié)(64比特)為單位伶授。由此可見,「identification」,「Flages」,「Fragment offset」這三個字段是為IP數(shù)據(jù)報分片和重組功能作用的字段