偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入理解UDP編程

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
UDP是User Datagram Protocol(用戶數(shù)據(jù)報(bào)協(xié)議)的縮寫(xiě),它是一個(gè)簡(jiǎn)單的協(xié)議,簡(jiǎn)單到UDP規(guī)范RFC0768只有區(qū)區(qū)3頁(yè)。

 什么是UDP?

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

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

  1. 擴(kuò)展出端口號(hào)使得IP數(shù)據(jù)報(bào)可以多路分發(fā)到用戶進(jìn)程。
  2. 擴(kuò)展出校驗(yàn)和提供網(wǎng)絡(luò)傳輸過(guò)程中數(shù)據(jù)差錯(cuò)的檢驗(yàn)。

IP提供了一種盡力而為、無(wú)連接的數(shù)據(jù)報(bào)交付服務(wù)。IP基于IP地址實(shí)現(xiàn)路由和分組轉(zhuǎn)發(fā),可以將一個(gè)IP數(shù)據(jù)報(bào)從網(wǎng)絡(luò)的一臺(tái)主機(jī)傳送到另一臺(tái)主機(jī),IP地址決定IP數(shù)據(jù)報(bào)將被送往哪個(gè)主機(jī)。所以,IP提供主機(jī)到主機(jī)的數(shù)據(jù)報(bào)傳輸服務(wù)。

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

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

[[268923]]

UDP的特征

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

消息邊界

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

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

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

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

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

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

 

深入理解UDP編程

IPv4 UDP數(shù)據(jù)報(bào)封裝格式

IPv4封裝包對(duì)應(yīng)的UDP頭部由源端口號(hào)、目的端口號(hào)、長(zhǎng)度、校驗(yàn)和組成,每個(gè)字段都是2字節(jié)。

1、端口號(hào),純抽象的標(biāo)識(shí),它不跟任何物理實(shí)體相關(guān)。

端口號(hào)用于幫助協(xié)議分辨發(fā)送和接收進(jìn)程。接收端的內(nèi)核層從網(wǎng)卡接收到IP數(shù)據(jù)報(bào)之后,識(shí)別出UDP數(shù)據(jù)報(bào)(IP數(shù)據(jù)報(bào)頭部協(xié)議字段值=17)之后,會(huì)根據(jù)UDP頭部的目的端口號(hào),映射到對(duì)應(yīng)進(jìn)程,把UDP數(shù)據(jù)報(bào)交給對(duì)應(yīng)的進(jìn)程去處理,這個(gè)映射關(guān)系由系統(tǒng)內(nèi)核管理維護(hù)。

 

深入理解UDP編程

 

UDP頭部和負(fù)載

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

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

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

2、長(zhǎng)度字段,是以字節(jié)為單位的UDP頭部和UDP數(shù)據(jù)的總長(zhǎng)度,因?yàn)閁DP頭部長(zhǎng)度為8,且空數(shù)據(jù)的UDP數(shù)據(jù)報(bào)是允許的,這意味著該長(zhǎng)度字段值最小為8。UDP長(zhǎng)度值是冗余的,因?yàn)榭梢酝ㄟ^(guò)IP數(shù)據(jù)報(bào)的總長(zhǎng)度減去IP首部的長(zhǎng)度推導(dǎo)出來(lái)。

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

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

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

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

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

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

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

2、什么叫不保證順序?A給B發(fā)送兩個(gè)UDP數(shù)據(jù)報(bào),兩個(gè)UDP數(shù)據(jù)報(bào)會(huì)被封裝為兩個(gè)IP數(shù)據(jù)報(bào),通過(guò)IP協(xié)議傳輸,因?yàn)閮蓚€(gè)IP數(shù)據(jù)報(bào)獨(dú)立路由,所以哪個(gè)先到?不一定,看心情。

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

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

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

這是有好處的:因?yàn)楹?jiǎn)單,所以開(kāi)銷很小。而某些應(yīng)用場(chǎng)景,可以容忍丟包、亂序,UDP就是很適合的。保時(shí)捷是很好,但拉磚還是用拖拉機(jī)吧。

UDP Socket編程

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)核:這個(gè)套接字跟網(wǎng)絡(luò)遠(yuǎn)端的一個(gè)

而沒(méi)有bind之前,只能通過(guò)sendto()接口(通過(guò)參數(shù)指定目的地)。UDP套接字recv()返回的是UDP數(shù)據(jù)報(bào)的數(shù)據(jù)部分(Payload),不包括UDP數(shù)據(jù)報(bào)首部,這是因?yàn)閁DP首部的字段用于分發(fā)或者校驗(yàn),不需要透?jìng)鹘o應(yīng)用程序。

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

 

深入理解UDP編程

 

UDP套接字編程

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-26 07:47:37

無(wú)鎖編程CPU

2020-12-11 07:32:45

編程ThreadLocalJava

2020-11-13 08:42:24

Synchronize

2022-10-12 07:53:46

并發(fā)編程同步工具

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2010-06-01 15:25:27

JavaCLASSPATH

2024-12-31 09:00:12

Java線程狀態(tài)

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2009-09-25 09:14:35

Hibernate日志

2024-02-21 21:14:20

編程語(yǔ)言開(kāi)發(fā)Golang

2020-09-23 10:00:26

Redis數(shù)據(jù)庫(kù)命令

2017-08-15 13:05:58

Serverless架構(gòu)開(kāi)發(fā)運(yùn)維

2017-01-10 08:48:21

2025-06-05 05:51:33

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2023-10-27 07:47:58

Java語(yǔ)言順序性

2024-05-17 12:56:09

C#編程線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)