UDP的详细解析

UDP的详细解析


TCP/IP运输层的两个主要协议都是互联网的正式标准,即:

  1. 用户数据报协议UDP (User Datagram Protocol)
  2. 传输控制协议TCP (Transmission Control Protocol)

按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元 TPDU.但在TCP/IP体系中,根据所使用的协议是TCP或UDP,分别称之为TCP报文段或UDP用户数据报。

UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式。

下表为一些应用和应用层协议主要使用的运输层协议。

应用应用层协议运输层协议
名字转换DNS(域名系统)UDP
文件传送TDTP(简单文件传送协议)UDP
路由选择协议RIP(路由选择协议)UDP
IP地址配置DHCP(动态主机配置协议)UDP
网络管理SNMP(简单网络管理协议)UDP
远程文件服务NFS(网络文件系统)UDP
IP电话专用协议UDP
流式多媒体通信专用协议UDP
多播IGMP(网际组管理协议)UDP
电子邮件SMTP(简单邮件传送协议)TCP
远程终端接入TELNET(远程终端协议)TCP
万维网HTTP(超文本传送协议)TCP
文件传送FTP(文件传送协议)TCP

UDP 概述

用户数据报协议UDP只在IP的数据服务之上加了很少一点功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:

  1. UDP是无连接的,即数据发送之前不需要建立连接

  2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

  3. UDP是面向报文的。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说应用层交给UDP多长的报文,UDP就照样发送,UDP一次交付一个完整的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片。

    IMG_20230213_135141

  4. UDP没有拥塞控制 网络出现拥塞不会使源主机的发送速率降低。这对某些实时应用使很重要的。

  5. UDP 支持一对一、一对多、多对一和多对多的交互通信

  6. UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部i段。首部字段只有8个字节,由四个字段组成,每个字段的长度都是两个字节

  • 源端口 源端口号。在需要对方回信时选用。不需要时可用全0
  • 目的端口 目的端口号。这在终点交付报文时必须使用
  • 长度 UDP 用户数据报的长度,其最小值时8(仅有首部)
  • 检验和 检测UDP用户数据报在传输中是否有错。有错就丢弃。

当接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。

IMG_20230213_140313

检验和的计算

UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时要在UDP用户数据报之前加12个字节的伪首部。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。通过上面那幅图我们可以看到伪首部中的字段信息:

  1. 32位源IP地址
  2. 32位目的IP地址
  3. 8位保留字节(置0)
  4. 8位传输层协议号(TCP是6,UDP是17)
  5. 16位报文长度(首部+数据)

检验和是如何工作的,我们可以通过观察下图:

IMG_20230213_143250

我们对应着上面这副图看,其实计算这个检验和的过程其实就是,将加上伪首部后的数据按照每16位相加求和。将求和后的结果取反与UDP自带的检验和相与,若得到的结果是全1的则说明数据传输无误。(刚好这里的检验和在UDP是以2字节存储的,刚好是12位)。

若在求16位求和结果时发生进位,那么需要进行回卷。计算的过程可以参考这篇 回卷计算

读到这里不知道大家会不会有问题,就是为什么UDP在计算检验和的时候需要加上伪首部。

对于这个问题最简单的回答就是:出于历史原因。如下图David P. Reed解释

image-20230213151257589

前面这个不好翻译,在StackOverflow中找到了一个相关的解答:

image-20230213151419658

抓包测试

UDP有着很广泛的应用场景。它的特点就像上面看到的很简单,没有流量控制以及差错重传等特点,作为传输层的协议常常被拿来和tcp协议比较。所以广泛应用于qq聊天,视频,网络电视,迅雷等场景。缺点就是容易丢包。

我拿qq聊天来抓个UDP数据包试试。

首先通过终端查看本机的ip地址和物理地址:

image-20230213153811220

我们首先打开抓包工具然后,用qq给自己的Android手机发送聊天,可以发现抓包工具成功捕获信息,如下图。

image-20230213153424813

我们查看一下第二条记录中的详细信息

image-20230213154303273

现在我们再去看看所有qq是否有占用52652这个端口。用netstat -ano列出所有占用的端口号,同时用任务管理器查看qq的PID。查看的结果如下图,发现52652这个端口确实被qq所占用。

image-20230213155030303

参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值