相比于TCP協(xié)議(傳輸控制協(xié)議)來說,UDP協(xié)議(用戶數(shù)據(jù)報協(xié)議)要簡單很多蕊连。
UDP協(xié)議的首部格式
UDP協(xié)議的首部有8個字節(jié)深滚,一共四個字段,每個字段的長度都是2個字節(jié)仪缸。
1.16位源端口號:發(fā)送方的端口號辅鲸,不用的話可以置0
2.16位目的端口號:接受方的端口號。
3.16位UDP長度:首部 + 數(shù)據(jù)的總長度腹殿,單位為字節(jié)独悴。也就是說一個UDP能傳輸?shù)臄?shù)據(jù)最大長度是64K(包含UDP首部);然而我們需要傳輸?shù)臄?shù)據(jù)超過64K锣尉,就需要在應用層手動的分包刻炒,多次發(fā)送,并在接收端手動拼裝自沧。
4.16位UDP檢驗和:是為了接收方進行數(shù)據(jù)校驗設計的坟奥,如果校驗不通過的話數(shù)據(jù)會被丟棄树瞭,后面會單獨講解。當源主機不想計算校驗和爱谁,則直接令該字段全為0.
UDP的特點
1.無連接:UDP是無連接的協(xié)議晒喷,他在進行數(shù)據(jù)傳輸之前不需要先建立連接,也沒有各種重傳機制访敌、擁塞控制和流量控制凉敲,所以傳輸速度很快,消耗很低寺旺,延遲小爷抓,數(shù)據(jù)傳輸效率高,適合對可靠性要求不高的應用程序阻塑,或者可以保障可靠性的應用程序蓝撇,如DNS、TFTP陈莽、SNMP等渤昌。
2.不可靠:只負責數(shù)據(jù)的發(fā)送,不關心數(shù)據(jù)是否送達走搁,沒有確認機制独柑,主機收到數(shù)據(jù)也不會有響應
3.分組首部開銷小,TCP的首部是20字節(jié)朱盐,UDP的首部是8字節(jié)
4.面向報文的:TCP(面向連接的傳輸控制協(xié)議)是面向字節(jié)傳輸群嗤,而UDP是面向報文傳輸菠隆,對于應用層交下來的報文段不進行拆分合并兵琳,直接保留原有報文段的邊界然后添加UDP的首部就交付給網(wǎng)絡層。不論報文的長短骇径,UDP都不會進行處理躯肌。因此為了避免報文段過短降低傳輸效率以及報文段過長導致網(wǎng)絡層對IP數(shù)據(jù)進行分片操作,應用層應該選擇合適長度的報文交付給運輸層的UDP破衔。
協(xié)議對比
UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實現(xiàn)信息的可靠傳遞方面不同清女。TCP協(xié)議中包含了專門的傳遞保證機制,當數(shù)據(jù)接收方收到發(fā)送方傳來的信息時晰筛,會自動向發(fā)送方發(fā)出確認消息嫡丙;發(fā)送方只有在接收到該確認消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認信息為止读第。與TCP不同曙博,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)包的丟失怜瞒,協(xié)議本身并不能做出任何檢測或提示父泳。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。
TCP 是面向連接的傳輸控制協(xié)議惠窄,而UDP 提供了無連接的數(shù)據(jù)報服務蒸眠;TCP 具有高可靠性,確保傳輸數(shù)據(jù)的正確性杆融,不出現(xiàn)丟失或亂序楞卡;UDP 在傳輸數(shù)據(jù)前不建立連接,不對數(shù)據(jù)報進行檢查與修改擒贸,無須等待對方的應答臀晃,所以會出現(xiàn)分組丟失、重復介劫、亂序徽惋,應用程序需要負責傳輸可靠性方面的所有工作;UDP 具有較好的實時性座韵,工作效率較 TCP 協(xié)議高险绘;UDP 段結構比 TCP 的段結構簡單,因此網(wǎng)絡開銷也小誉碴。TCP 協(xié)議可以保證接收端毫無差錯地接收到發(fā)送端發(fā)出的字節(jié)流宦棺,為應用程序提供可靠的通信服務。對可靠性要求高的通信系統(tǒng)往往使用 TCP 傳輸數(shù)據(jù)黔帕。 [6]
TCP面向字節(jié)流和UDP面向報文的區(qū)別
TCP面向字節(jié)流
打個比方比喻TCP代咸,你家里有個蓄水池,你可以里面倒水成黄,蓄水池上有個龍頭矛物,你可以通過龍頭將水池里的水放出來润脸,然后用各種各樣的容器裝(杯子践盼、礦泉水瓶环础、鍋碗瓢盆)接水。
上面的例子中闻伶,往水池里倒幾次水和接幾次水是沒有必然聯(lián)系的滨攻,也就是說你可以只倒一次水,然后分10次接完蓝翰。另外光绕,水池里的水接多少就會少多少;往里面倒多少水畜份,就會增加多少水诞帐,但是不能超過水池的容量,多出的水會溢出漂坏。
結合TCP的概念景埃,水池就好比接收緩存媒至,倒水就相當于發(fā)送數(shù)據(jù),接水就相當于讀取數(shù)據(jù)谷徙。好比你通過TCP連接給另一端發(fā)送數(shù)據(jù)拒啰,你只調(diào)用了一次write,發(fā)送了100個字節(jié)完慧,但是對方可以分10次收完谋旦,每次10個字節(jié);你也可以調(diào)用10次write屈尼,每次10個字節(jié)册着,但是對方可以一次就收完。(假設數(shù)據(jù)都能到達)但是脾歧,你發(fā)送的數(shù)據(jù)量不能大于對方的接收緩存(流量控制)甲捏,如果你硬是要發(fā)送過量數(shù)據(jù),則對方的緩存滿了就會把多出的數(shù)據(jù)丟棄鞭执。
UDP面向報文
UDP和TCP不同司顿,發(fā)送端調(diào)用了幾次write,接收端必須用相同次數(shù)的read讀完兄纺。UPD是基于報文的大溜,在接收的時候,每次最多只能讀取一個報文估脆,報文和報文是不會合并的钦奋,如果緩沖區(qū)小于報文長度,則多出的部分會被丟棄疙赠。也就說付材,如果不指定MSG_PEEK標志,每次讀取操作將消耗一個報文棺聊。
原因
其實伞租,這種不同是由TCP和UDP的特性決定的贞谓。TCP是面向連接的限佩,也就是說,在連接持續(xù)的過程中裸弦,socket中收到的數(shù)據(jù)都是由同一臺主機發(fā)出的(劫持什么的不考慮)祟同,因此,知道保證數(shù)據(jù)是有序的到達就行了理疙,至于每次讀取多少數(shù)據(jù)自己看著辦晕城。
而UDP是無連接的協(xié)議,也就是說窖贤,只要知道接收端的IP和端口砖顷,且網(wǎng)絡是可達的贰锁,任何主機都可以向接收端發(fā)送數(shù)據(jù)。這時候滤蝠,如果一次能讀取超過一個報文的數(shù)據(jù)豌熄,則會亂套。比如物咳,主機A向發(fā)送了報文P1锣险,主機B發(fā)送了報文P2,如果能夠讀取超過一個報文的數(shù)據(jù)览闰,那么就會將P1和P2的數(shù)據(jù)合并在了一起芯肤,這樣的數(shù)據(jù)是沒有意義的。
UDP的首部校驗
校驗的時候需要在UDP數(shù)據(jù)報之前增加12字節(jié)的偽首部压鉴,偽首部僅僅是為了計算校驗和崖咨,并不是是真實存在的數(shù)據(jù)結構。他會從網(wǎng)絡層獲取到源IP地址和目的IP地址然后結合自己的UDP長度進行校驗油吭。這樣既檢查了UDP數(shù)據(jù)報掩幢,又對IP數(shù)據(jù)報的源地址和目的IP地址進行了檢驗。
UDP校驗和的計算方法和IP數(shù)據(jù)報首部校驗的計算方法很相似上鞠,都是用二進制反碼運算求和再取反际邻,但是IP數(shù)據(jù)報只是對IP數(shù)據(jù)報的頭部進行校驗,UDP的校驗是把首部和數(shù)據(jù)部分一起校驗芍阎。
發(fā)送方世曾,首先是把全零放入校驗和字段并且添加偽首部,然后把UDP數(shù)據(jù)報看成是由許多16位的子串連接起來谴咸,若UDP數(shù)據(jù)報的數(shù)據(jù)部分不是偶數(shù)個字節(jié)轮听,則要在數(shù)據(jù)部分末尾增加一個全零字節(jié)(此字節(jié)不發(fā)送),接下來就按照二進制反碼計算出這些16位字的和岭佳。將此和的二進制反碼寫入校驗和字段血巍。在接收方,把收到得UDP數(shù)據(jù)報加上偽首部(如果不為偶數(shù)個字節(jié)珊随,還需要補上全零字節(jié))后述寡,按二進制反碼計算出這些16位字的和。當無差錯時其結果全為1,叶洞。否則就表明有差錯出現(xiàn)鲫凶,接收方應該丟棄這個UDP數(shù)據(jù)報。
1.校驗時衩辟,如果UDP數(shù)據(jù)報部分的長度不是偶數(shù)個字節(jié)則會填入一個全0字節(jié)螟炫,但是填入的這個字節(jié)是不發(fā)送的。
2.如果接收方計算出的校驗和不一致艺晴,那么可以丟棄也可以交付上層昼钻,但是要附上錯誤報告掸屡,告訴上層這是錯誤的數(shù)據(jù)報。
3.偽首部的校驗可以同時校驗端口號和IP地址
這種差錯校驗的驗錯能力不強然评,但是簡單速度快折晦。
應用
UDP也常用于多媒體應用(如IP電話,實時視頻會議沾瓦,流媒體等)數(shù)據(jù)的可靠傳輸對他們而言并不重要满着,TCP的擁塞控制會使他們有較大的延遲,也是不可容忍的
應用層協(xié)議DNS(域名服務)贯莺、DHCP(動態(tài)主機配置協(xié)議)风喇、TFTP(簡單文件傳輸協(xié)議)、SNMP(簡單網(wǎng)絡管理協(xié)議)缕探、RIP(路由信息協(xié)議)傳輸層協(xié)議都是采用的UDP協(xié)議魂莫。
應用層協(xié)議FTP(文件傳輸協(xié)議)、Telnet(遠程終端協(xié)議)爹耗、SMTP(簡單郵件傳輸協(xié)議)耙考、HTTP(超文本傳輸協(xié)議)、BGP(邊界網(wǎng)關協(xié)議)傳輸層協(xié)議采用的是TCP協(xié)議潭兽。
相關閱讀:
TCP面向字節(jié)流和UDP面向報文的區(qū)別
【網(wǎng)絡】傳輸層協(xié)議——UDP協(xié)議
百度百科
UDP協(xié)議的詳細解析