UDP协议详解(收藏)

相比于TCP协议(传输控制协议) 来说, UDP协议(用户数据报协议) 要简单很多。

UDP协议的首部格式

UDP协议的首部有8个字节,一共四个字段,每个字段的长度都是2个字节。

1.16位源端口号:发送方的端口号,不用的话可以置0

2.16位目的端口号:接受方的端口号。

3.16位UDP长度:首部 + 数据的总长度,单位为字节。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部);然而我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

4.16位UDP检验和:是为了接收方进行数据校验设计的,如果校验不通过的话数据会被丢弃,后面会单独讲解。当源主机不想计算校验和,则直接令该字段全为0.

UDP的特点

1.无连接:UDP是无连接的协议,他在进行数据传输之前不需要先建立连接,也没有各种重传机制、拥塞控制和流量控制,所以传输速度很快,消耗很低,延迟小,数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。

2.不可靠:只负责数据的发送,不关心数据是否送达,没有确认机制,主机收到数据也不会有响应

3.分组首部开销小,TCP的首部是20字节,UDP的首部是8字节

4.面向报文的:TCP(面向连接的传输控制协议)是面向字节传输,而UDP是面向报文传输,对于应用层交下来的报文段不进行拆分合并,直接保留原有报文段的边界然后添加UDP的首部就交付给网络层。不论报文的长短,UDP都不会进行处理。因此为了避免报文段过短降低传输效率以及报文段过长导致网络层对IP数据进行分片操作,应用层应该选择合适长度的报文交付给运输层的UDP。

协议对比

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议

TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。 [6]

TCP面向字节流和UDP面向报文的区别

TCP面向字节流
打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。

上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。

结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。

UDP面向报文
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。

原因
其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

UDP的首部校验

校验的时候需要在UDP数据报之前增加12字节的伪首部,伪首部仅仅是为了计算校验和,并不是是真实存在的数据结构。他会从网络层获取到源IP地址和目的IP地址然后结合自己的UDP长度进行校验。这样既检查了UDP数据报,又对IP数据报的源地址和目的IP地址进行了检验。

UDP校验和的计算方法和IP数据报首部校验的计算方法很相似,都是用二进制反码运算求和再取反,但是IP数据报只是对IP数据报的头部进行校验,UDP的校验是把首部和数据部分一起校验。

发送方,首先是把全零放入校验和字段并且添加伪首部,然后把UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送),接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段。在接收方,把收到得UDP数据报加上伪首部(如果不为偶数个字节,还需要补上全零字节)后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1,。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。

1.校验时,如果UDP数据报部分的长度不是偶数个字节则会填入一个全0字节,但是填入的这个字节是不发送的。

2.如果接收方计算出的校验和不一致,那么可以丢弃也可以交付上层,但是要附上错误报告,告诉上层这是错误的数据报。

3.伪首部的校验可以同时校验端口号和IP地址

这种差错校验的验错能力不强,但是简单速度快。

应用

UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的

应用层协议DNS(域名服务)、DHCP(动态主机配置协议)、TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、RIP(路由信息协议)传输层协议都是采用的UDP协议。

应用层协议FTP(文件传输协议)、Telnet(远程终端协议)、SMTP(简单邮件传输协议)、HTTP(超文本传输协议)、BGP(边界网关协议)传输层协议采用的是TCP协议。

相关阅读:
TCP面向字节流和UDP面向报文的区别
【网络】传输层协议——UDP协议
百度百科
UDP协议的详细解析

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值