IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Linux网络 IP/TCP校验和、checksum、伪首部相关问题 -> 正文阅读

[网络协议]Linux网络 IP/TCP校验和、checksum、伪首部相关问题

1、校验和作用

校验和是为防止报文在信道传输出现误码导致报文错误,或者传输过程中间网络设备错误造成报文错误等,并不保证报文被他人恶意篡改。防君子不防小人,而已修改报文内容重新计算校验和是无法检测的。

2、校验内容

网络报文校验和包括3层校验和4层校验,
3层校验:仅校验3层头(网络层ip头,ipv6协议中没有三层校验和,仅指ipv4);
csum(ip头)

4层校验:需要校验 伪头部+4层头+4层负载(应用层负载)。
csum(ip头)+csum(ip负载)=csum(ip头+ip负载)

3、计算方式

校验和的计算方法是统一的,即所有2字节数据的二进制反码求和。内核实现是以四字节求和取反得到校验和。

发送方填充校验和:
将校验和的2byte置0,计算校验和,将计算结果填充到校验和位置。

接收方验证校验和:
验证时按照同样的计算方式,如果计算结果为0则表示校验和正确,否则表示报错已出错。

几个关键点:
1、先取反再求和与先求和再取反结果一致;为了效率内核使用先求和再取反方式计算;
2、按16bit与32bit结果一致;内核使用32bit以减少运算次数;
3、计算过程中二进制溢出进位时,将进位加到低位,循环计算,直到高位为0;
//详细过程可阅读内核源码。反码求和逻辑比较复杂,自行研究。

4、伪首部相关问题

伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。伪报头保证TCP&UDP数据单元到达正确的目的地址。

Q:已经有了ip头校验,为什么还需要在tcp层再次校验ip相关信息?
A:网络报文传输需要进过很多中间网络设备,一般为路由器,rt会操作修改ip头信息(ttl等内容),然后重新计算ip校验和。比如,如果传输过程中由于软硬件异常导致ip头的目的地址错误将报文发送到了非正确的目的地,接收方检查ip头时未发现异常,此时上送到tcp层处理时,如果不检查ip头相关信息就无法检测出此报文是错误的。

Q:伪首部可以直接使用整个ip头吗?
A:不合理,ip头的部分自带经过路由器时会修改变化的,如果使用完整的ip头,中间设备每次都要重新计算tcp层校验和。并且完整的头也增加了计算量。

5、linux内核校验和

计算校验和需要遍历每个字节,对性能影响还是很大的,所以linux对校验和的计算做了很多优化处理
1、按需分多部计算,采用先求和最后取反的计算方式,可以将计算过程分多个步骤,包括报文分片时可以每片单独计算sum,最后再同一相加区分。
2、借助硬件加速,将校验和计算工作留给网卡硬件处理(接收发送都可以),但需要硬件支持此特性。

skb->ip_summed表明L3和L4的计算结果,区分接收和发送:

1、接收过程

skb->csum可能包含L4一部分校验和;
skb->ip_summed字段代表:设备驱动告诉L4软件当前校验和的状态,各取值含义如下:

(1) CHECKSUM_NONE:
skb->csum中的校验和无效,可能是硬件没有提供校验和(硬件不支持、未开启此功能等),此时将ip_summed设为CHECKSUM_NONE,让L4软件层重新校验;

(2) CHECKSUM_COMPLETE:
硬件已经校验了L4报头和其payload部分,并且校验和保存在了skb->csum中,L4软件只需要再计算伪报头然后检查校验结果即可。硬件计算稍复杂的伪头部比较好性能,因为伪头部需要提取ip头的信息。
伪头部包含ip信息、报文长度信息等,需要解析提取一些字段,此类工作对硬件来说比较复杂, 所以伪首部仍然交由软件计算。

(3) CHECKSUM_UNNECESSARY:
硬件已经进行了完整的校验,无需软件再进行检查,L4收到数据包后如果检查ip_summed是这种情况,就可以跳过校验过程;

(4) CHECKSUM_PARTIAL:
虚拟化环境同宿主机不同vm通信时收包会有此种情况(如virtio网卡),此时认为数据虽然未校验,但认为可靠,不过tcp头的校验和字段是错误的。tcp协议栈检查校验和时此种情况不会检查。

 * CHECKSUM_PARTIAL:
 *
 *   A checksum is set up to be offloaded to a device as described in the
 *   output description for CHECKSUM_PARTIAL. This may occur on a packet
 *   received directly from another Linux OS, e.g., a virtualized Linux kernel
 *   on the same host, or it may be set in the input path in GRO or remote
 *   checksum offload. For the purposes of checksum verification, the checksum
 *   referred to by skb->csum_start + skb->csum_offset and any preceding
 *   checksums in the packet are considered verified. Any checksums in the
 *   packet that are after the checksum being offloaded are not considered to
 *   be verified.

2、发送过程

skb->ip_summed字段包含了L4软件告诉设备驱动程序当前校验和的状态,各取值含义如下:
(1) CHECKSUM_NONE:L4软件已经进行了校验,硬件无需做任何事情;

(2) CHECKSUM_PARTIAL:L4软件计算了伪报头,并且将值保存在了tcp/udp首部的check字段中,硬件需要计算其余部分的校验和。硬件适合做简单的++操作,伪头部稍复杂交给cpu。
(对应网卡驱动程序会设置描述符相应字段,硬件来处理)

参考:
https://blog.csdn.net/qy532846454/article/details/7010852
https://blog.csdn.net/weixin_39631017/article/details/111845098
https://blog.csdn.net/zhangwenxinzck/article/details/107574202
https://blog.csdn.net/weixin_29159127/article/details/116691805

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:34:57  更:2022-10-31 12:36:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 11:13:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码