校验和只是为防止报文在信道传输出现误码导致报文错误,并不保证报文被他人恶意篡改。

转发报文相关的校验和包括3层校验和4层校验,2中的校验和的计算公式的入参不同:3层校验仅仅校验3层头;4层校验需要校验伪头部+4层头+4层负载。

所有校验和的计算方法是统一的,即所有2字节数据相加,结果的进位再次与2字节数据相加,对最终结果取反。还有一种是4字节相加,然后再2字节折叠,进位再与2字节相加,最终取反。

根据以上计算方式有推论:

csum(ip头)+csum(ip负载)=csum(ip头+ip负载)

一、IP校验和

unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);

iph:ip头指针

ihl:ip头长度,4字节长度的数目。

采用4字节进位累加,最终再2字节折叠进位累加。

该函数发包计算和收包校验都可以。发包计算虚将ip->check字段清0;收包校验不用将check清0,直接对整个ip头计算结果如果为0则认为校验成功(因为校验和字段存的是反码,如果将校验和结果也纳入校验和计算公式,相当于正码+反码=0)。

二、TCP、UDP校验和计算

伪头部=saddr + daddr + len(tcp头+tcp负载) + protocol(L4)

L4校验和=csum(伪头部+tcp头+tcp负载),计算之前需将头里校验和字段清0.

增加伪头部的校验进一步增加校验内容,为保证L3和L4的一致(防君子不防小人)

csum_tcpudp_magic()的sum参数就是tcp头+tcp负载的校验和

如:

三、其他校验和函数

1、csum_partial()

从buff开始的len长度的内存计算校验和,并且对sum增量计算。简单说将len对4补齐计算32bit校验和,但没有取反。

2、csum_fold()

将32bit数字折叠成16bit校验和,并取反。以4字节计算校验和方式的接口最终都会调用该接口获取最终结果。

一般校验和计算都是统一对数据进行++操作后如skb_csum()、csum_partial()函数等等,最终调用csum_fold()函数对结算结果进程折叠并取反,得出最终的校验和结果。

四、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头的信息。
(3) CHECKSUM_UNNECESSARY:
硬件已经进行了完整的校验,无需软件再进行检查,L4收到数据包后如果检查ip_summed是这种情况,就可以跳过校验过程;

2、发送过程
skb->ip_summed字段包含了L4软件告诉设备驱动程序当前校验和的状态,各取值含义如下:
(1) CHECKSUM_NONE:L4软件已经进行了校验,硬件无需做任何事情;
(2) CHECKSUM_PARTIAL:L4软件计算了伪报头,并且将值保存在了tcp/udp首部的check字段中,硬件需要计算其余部分的校验和。硬件适合做简单的++操作,伪头部稍复杂交给cpu。

【Linux 网络】IP校验和计算相关相关推荐

  1. 软考网络管理员存储容量计算相关问题

    软考网络管理员存储容量计算相关问题 题目: 内存按字节编址,用存储容量为8K * 8比特的存储器芯片构成地址编号7000H至EFFFH的内存空间,至少需要多少片内存? 解题过程: 首先求解总体地址容量 ...

  2. Linux网络 IP/TCP校验和、checksum、伪首部相关问题

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

  3. 彻底明白IP地址——计算相关地址

    通过IP地址和子网掩码与运算计算相关地址 知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 ...

  4. linux添加源ip路由命令,linux添加ip、路由相关命令

    1- Linux添加永久路由 vi /etc/sysconfig/network-scripts/route-eth1 ADDRESS0=192.168.10.0 NETMASK0=255.255.2 ...

  5. 基于iproute命令集配置Linux网络(ip命令)

    iproute是Linux下一个网络管理工具包合集,用于取代先前的如ifconfig,route,ifup,ifdown,netstat等历史网络管理工具.该工具包功能强大,它通过网络链路套接字接口与 ...

  6. linux内核udp校验和计算函数,Linux 内核IP和UDP检验和计算

    ·IP checksum a.接收报文 struct iphdr *iph = ip_hdr(skb); if (unlikely(ip_fast_csum((u8 *)iph, iph->ih ...

  7. Linux网络-IP协议

    文章目录 零.前言 一.网络层 理解路由选择 二.IP协议 三.网段划分 四.IP地址数量限制 五.私有和公网IP地址 NAT技术 六.路由 零.前言 本章主要讲解学习网络层的作用, 深入理解IP协议 ...

  8. 【计算机网络】彻底明白IP地址——计算相关地址

    知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0.算出 ...

  9. linux网络ip及其他

    文章目录 网络层 基本概念 ip与tcp(udp)的关系 ip header 分片 3位标志 16位标识 13位片偏移 分片合并过程(重要,可以帮助理解上面三个字段) 网段划分 子网掩码(重要) 特殊 ...

最新文章

  1. 用于Fluent Design的UWP社区工具包蓄势待发
  2. SAP MM 可以通过STO在公司间转移质检库存?
  3. 在html中怎么在按回车的时候换到下一个文本框_史上最全的HTML、CSS知识点总结,浅显易懂。适合入门新手...
  4. 用户生命周期管理,整体运营的基础与核心
  5. Spring 3 RESTful Web服务
  6. 前端学习(1029):jquery其他方法
  7. 使用Canal实现redis和mysql的同步
  8. java值传递string_关于java:按值传递(StringBuilder与String)
  9. 使用Aop管理所有Valid结构bindingResult
  10. Haproxy+keepalived高可用集群实战
  11. 关于C#的GetHashCode
  12. 软件持续集成(CI)、持续交付(CD)和持续部署(CD)
  13. vue 导出excel表格-乱码问题
  14. 解决全部网页木马的技巧
  15. 视频教程-移动端Web开发-JavaScript
  16. 三元组顺序表表示的稀疏矩阵转置(10分)
  17. 钛媒体乌镇咖荟 | 数字化改变以流量为核心的平台生态,系统性思维的价值开始显现...
  18. mysql对服务器内存的要求_MySQL 服务器内存使用
  19. Ubuntu 16.04系统实用插件安装方法
  20. 分享一个忘忧神途辅助脚本工具

热门文章

  1. 瑞康医药与亚马逊云科技达成战略合作,全国上百家子公司业务上云
  2. 华为p30怎么升级鸿蒙系统
  3. 一个人能够哲学思考的条件
  4. SpringBoot日志框架篇
  5. Docker系列之Jenkins+Git实现流水线部署SpringBoot项目
  6. 钱多多软件制作第五天
  7. git屏蔽某些文件/文件夹
  8. 【C语言进阶】带你深度剖析那些常见的字符函数(一)
  9. 模型实践 | 高精地图构建模型HDMapNet助力更精准的自动驾驶
  10. [《命如草贱》偶感小记]2013-2-17