【Linux 网络】IP校验和计算相关
校验和只是为防止报文在信道传输出现误码导致报文错误,并不保证报文被他人恶意篡改。
转发报文相关的校验和包括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校验和计算相关相关推荐
- 软考网络管理员存储容量计算相关问题
软考网络管理员存储容量计算相关问题 题目: 内存按字节编址,用存储容量为8K * 8比特的存储器芯片构成地址编号7000H至EFFFH的内存空间,至少需要多少片内存? 解题过程: 首先求解总体地址容量 ...
- Linux网络 IP/TCP校验和、checksum、伪首部相关问题
1.校验和作用 校验和是为防止报文在信道传输出现误码导致报文错误,或者传输过程中间网络设备错误造成报文错误等,并不保证报文被他人恶意篡改.防君子不防小人,而已修改报文内容重新计算校验和是无法检测的. ...
- 彻底明白IP地址——计算相关地址
通过IP地址和子网掩码与运算计算相关地址 知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 ...
- linux添加源ip路由命令,linux添加ip、路由相关命令
1- Linux添加永久路由 vi /etc/sysconfig/network-scripts/route-eth1 ADDRESS0=192.168.10.0 NETMASK0=255.255.2 ...
- 基于iproute命令集配置Linux网络(ip命令)
iproute是Linux下一个网络管理工具包合集,用于取代先前的如ifconfig,route,ifup,ifdown,netstat等历史网络管理工具.该工具包功能强大,它通过网络链路套接字接口与 ...
- linux内核udp校验和计算函数,Linux 内核IP和UDP检验和计算
·IP checksum a.接收报文 struct iphdr *iph = ip_hdr(skb); if (unlikely(ip_fast_csum((u8 *)iph, iph->ih ...
- Linux网络-IP协议
文章目录 零.前言 一.网络层 理解路由选择 二.IP协议 三.网段划分 四.IP地址数量限制 五.私有和公网IP地址 NAT技术 六.路由 零.前言 本章主要讲解学习网络层的作用, 深入理解IP协议 ...
- 【计算机网络】彻底明白IP地址——计算相关地址
知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0.算出 ...
- linux网络ip及其他
文章目录 网络层 基本概念 ip与tcp(udp)的关系 ip header 分片 3位标志 16位标识 13位片偏移 分片合并过程(重要,可以帮助理解上面三个字段) 网段划分 子网掩码(重要) 特殊 ...
最新文章
- 用于Fluent Design的UWP社区工具包蓄势待发
- SAP MM 可以通过STO在公司间转移质检库存?
- 在html中怎么在按回车的时候换到下一个文本框_史上最全的HTML、CSS知识点总结,浅显易懂。适合入门新手...
- 用户生命周期管理,整体运营的基础与核心
- Spring 3 RESTful Web服务
- 前端学习(1029):jquery其他方法
- 使用Canal实现redis和mysql的同步
- java值传递string_关于java:按值传递(StringBuilder与String)
- 使用Aop管理所有Valid结构bindingResult
- Haproxy+keepalived高可用集群实战
- 关于C#的GetHashCode
- 软件持续集成(CI)、持续交付(CD)和持续部署(CD)
- vue 导出excel表格-乱码问题
- 解决全部网页木马的技巧
- 视频教程-移动端Web开发-JavaScript
- 三元组顺序表表示的稀疏矩阵转置(10分)
- 钛媒体乌镇咖荟 | 数字化改变以流量为核心的平台生态,系统性思维的价值开始显现...
- mysql对服务器内存的要求_MySQL 服务器内存使用
- Ubuntu 16.04系统实用插件安装方法
- 分享一个忘忧神途辅助脚本工具