首先,什么是对端信息块?
在linux内核源码剖析——tcp/ip实现这本书中是真么介绍的:对端信息块主要用于组装ip数据包时防止分片攻击,在建立tcp连接时检测连接请求段是否有效以及其序列号是否回绕
在linux内核中是通过inet_peer结构体描述的:
struct inet_peer
{
/* group together avl_left,avl_right,v4daddr to speedup lookups */
/*
* avl_left、avl_right、avl_height用来将对端信息
* 块组成AVL树。AVL树的根为peer_root。
*/
struct inet_peer *avl_left, *avl_right;
/*
* 对端的IP地址。
*/
__be32 v4daddr; /* peer's address */
__u16 avl_height;
/*
* 一个单调递增值,用来设置IP分片首部中
* 的id域。根据对端地址初始化为随机值。
*/
__u16 ip_id_count; /* IP ID for the next packet */
/*
* 用来链接到inet_peer_unused_head链表上。该
* 链表上的对端信息块都是当前闲置的,
* 可回收的。
*/
struct list_head unused;
/*
* 记录该对端信息块引用计数为0的时间。
* 当闲置的时间超出指定的时间时,
* 就会被回收。
*/
__u32 dtime; /* the time of last use of not