溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

發(fā)布時間:2022-02-18 15:16:43 來源:億速云 閱讀:570 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸”吧!

UDP是一個簡單的面向數(shù)據(jù)報的傳輸層協(xié)議,產(chǎn)生的數(shù)據(jù)包封裝成IP報之后經(jīng)過網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層層層傳遞

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

什么是UDP?

UDP是User Datagram Protocol(用戶數(shù)據(jù)報協(xié)議)的縮寫,它是一個簡單的協(xié)議,簡單到UDP規(guī)范RFC0768只有區(qū)區(qū)3頁。

UDP是工作在IP層之上的傳輸層協(xié)議,UDP對IP主要有兩個擴展:

擴展出端口號使得IP數(shù)據(jù)報可以多路分發(fā)到用戶進程。擴展出校驗和提供網(wǎng)絡(luò)傳輸過程中數(shù)據(jù)差錯的檢驗。IP提供了一種盡力而為、無連接的數(shù)據(jù)報交付服務(wù)。IP基于IP地址實現(xiàn)路由和分組轉(zhuǎn)發(fā),可以將一個IP數(shù)據(jù)報從網(wǎng)絡(luò)的一臺主機傳送到另一臺主機,IP地址決定IP數(shù)據(jù)報將被送往哪個主機。所以,IP提供主機到主機的數(shù)據(jù)報傳輸服務(wù)。

IP數(shù)據(jù)報到達目的主機后,內(nèi)核層實現(xiàn)的IP模塊,會負責接收網(wǎng)卡上的IP數(shù)據(jù)報,但主機上通常會同時運行多個進程,IP數(shù)據(jù)報應(yīng)該交給哪個進程去處理呢?IP搞不定。

端口號(位于UDP首部)決定數(shù)據(jù)報交給主機上的哪個進程處理。所以,UDP為端主機上運行的應(yīng)用程序提供了端到端服務(wù)。

UDP的特征

UDP是無連接的,通信之前無須建連便可直接發(fā)送數(shù)據(jù)報,而TCP是面向連接的。UDP不提供差錯糾正,但UDP提供差錯檢測(端到端校驗和)。UDP不做重復(fù)消除。UDP不做流量控制。UDP不做擁塞控制,沒有協(xié)議機制防止高速UDP流量對其他網(wǎng)絡(luò)用戶的消極影響。UDP不保證順序,數(shù)據(jù)報遞交應(yīng)用的順序。UDP不可靠,UDP只負責把應(yīng)用程序傳給IP層的數(shù)據(jù)發(fā)送出去,并不能保證數(shù)據(jù)報到達目的地,可靠傳遞需要應(yīng)用程序去實現(xiàn)。UDP支持組播交付。UDP是一種保留消息邊界的傳輸層協(xié)議。

消息邊界

應(yīng)用程序每請求一次UDP輸出將產(chǎn)生一個UDP數(shù)據(jù)報,從而發(fā)送一個IP數(shù)據(jù)報,而接收端每請求一次UDP接收都將接收一個完整的UDP報(如果有),這跟面向數(shù)據(jù)流的TCP不一樣。

假設(shè)主機A給主機B發(fā)送2次數(shù)據(jù),第一次4字節(jié)“abcd”,第二次3字節(jié)“xyz”,而主機B接收2次,分別返回“abcd”、“xyz”兩個消息,也可以返回“xyz”,“abcd”兩個消息(順序不重要),那么這就是保留消息邊界。

UDP是保留消息邊界的傳輸層協(xié)議,利用UDP通信的應(yīng)用程序每次發(fā)送操作會產(chǎn)生一個IP數(shù)據(jù)報(不考慮分片),這就約束每次發(fā)送的數(shù)據(jù)量不能大于MTU(最大傳輸單元),接收端每次接收都會返回一個個UDP數(shù)據(jù)報的完整負載,不會出現(xiàn)返回半個數(shù)據(jù)報負載的情況。

而TCP是不保留消息邊界的流協(xié)議,發(fā)送端調(diào)用發(fā)送的次數(shù)和每次發(fā)送的數(shù)據(jù)量,跟接收端調(diào)用接收的次數(shù)和每次接收的數(shù)據(jù)量,沒有任何對應(yīng)關(guān)系,所以使用TCP的應(yīng)用程序需要去處理消息邊界。

UDP數(shù)據(jù)報封裝格式

IPv4協(xié)議(Protocol)字段用值17來標識UDP,UDP數(shù)據(jù)報頭部通常是8字節(jié),IPv4頭部之后緊接著是UDP頭部,然后是UDP數(shù)據(jù)Payload(如有)。

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

IPv4封裝包對應(yīng)的UDP頭部由源端口號、目的端口號、長度、校驗和組成,每個字段都是2字節(jié)。1、端口號,純抽象的標識,它不跟任何物理實體相關(guān)端口號用于幫助協(xié)議分辨發(fā)送和接收進程。接收端的內(nèi)核層從網(wǎng)卡接收到IP數(shù)據(jù)報之后,識別出UDP數(shù)據(jù)報(IP數(shù)據(jù)報頭部協(xié)議字段值=17)之后,會根據(jù)UDP頭部的目的端口號,映射到對應(yīng)進程,把UDP數(shù)據(jù)報交給對應(yīng)的進程去處理,這個映射關(guān)系由系統(tǒng)內(nèi)核管理維護。

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

目的端口號是必須的,但源端口號是可選的,如果數(shù)據(jù)報發(fā)送者不需要對方回復(fù)的話,則源端口號可被設(shè)置為0。

因為IP層根據(jù)IP頭部的協(xié)議類型字段,將進入的IP數(shù)據(jù)報,分發(fā)到特定的傳輸協(xié)議(TCP或UDP等),到了傳輸協(xié)議層,再根據(jù)端口號將協(xié)議數(shù)據(jù)分發(fā)到不同進程。所以,端口號是協(xié)議獨立的,不同協(xié)議的相同端口號并不會引起分發(fā)混亂。

比如,一臺機器上的兩個網(wǎng)絡(luò)服務(wù)進程使用相同的IP地址和端口號,但一個使用TCP協(xié)議,另一個使用UDP協(xié)議,這樣是沒有問題。

2、長度字段,是以字節(jié)為單位的UDP頭部和UDP數(shù)據(jù)的總長度,因為UDP頭部長度為8,且空數(shù)據(jù)的UDP數(shù)據(jù)報是允許的,這意味著該長度字段值最小為8。UDP長度值是冗余的,因為可以通過IP數(shù)據(jù)報的總長度減去IP首部的長度推導出來。

3、校驗和,覆蓋了UDP首部、UDP數(shù)據(jù)和一個偽首部,由初始發(fā)送方計算,由最終目的方校驗,用于判斷數(shù)據(jù)報在網(wǎng)絡(luò)傳輸過程中是否出錯,比如某一位從1變成了0。

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

眾所周知,UDP不可靠、不保證順序。

1、什么叫不可靠?A給B發(fā)送一個UDP數(shù)據(jù)報,該UDP數(shù)據(jù)報不一定被正確交付給接收端B,但因為網(wǎng)絡(luò)質(zhì)量等各種原因,可能丟包,IP數(shù)據(jù)報是盡力而為的交付,一切隨緣。

有沒有辦法保證,發(fā)送的UDP一定到達目的端?Sorry,保證不了,做不到。

那TCP提供的可靠傳輸是什么意思?TCP提供的可靠傳輸并不是指不丟包,因為TCP也依賴IP(IP不可靠)實現(xiàn)數(shù)據(jù)報交付,TCP的可靠性是指丟掉的包會被重傳,直到被正確投遞,才會繼續(xù)傳輸下一個數(shù)據(jù)報。

那TCP是怎么做到可靠傳輸?shù)哪?很簡單,收報確認(ack)+丟包重傳。所以UDP如果要提供可靠傳輸,也可以參考TCP的實現(xiàn)機制,只是TCP是實現(xiàn)在內(nèi)核層,而基于UDP的應(yīng)用程序,可以把可靠傳輸做到應(yīng)用層。要做收報確認+丟包重傳,需要一些額外的信息,比如包序列號之類,可以放到Payload,約定好這些額外信息在Payload中的結(jié)構(gòu)布局即可。

2、什么叫不保證順序?A給B發(fā)送兩個UDP數(shù)據(jù)報,兩個UDP數(shù)據(jù)報會被封裝為兩個IP數(shù)據(jù)報,通過IP協(xié)議傳輸,因為兩個IP數(shù)據(jù)報獨立路由,所以哪個先到?不一定,看心情。

有沒有辦法保證,UDP數(shù)據(jù)報按照發(fā)送端發(fā)送的時間順序到達目的端?也Sorry,辦不到。

所以,TCP提供的順序性,其實只是在接收端對IP數(shù)據(jù)報根據(jù)發(fā)送順序重新排序,很顯然,UDP要支持重排序,也需要一些額外信息,也只能通過payload攜帶,而不能像TCP一樣(TCP首部的一些字段用于接收端重排序)。

綜上,UDP只提供最簡單端主機上應(yīng)用程序的端到端服務(wù),其他的特性,如果要提供,那請參考TCP的思路去實現(xiàn)吧。

這是有好處的:因為簡單,所以開銷很小。而某些應(yīng)用場景,可以容忍丟包、亂序,UDP就是很適合的。保時捷是很好,但拉磚還是用拖拉機吧。

UDP Socket網(wǎng)絡(luò)編程的API不多,socket()用于創(chuàng)建套接字,close()用于關(guān)閉套接字,sendto()用于發(fā)送數(shù)據(jù),recvfrom()用于接收數(shù)據(jù)。

bind()顧名思義是綁定,TCP可以綁定,UDP也可以,bind用于UDP等于告訴內(nèi)核:這個套接字跟網(wǎng)絡(luò)遠端的一個

而沒有bind之前,只能通過sendto()接口(通過參數(shù)指定目的地)。UDP套接字recv()返回的是UDP數(shù)據(jù)報的數(shù)據(jù)部分(Payload),不包括UDP數(shù)據(jù)報首部,這是因為UDP首部的字段用于分發(fā)或者校驗,不需要透傳給應(yīng)用程序。

使用UDP套接字開發(fā)的網(wǎng)絡(luò)應(yīng)用Server/Client,網(wǎng)絡(luò)IO相關(guān)操作和流程如下圖所示:

使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸

感謝各位的閱讀,以上就是“使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對使用UDP的應(yīng)用程序如何實現(xiàn)可靠傳輸這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

udp
AI