UDP首部由源端口号、目标端口号、包长和校验和组成。
# UDP数据包格式
源端口号(Source Port) | 目标端口号(Destination Port)
包长度(Length) | 校验和(Checksum)
数据部分(Data)
源端口号(Source Port)
没有源端口号的时候该字段的值设置为0,可用于不需要返回的通信中。
校验和(Checksum)
校验和
是为了提供可靠的UDP首部和数据而设计。在计算校验和时,附加在UDP伪首部与UDP数据报之前。通过在最后一位增加一个“0”将全长增加16倍。此时将UDP首部的校验和字段设置为“0”。然后以16比特为单位进行1的补码和,并将所得到的1的补码和写入校验和字段。
- 在校验和计算中之所以使用1的补码形式,是因为即使有一位溢出会回到第1位,也不会造成信息丢失。而且在这种形式下0可以有两种表示方式,因此有用0表示两种不同意思的优点。
# 校验和计算中使用的UDP伪首部
源IP地址
目标IP地址
填充0 | 协议号17 | UDP包长度
接收主机在收到UDP数据报以后,从IP首部获知IP地址信息构造UDP伪首部,再进行校验和计算。校验和字段的值是校验和字段以外剩下部分的1的补码和。因此,包括校验和字段在内的所有数据之和结果为“16位全部为1”时,才会被认为收到的数据是正确的。
- 1的补码中该值为0(负数0)。二进制中为1111111111111111、十六进制中为FFFF、十进制中则为65536。
另外,UDP中也有可能不用校验和,此时,校验和字段中填入0。然而UDP首部的端口号或是IP首部的IP地址遇到损坏,那么可能会对其他通信造成不好的影响。因此,在互联网中比较推荐使用校验和检查。
校验和计算中计算UDP伪首部的理由:TCP/IP中识别一个进行通信的应用需要5大要素,它们分别为源IP地址、目标IP地址、源端口、目标端口、协议号。然而在UDP的首部中只包含它们当中的两项,余下的3项都包含在IP首部里。假定其他3项的信息被破坏会产生什么样的后果?很明显,这极有可能会导致应该收包的应用收不到包,不该收到包的应用却收到了包。为了避免这类问题,有必要验证一个通信中必要的5项识别码是否正确。为此在校验和的计算中引入了伪首部的概念。
(最近更新:2019年09月18日)
标签:UDP,首部,IP,校验,TCP,IP地址,端口号 来源: https://blog.csdn.net/Watkins_OS/article/details/100974887
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。