伪头部校验

简介: 伪头部校验

本章问题

UDP和TCP的伪首部只用于计算校验和,在UDP和TCP的报文中是不存在的,为什么要引入伪首部呢?为什么伪首部的要有这些字段?这里我们就先看一下TCP和UDP的首部格式。

 

TCP和UDP首部


源端口目的端口:是0-65535任何数字,在收到请求时系统会为客户端动态分配,0-1023为知名端口号

UDP报文长度(单位4byte):表示udp报头 + udp数据总长度 = 8 + len

校验和:计算之前校验和位置填0,发送之前将校验结果填上,目标端收到后会再次进行校验结果为0表示正确

UDP伪头部:包含UDP1+UDP+data三部分共12 + 8 + len 个字节,UDP发送时需要通过伪头部进行16位校验,伪头部只是在校验时用到,数据收发不用伪头部

TCP报头长度(单位4byte):表示TCP报头不包含数据的长度=20+选项长度,UDP无选项

TCP伪头部:包含TCP1+TCP+选项长度+数据长度4部分组成,如果没有选项和数据刚好就是12+20=32个字节,tcp发送时需要对12+20+选项长度+数据长度这些字节进行16位校验,伪头部只是在校验时用到,数据收发不用伪头部,因为这只是IP报头的一部分而已。


我们为什么会使用伪头部校验?

伪首部是为了增加 校验和 的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。


伪首部的目的是为了防止有人截获tcp数据然后加上IP包头伪造数据包,重放攻击。伪首部只是一个虚拟的概念,是为了计算tcp校验和而虚构的,不存在协议层中任何一个位置。

由于socket协议栈在开始已经知道应用层数据要发往哪里,但是还没有到tcp层封装,故虽然知道ip源地址和目的地址,但是没有填入数据包。


为什么伪首部要有目的IP地址?

我们知道数据传输过程中会产生误码,0可能变为1,1可能变为0,并且每种校验码都有一定的查错能力,超过这个范围,就无法察觉错误了。而早期的通信环境大概比较糟糕,因此,在传输过程中出现误码,可能使IP报文的目的地址出现错误,接收主机的UDP计算校验和时,目的IP地址来自IP层,由于目的IP地址出现错误,导致发送主机计算检验和时使用的目的IP地址与接收主机计算检验和时使用的目的IP地址不同,UDP发现错误,丢弃报文。


为什么伪首部要有源IP地址?

为了让接收主机确认源IP地址没有出现错误。假设我们想要开发一款基于UDP的程序,A发送UDP报文给B,B要发送回应报文给A,假设传输过程出现误码,源IP地址出现错误,则A计算检验和时使用的源IP地址与B计算校验和时使用的源IP地址不同,B就可以发现错误,从而丢弃报文,定时重传等可靠性由应用程序自己保证。

相关文章
|
Web App开发 网络安全
SSL接收到一个超出最大准许长度的记录 错误处理
SSL接收到一个超出最大准许长度的记录 错误处理
6555 0
SSL接收到一个超出最大准许长度的记录 错误处理
|
Java 数据库 Maven
根据请求中接收到的主动协商头字段,目标资源没有用户代理可以接受的当前表示
今天使用ssm框架搭建了一个项目,测试一个插入的接口结果返回406,但是数据库插入成功了,报错406是因为返回的结果接口无法解析。
757 0
|
1月前
|
算法 搜索推荐 数据处理
值交换解析法(无第三方变量法)
值交换解析法(无第三方变量法)
26 0
|
8月前
|
JavaScript 数据安全/隐私保护
JS逆向 -- 某新闻数据包中sign值加密分析
JS逆向 -- 某新闻数据包中sign值加密分析
56 0
|
12月前
伪随机码详解
伪随机码详解
145 0
伪随机码详解
分组校验和自定义校验
分组校验和自定义校验
63 0
|
关系型数据库 MySQL Go
字段加密后长度变化
字段加密后长度变化
306 0
【计算机网络】数据链路层 : 封装数据帧 ( 附加信息 | 帧长度 | 透明传输 | 字符计数法 | 字符填充法 | 零比特填充法 | 违规编码法 )
【计算机网络】数据链路层 : 封装数据帧 ( 附加信息 | 帧长度 | 透明传输 | 字符计数法 | 字符填充法 | 零比特填充法 | 违规编码法 )
398 0
【计算机网络】数据链路层 : 封装数据帧 ( 附加信息 | 帧长度 | 透明传输 | 字符计数法 | 字符填充法 | 零比特填充法 | 违规编码法 )
|
Go 区块链
剥开比原看代码07:比原节点收到“请求区块数据”的信息后如何应答?
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 在上一篇,我们知道了比原是如何把“请求区块数据”的信息BlockRequestMes...
1251 0
剥开比原看代码06:比原是如何把请求区块数据的信息发出去的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 在前一篇中,我们说到,当比原向其它节点请求区块数据时,BlockKeeper会发送一个BlockRequestMessage把需要的区块height告诉对方,并把该信息对应的二进制数据放入ProtocolReactor对应的sendQueue通道中,等待发送。
1128 0

热门文章

最新文章