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