UDP 和 TCP 的不同
TCP 在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。
TCP 不提供廣播或多播服務(wù),由于 TCP 要提供可靠的、面向連接的運(yùn)輸服務(wù),因此不可避免地增加了許多的開銷,如確認(rèn)、流量控制、計(jì)時器以及連接管理等。
而 UDP 在傳送數(shù)據(jù)之前不需要先建立連接。接收方收到 UDP 報(bào)文之后,不需要給出任何確認(rèn)。
雖然 UDP 不提供可靠交付,但在某些情況下 UDP 卻是一種最有效的工作方式。
簡單來說就是:
UDP:單個數(shù)據(jù)報(bào),不用建立連接,簡單,不可靠,會丟包,會亂序;
TCP:流式,需要建立連接,復(fù)雜,可靠 ,有序。
UDP 概述
UDP 全稱 User Datagram Protocol, 與 TCP 同是在網(wǎng)絡(luò)模型中的傳輸層的協(xié)議。
UDP 的主要特點(diǎn)是:
無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接,因此減少了開銷和發(fā)送數(shù)據(jù)之前的時延。
不保證可靠交付,因此主機(jī)不需要為此復(fù)雜的連接狀態(tài)表
面向報(bào)文的,意思是 UDP 對應(yīng)用層交下來的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界,在添加首部后向下交給 IP 層。
沒有阻塞控制,因此網(wǎng)絡(luò)出現(xiàn)的擁塞不會使發(fā)送方的發(fā)送速率降低。
支持一對一、一對多、多對一和多對多的交互通信,也即是提供廣播和多播的功能。
首部開銷小,首部只有 8 個字節(jié),分為四部分。
UDP 的常用場景:
名字轉(zhuǎn)換(DNS)
文件傳送(TFTP)
路由選擇協(xié)議(RIP)
IP 地址配置(BOOTP,DHTP)
網(wǎng)絡(luò)管理(SNMP)
遠(yuǎn)程文件服務(wù)(NFS)
IP 電話
流式多媒體通信
UDP 報(bào)文結(jié)構(gòu)
UDP 數(shù)據(jù)報(bào)分為數(shù)據(jù)字段和首部字段。
首部字段只有 8 個字節(jié),由四個字段組成,每個字段的長度是 2 個字節(jié)。

首部各字段意義:
源端口:源端口號,在需要對方回信時選用,不需要時可全 0.
目的端口:目的端口號,在終點(diǎn)交付報(bào)文時必須要使用到。
長度:UDP 用戶數(shù)據(jù)報(bào)的長度,在只有首部的情況,其最小值是 8 。
檢驗(yàn)和:檢測 UDP 用戶數(shù)據(jù)報(bào)在傳輸中是否有錯,有錯就丟棄。
UDP 如何進(jìn)行校驗(yàn)和
偽首部
UDP 數(shù)據(jù)報(bào)首部中檢驗(yàn)和的計(jì)算方法比較特殊。
在計(jì)算檢驗(yàn)和時,要在數(shù)據(jù)報(bào)之前增加 12 個字節(jié)的偽首部,用來計(jì)算校驗(yàn)和。
偽首部并不是數(shù)據(jù)報(bào)真正的首部,是為了計(jì)算校驗(yàn)和而臨時添加在數(shù)據(jù)報(bào)前面的,在真正傳輸?shù)臅r候并不會把偽首部一并發(fā)送。

偽首部個字段意義:
第一字段,源 IP 地址
第二字段,目的 IP 地址
第三字段,字段全 0
第四字段,IP 首部中的協(xié)議字段的值,對于 UDP,此字段值為 17
第五字段,UDP 用戶數(shù)據(jù)報(bào)的長度
校驗(yàn)和計(jì)算方法
校驗(yàn)和的計(jì)算中,頻繁用到了二進(jìn)制的反碼求和運(yùn)算,運(yùn)算規(guī)則見下:
二進(jìn)制反碼求和運(yùn)算
0 + 0 = 0
1 + 0 = 0 + 1 = 1
1 + 1 = 10
其中 10 中的 1 加到了下一列去,如果是最高列的 1 + 1 ,那么得到的 10 留下 0 , 1 移到最低列,與最低位再做一次二進(jìn)制加法即可。
檢驗(yàn)和計(jì)算過程
把首部的檢驗(yàn)和字段設(shè)置為全 0
把偽首部以及數(shù)據(jù)段看成是許多 16 位的字串接起來。
若數(shù)據(jù)段不是偶數(shù)個字節(jié),則填充一個全 0 字節(jié),但是這個字節(jié)不發(fā)送。
通過二進(jìn)制反碼運(yùn)算,計(jì)算出 16 位字的和。
讓第一行和第二行做二進(jìn)制反碼運(yùn)算。
將第一行和第二行的結(jié)果與第三行做二進(jìn)制反碼計(jì)算,以此類推。
最后運(yùn)算結(jié)果取反,得到校驗(yàn)和。
把計(jì)算出來的校驗(yàn)和值,填入首部校驗(yàn)和字段。
接收方收到數(shù)據(jù)報(bào)之后,按照同樣的方法計(jì)算校驗(yàn)和,如果有差錯,則丟棄這個數(shù)據(jù)報(bào)。
可以看出校驗(yàn)和,既檢查了 UDP 用戶數(shù)據(jù)報(bào)的源端口號和目的端口號以及數(shù)據(jù)報(bào)的數(shù)據(jù)部分,又檢查了 IP 數(shù)據(jù)報(bào)的源 IP 地址和目的地址。
一個校驗(yàn)和例子假設(shè)一個 UDP 數(shù)據(jù)報(bào):

各字段以二進(jìn)制表示:
1001 1001 0001 0011 //偽首部源IP地址前16位,值:153.19
0000 1000 0110 1000 //偽首部源IP地址后16位,值:8.104
1010 1011 0000 0011 //偽首部目的IP地址前16位,值:171.3
0000 1110 0000 1011 //偽首部目的IP地址后16位,值:14.11
0000 0000 0001 0001 //偽首部UDP協(xié)議字段代表號,值:17
0000 0000 0000 1111 //偽首部UDP長度字段,值:15
0000 0100 0011 1111 //UDP頭部源IP地址對應(yīng)的進(jìn)程端口號,值:1087
0000 0000 0000 1101 //UDP頭部目的IP地址對應(yīng)的進(jìn)程端口號,值:13
0000 0000 0000 1111 //UDP頭部UDP長度字段,值:15
0000 0000 0000 0000 //UDP頭部UDP檢驗(yàn)和,值:0
0101 0100 0100 0101 //數(shù)據(jù)字段
0101 0011 0101 0100 //數(shù)據(jù)字段
0100 1001 0100 1110 //數(shù)據(jù)字段
0100 0111 0000 0000 //數(shù)據(jù)字段+填充0字段
按照二進(jìn)制反碼運(yùn)算求和,結(jié)果:10010110 11101101
結(jié)果求反碼得出校驗(yàn)和:01101001 00010010