爱悠闲 > Linux从用户层到内核层系列 - TCP/IP协议栈部分系列4: IP层IP封包中TTL值何时修改

Linux从用户层到内核层系列 - TCP/IP协议栈部分系列4: IP层IP封包中TTL值何时修改

分类: Linux Kernel  |  标签: linux TCPIP  |  作者: byhankswang 相关  |  发布日期 : 2013-04-28  |  热度 : 1502°

题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发


轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com微笑

欢迎加入到CHLK - Linux开发交流群 QQ:327084515 讨论Linux开发相关问题


IP层IP封包中TTL值何时修改

IP包头中TTL值每过一次中间设备就会被减1,当TTL值为0的时候在网络中会被丢弃。在Linux 内核中是如何操作的?


1.对TTL值做减法的函数

static inline

int ip_decrease_ttl(struct iphdr *iph)
{

/* 重新计算IP包头的校验和 */
u32 check = (__force u32)iph->check; 
check += (__force u32)htons(0x0100);
iph->check = (__force __sum16)(check + (check>=0xFFFF));

        /* TTL值在转发前被减1 */
return --iph->ttl; 
}

补充说明的是IP首部校验和: 
协议栈在发送数据时,校验和计算: 
(1)把IP数据报的首部都置为0,包括校验和字段。  
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。 
(3)把得到的结果存入校验和字段中。  

协议栈在接收数据时,校验和计算:  
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。 
(2)检查计算出的校验和的结果是否等于零。  
(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。


2.何时调用ip_decrease_ttl

在TCP/IP协议栈中当中间设备收到需要转发包的时候,由ip_forward函数调用ip_ttl_decrease