JavaEE 第21节 UDP数据报结构剖析

embedded/2024/12/22 15:33:59/

目录

  • 前言
  • 报文结构
    • 1、源端口号&目的端口号
    • 2、UDP长度
    • 3、校验和
      • 概念
      • 校验和计算方法

前言

本篇文章会围绕UDP报文的结构,对此协议展开详细的讲解,比如报文中每个字段的作用、以及填写方式。
阅读完这篇文章,你会对UDP数据报结构有个透彻的认识,进而体会UDP协议持有相关特性的原因。

报文结构

UDP协议是面向数据报进行传输的。例如发送端发送一个100字节的数据报,那么接收端只能一次性把这个100字节的数据报接收。 而不能分段接收!比如100个字节,分成10次接收,每次接收10个字节,这样是不允许的,因为UDP协议中数据传输最小的单位就是一个数据报,而不是字节。


如图,一个UDP数据报的结构:

在这里插入图片描述
UDP正文部分功能很简单,用于存储需要传输的数据,不用过多介绍,这里主要讲解UDP报头部分的四个字段的功能。

1、源端口号&目的端口号

分别存储客户端和服务器端应用程序的端口号。2个字节,8个比特位,刚好覆盖端口号的大小,即0——65535。
注意: UDP是传输层协议,不太关心IP地址,因此不会把IP地址封装到UDP数据报中,需要把数据报传递个网络层,由网络层对IP地址进行封装。

2、UDP长度

UDP长度的单位是字节,也就是说UDP长度是用来表示这个数据报的内存大小的
例如,一个数据报长度是100,那么这个数据报的内存大小就是100个字节(包含8字节数据报报头)。
由于长度字段只分配了2个字节进行存储,因此其数据报长度的表示范围只能在[8,65535]。
一个数据报的内存结构图:
在这里插入图片描述

也就是说,UDP协议,一次传输的数据大小最多是64KB。放到当今的互联网时代,64KB算不上多,这也算是UDP协议的一个局限。因为这个协议诞生年代久远,是1980年推出的,当时没有想到现在互联网发展速度如此之快。

3、校验和

概念

校验和(checksum)以需要传输的实际数据(包括IP地址以及报头、载荷)作为参数,进行相关计算得到的一个二进制数字。发送端把校验和计算好,填入对应字段,发送给客户端,接收端拿到数据,会用相同的计算方式重新计算校验和,如果和原来的校验和不匹配,说明当前传输过来的数据出现了错误,需要把它丢弃。
注意,UDP协议把数据报丢弃后,不要求重传,这也是为什么说UDP协议传输不可靠的原因,如果确实需要重传,需要采用其他方式进行,比如应用层重传机制等。

校验和计算方法

详细的计算流程不用掌握,大致了解即可。
UDP校验和的计算方法,一般采用“一的补码”进行计算:

  1. 准备伪头部:
    • 伪头部的生成需要借助网络层,以为它需要获取IP地址以及协议号。因此伪头部并不是UDP数据报的一部分,它只是计算校验和临时生成的数据。伪头部具体包含以下内容:

      • 源IP地址(32位)
      • 目的IP地址(32位)
      • 保留字段(8位,值为0)
      • 协议类型(8位,UDP的值为17)
      • UDP长度(16位,即整个UDP报文的长度,包括头部和数据部分)

伪头部的目的是确保IP地址和协议类型在计算校验和时被考虑到,从而提高校验和的可靠性。

  1. 准备UDP头部和数据部分:

    • UDP头部和数据部分一同参与校验和的计算。UDP头部由以下字段组成:

      • 源端口(16位)
      • 目的端口(16位)
      • UDP长度(16位)
      • 校验和字段(16位,初始化时置为0)
      • 数据部分是指UDP报文中实际传输的用户数据。
  2. 将所有字段组合在一起:

    • 将伪头部、UDP头部、数据部分按顺序组合在一起形成一个数据流。
    • 将连续的数据流按照16位(2个字节)一组分割。
  3. 以16位为单位进行逐个加法:

    • 将数据流中的每两个字节(16位)视为一个单元,逐个相加。如果结果超过了16位(即出现溢出),将溢出的高位加到低位上。
  4. 取反:

    • 将得到的加和值取反(即按位取反),生成最终的16位校验和值。
  5. 填入校验和字段:

    • 将计算得到的校验和值填入UDP头部的校验和字段。

除了上面这个算法,关于校验和的计算,还有很多其他常用的算法,比如CRC、MD5、SHA等。这些算法根据不同的场景或者协议被广泛使用。


http://www.ppmy.cn/embedded/103478.html

相关文章

C#操作redis(StackExchange.Redis)

C#操作redis 入门步骤: 安装redis–安装可视化软件RedisDesktopManager–C#操作redis 前两步软件的安装教程很多,这里不赘述。 一、类库的选择 在C#中使用Redis,一般有两种方式: 1、ServiceStack.Redis,据说是Redis官…

sql-labs31-35关通关攻略

第三十一关 一.判断闭合 1“” 二.查询数据库 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()--http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()-- 三.查表 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,…

python办公脚本开发学习

功能介绍 此脚本从一个text文件夹中读取一长串文本,其中含有ipv4的地址,然后通过正则将ipv4的地址以数组的形式存储起来。通过与xls表格中的样本数据进行对比,进行过滤,实现功能为:筛选出除了部门为办公领导和生产技术…

django学习入门系列之第十点《django中数据库操作》

文章目录 django中数据库操作ORM安装第三方模块自己创建数据库django连接数据库 往期回顾 django中数据库操作 django内部提供了ORM框架 相当于他内部给你封装起来了 ORM ORM可以帮我们做两件事: 创建,修改,数据库中的表(不用…

TCP协议 配合 Wireshark 分析数据

在TCP连接中,无论是客户端还是服务端,都有可能成为发送端或接收端,这是因为TCP是一个全双工协议,允许数据在同一连接中双向流动 客户端(Client):通常是指主动发起连接请求的一方。例如&#xf…

啥是纳米微纤维?咋制作?有啥用?

大家好,今天我们来聊聊纳米/微纤维——《Tailoring micro/nano-fibers for biomedical applications》发表于《Bioactive Materials》。这些纤维近年来备受关注,因为它们具有独特的功能和性质,在生物医学等领域有广泛应用。它们可以通过多种技…

10:Logic软件原理图中添加电源与GND

Logic软件原理图中添加电源与GND

深度探索Unity与C#:编织游戏世界的奇幻篇章

在数字编织的梦幻之境中,Unity游戏引擎与C#编程语言如同双生子,共同编织着游戏世界的奇幻篇章。《Unity游戏开发实战:从零到C#高手》这本书,不仅仅是技术的堆砌,它更像是一位智慧导师,引领着我们深入探索这…