通俗易懂用户数据报协议(UDP)

栏目: 服务器 · 发布时间: 6年前

内容简介:UDP是User Datagram Protocol(用户数据报协议)的缩写,它是一个简单的协议,简单到UDP规范RFC0768只有区区3页。UDP是工作在IP层之上的传输层协议,UDP对IP主要有两个扩展:IP提供了一种尽力而为、无连接的数据报交付服务。IP基于IP地址实现路由和分组转发,可以将一个IP数据报从网络的一台主机传送到另一台主机,IP地址决定IP数据报将被送往哪个主机。所以,IP提供主机到主机的数据报传输服务。

什么是UDP?

UDP是User Datagram Protocol(用户数据报协议)的缩写,它是一个简单的协议,简单到UDP规范RFC0768只有区区3页。

UDP是工作在IP层之上的传输层协议,UDP对IP主要有两个扩展:

  • 扩展出端口号使得IP数据报可以多路分发到用户进程。
  • 扩展出校验和提供网络传输过程中数据差错的检验。

IP提供了一种尽力而为、无连接的数据报交付服务。IP基于IP地址实现路由和分组转发,可以将一个IP数据报从网络的一台主机传送到另一台主机,IP地址决定IP数据报将被送往哪个主机。所以,IP提供主机到主机的数据报传输服务。

IP数据报到达目的主机后,内核层实现的IP模块,会负责接收网卡上的IP数据报,但主机上通常会同时运行多个进程,IP数据报应该交给哪个进程去处理呢?IP搞不定。

端口号(位于UDP首部)决定数据报交给主机上的哪个进程处理。所以,UDP为端主机上运行的应用程序提供了端到端服务。

UDP的特征

  • UDP是无连接的,通信之前无须建连便可直接发送数据报,而TCP是面向连接的。
  • UDP不提供差错纠正,但UDP提供差错检测(端到端校验和)。
  • UDP不做重复消除。
  • UDP不做流量控制。
  • UDP不做拥塞控制,没有协议机制防止高速UDP流量对其他网络用户的消极影响。
  • UDP不保证顺序,数据报递交应用的顺序。
  • UDP不可靠,UDP只负责把应用程序传给IP层的数据发送出去,并不能保证数据报到达目的地,可靠传递需要应用程序去实现。
  • UDP支持组播交付。
  • UDP是一种保留消息边界的传输层协议。

消息边界

应用程序每请求一次UDP输出将产生一个UDP数据报,从而发送一个IP数据报,而接收端每请求一次UDP接收都将接收一个完整的UDP报(如果有),这跟面向数据流的TCP不一样。

假设主机A给主机B发送2次数据,第一次4字节“abcd”,第二次3字节“xyz”,而主机B接收2次,分别返回“abcd”、“xyz”两个消息,也可以返回“xyz”,“abcd”两个消息(顺序不重要),那么这就是保留消息边界。

UDP是保留消息边界的传输层协议,利用UDP通信的应用程序每次发送操作会产生一个IP数据报(不考虑分片),这就约束每次发送的数据量不能大于MTU(最大传输单元),接收端每次接收都会返回一个个UDP数据报的完整负载,不会出现返回半个数据报负载的情况。

而TCP是不保留消息边界的流协议,发送端调用发送的次数和每次发送的数据量,跟接收端调用接收的次数和每次接收的数据量,没有任何对应关系,所以使用TCP的应用程序需要去处理消息边界。

UDP数据报封装格式

IPv4协议(Protocol)字段用值17来标识UDP,UDP数据报头部通常是8字节,IPv4头部之后紧接着是UDP头部,然后是UDP数据Payload(如有)。

通俗易懂用户数据报协议(UDP)

IPv4 UDP数据报封装格式

IPv4封装包对应的UDP头部由源端口号、目的端口号、长度、校验和组成,每个字段都是2字节。

(1) 端口号,纯抽象的标识,它不跟任何物理实体相关。

端口号用于帮助协议分辨发送和接收进程。接收端的内核层从网卡接收到IP数据报之后,识别出UDP数据报(IP数据报头部协议字段值=17)之后,会根据UDP头部的目的端口号,映射到对应进程,把UDP数据报交给对应的进程去处理,这个映射关系由系统内核管理维护。

通俗易懂用户数据报协议(UDP)

UDP头部和负载

目的端口号是必须的,但源端口号是可选的,如果数据报发送者不需要对方回复的话,则源端口号可被设置为0。

因为IP层根据IP头部的协议类型字段,将进入的IP数据报,分发到特定的传输协议(TCP或UDP等),到了传输协议层,再根据端口号将协议数据分发到不同进程。所以,端口号是协议独立的,不同协议的相同端口号并不会引起分发混乱。

比如,一台机器上的两个网络服务进程使用相同的IP地址和端口号,但一个使用TCP协议,另一个使用UDP协议,这样是没有问题。

(2) 长度字段,是以字节为单位的UDP头部和UDP数据的总长度,因为UDP头部长度为8,且空数据的UDP数据报是允许的,这意味着该长度字段值最小为8。UDP长度值是冗余的,因为可以通过IP数据报的总长度减去IP首部的长度推导出来。

(3) 校验和,覆盖了UDP首部、UDP数据和一个伪首部,由初始发送方计算,由最终目的方校验,用于判断数据报在网络传输过程中是否出错,比如某一位从1变成了0。

使用UDP的应用程序如何实现可靠传输

众所周知,UDP不可靠、不保证顺序。

(1) 什么叫不可靠?A给B发送一个UDP数据报,该UDP数据报不一定被正确交付给接收端B,但因为网络质量等各种原因,可能丢包,IP数据报是尽力而为的交付,一切随缘。

有没有办法保证,发送的UDP一定到达目的端?Sorry,保证不了,做不到。

那TCP提供的可靠传输是什么意思?TCP提供的可靠传输并不是指不丢包,因为TCP也依赖IP(IP不可靠)实现数据报交付,TCP的可靠性是指丢掉的包会被重传,直到被正确投递,才会继续传输下一个数据报。

那TCP是怎么做到可靠传输的呢?很简单,收报确认(ack)+丢包重传。所以UDP如果要提供可靠传输,也可以参考TCP的实现机制,只是TCP是实现在内核层,而基于UDP的应用程序,可以把可靠传输做到应用层。要做收报确认+丢包重传,需要一些额外的信息,比如包序列号之类,可以放到Payload,约定好这些额外信息在Payload中的结构布局即可。

(2) 什么叫不保证顺序?A给B发送两个UDP数据报,两个UDP数据报会被封装为两个IP数据报,通过IP协议传输,因为两个IP数据报独立路由,所以哪个先到?不一定,看心情。

有没有办法保证,UDP数据报按照发送端发送的时间顺序到达目的端?也Sorry,办不到。

所以,TCP提供的顺序性,其实只是在接收端对IP数据报根据发送顺序重新排序,很显然,UDP要支持重排序,也需要一些额外信息,也只能通过payload携带,而不能像TCP一样(TCP首部的一些字段用于接收端重排序)。

综上,UDP只提供最简单端主机上应用程序的端到端服务,其他的特性,如果要提供,那请参考TCP的思路去实现吧。

这是有好处的:因为简单,所以开销很小。而某些应用场景,可以容忍丢包、乱序,UDP就是很适合的。保时捷是很好,但拉砖还是用拖拉机吧。

UDP Socket编程

UDP Socket网络编程的API不多,socket()用于创建套接字,close()用于关闭套接字,sendto()用于发送数据,recvfrom()用于接收数据。

bind()顾名思义是绑定,TCP可以绑定,UDP也可以,bind用于UDP等于告诉内核:这个套接字跟网络远端的一个

而没有bind之前,只能通过sendto()接口(通过参数指定目的地)。UDP套接字recv()返回的是UDP数据报的数据部分(Payload),不包括UDP数据报首部,这是因为UDP首部的字段用于分发或者校验,不需要透传给应用程序。

使用UDP套接字开发的网络应用Server/Client,网络IO相关操作和流程如下图所示:

通俗易懂用户数据报协议(UDP)

UDP套接字编程


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Essential ActionScript 3.0

Essential ActionScript 3.0

Colin Moock / Adobe Dev Library / June 22, 2007 / $34.64

ActionScript 3.0 is a huge upgrade to Flash's programming language. The enhancements to ActionScript's performance, feature set, ease of use, cleanliness, and sophistication are considerable. Essentia......一起来看看 《Essential ActionScript 3.0》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具