【计算机网络】UDP报文详解

目录

[一. UDP协议概述](#一. UDP协议概述)

[二. UDP报文格式](#二. UDP报文格式)

[1. 首部](#1. 首部)

[2. 校验和](#2. 校验和)

[三. UDP的缓冲区](#三. UDP的缓冲区)

结束语


一. UDP协议概述

UDP------用户数据报协议,是传输层的一个重要协议

基于UDP的应用层协议有: DNS,TFTP,SNMP,NTP

协议 全称 默认端口号
DNS Domain Name Service(域名服务) 53
TFTP Trivial File Transfer Protocol(简单文件传输协议) 69
SNMP Simple Network Management Protocol(简单网络管理协议) 通过UDP端口161接收,只有Trap信息采用端口162
NTP Network Time Protocol(网络时间协议) 123

UDP的主要特点:

  1. UDP是无连接的。即发送数据前不需要建立连接,发送数据结束也没有连接释放,因此减少了开销和发送数据前的时延
  2. UDP使用尽最大努力交付。即不保证可靠交付,因此不需要维护复杂的连接状态表(有许多参数)
  3. UDP是面向数据报的。发送方的UDP对应用层交付的报文,在添加首部后直接交付给IP层。UDP对应用层交付的报文,既不合并,也不拆分,而是保留这些报文的边界。也就是说,应用层给UDP多长报文,UDP就发多长,一次发送一个报文,如下图。
  4. 在接收方的UDP,对于IP层交付的UDP用户数据报,在去除UDP首部后也直接交付应用层,不作任何处理,一次交付一个完整的报文。因此这就将控制报文长度的工作交给了应用层:应用层要选择合适大小的报文。若报文太长,UDP封装后交给IP层,IP层在传输时可能要进行分片处理,减低了IP层的效率。反之,应用层报文太短,效率也低
  5. UDP没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低 。这对某些实时应用很重要,如IP电话,实时视频会议等,要求源主机以恒定的速率发送数据,并且允许在网络拥塞时丢失一部分数据,但不允许数据有太大的时延
  6. UDP支持一对一,一对多,多对一和多对多的交互通信
  7. UDP的首部开销小,只有8字节,比TCP的20字节的首部短

二. UDP报文格式

UDP报文有两大部分组成:报头+有效载荷(数据),其中有效载荷就是应用层交付给UDP协议层的报文

1. 首部

在学习协议报文时,首先要解决两个问题:1. 报头和有效载荷如何分离 2. 有效载荷如何向上交付

第一个问题:报头和有效载荷如何分离

在UDP中,报头的大小是固定的------8字节。所以只要截取前8字节,后面就都是有效载荷了

第二个问题:有效载荷如何向上交付

UDP是传输层的,上层是应用层。而应用层程序会绑定端口号,UDP报头中有16位(bit位)目的端口号,根据端口号做到向上交付


UDP报头由4部分组成:

  1. 源端口号:发送方的端口号
  2. 目的端口号:目的主机的端口号
  3. UDP长度:UDP报文的长度,单位字节,包括报头和有效载荷
  4. UDP校验和:保证报文完整性和正确性,出错就丢弃

如果接收方 UDP 发现收到的报文中的端口号不存在,就丢弃该报文,并由国际控制报文协议 ICMP发送"端口不可达"差错报文给发送方

2. 校验和

UDP用户数据报首部中的校验和的计算方法较为特殊。在计算校验和前,要在UDP用户数据报之前增加12字节的伪首部。伪首部不是UDP报文的真正首部,只是在计算校验和时,临时添加的字段。伪首部既不向下传送也不向上递交,只是为了计算校验和。下图给出伪首部字段内容

UDP的校验和是把首部和数据部分一起检验。

发送方:首先将全零放入首部的校验和字段,再把伪首部以及UDP报文看成是由许多16位的字串拼接起来的。若UDP报文的数据部分不是偶数个字节,还要填入一个全零字节(但此字节不发送)。然后按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段

接收方:将收到的UDP报文(添加伪首部和可能填充的全零字节)一起按照二进制反码求这些16位字的和。当无差错时其结果应为全1。否则就表明有差错出现,接收方就丢弃这个UDP报文(也可以上交给应用层,但附上差错警告)

下图给出了一个计算 UDP 校验和的例子。这里假定用户数据报的长度是 15 字节,因此要添加一个全 0 的字节。不难看出,这种简单的差错检验方法的检错能力并不强,当它的好处是简单,处理起来比较快。

三. UDP的缓冲区

UDP报头中,UDP长度为16为,即最长UDP报文时64KB(包含报头),如果长度超过64KB,需要应用层手动分包,多次发送,并在接收方手动拼接

因为UDP是面向数据报的,上层一次交付多少数据,就发送多少数据,所以UDP是没有发送缓冲区的,但是有接受缓冲区,因为需要等待上层处理。所以UDP是全双工的(可同时收发数据)

结束语

本篇博客到此结束,感谢看到此处。

欢迎大家纠错和补充

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关推荐
明月看潮生16 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine2023912 小时前
06 网络编程基础
java·网络
海绵波波1073 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
幺零九零零6 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
热爱跑步的恒川6 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面7 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程9 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
长安初雪10 小时前
Request 和 Response 万字详解
计算机网络·servlet