加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十一]:ICMP模块

发布时间:2016-10-16 06:06:59 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 ICMP模块比较简单,要注意的是icmp的速率限制策略,向IP层传输数据ip_append_data()和 ip_push_pending_frames()。 在net/ipv4/af_inet.c中的inet_init()注册icmp协议,从这里也可以看出,ICMP模块是绑 定在IP模块之上的。inet_

同样,开始时sk->sk_write_queue()为空,初始 的设置与上述例子完全相同,不同处在于datalen此时比最大分片还要大,因此要设置datalen=maxfraglen-fragheaderlen。

if (datalen > mtu - fragheaderlen)     
 datalen = maxfraglen - fragheaderlen;

在完全第一个分片后,同样会将分片skb放入sk_write_queue队列,并进入 下一次while循环。此时各参数的值:datalen=496, fraglen=516, alloclen=516, skb->len=516,

copy=488, 

offset=488, length=600-496=104, 更新transhdrlen=0。     
__skb_queue_tail(&sk->sk_write_queue, skb);     
continue;

再次进入while循环,此时不同的是length=104,证明还有数据需要拷贝,此时会对待拷贝的数据进行判断 ,下面所指的填充满是针对maxfraglen而言的。
  @copy > 0,表示上个报文未被填充满,这种情况在多次调用 ip_append_data()时会发生,这里都是一次调用ip_append_data()的情况,所以不会出现,此时会填充数据到上个skb中
  @copy = 0,表示上个报文被填充满,这个例子现在就是这种情况,此时会分配新的skb
  @copy < 0,表示上 个报文多填充了数据,这时因为maxfraglen是mtu8字节对齐后的值,所以maxfraglen范围是[mtu-7, mtu],而在某些特殊情况下 ,比如上个报文已被填满(实际还可能有[1, 7]字节的空间),待填充字节数n < 8,这时会把这n个节字补在最后一个报文的 尾部。
 对这个例子而言,上个skb刚好被填充满,copy=0,此时分配新的skb。

copy = mtu - skb->len;   

  
if (copy < length)     
 copy = maxfraglen - skb->len;

分配新skb的流程与上个skb的分配过程相同,变化的只是偏移量offset,另外, icmp报头只存在于第一个分片中,因为它也属于IP内容的一部分,在这次拷贝完成后length=0,函数返回,最后结果如下:

Linux内核分析 - 网络[十一]:ICMP模块

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读