加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[八补]:IP协议补充

发布时间:2016-01-26 04:16:10 所属栏目:Linux 来源:网络整理
导读:内核版本:2.6.34 在前一篇IP协议中对报文接收时IP层的处理进行了分析,本篇分析将针对报文发送时IP层的处理。 传输层处理完后,会调用ip_push_pending_frames(

两张图只列出了IP报头tot_len字段的不同,其它诸如check, frag_list, frag_off等字段也是不同的。

先是对第 一个分片的更新,让它脱离后续分片,成为独立包。frag_list置为空,当然frag_list得保存下来(到frag)中,后续分片要从 frag_list中取出。更新skb_datalen和skb->len为第一个分片自身的值,在之前ip_append_data()处理后它是代表全部分片 的值。ip报头的tot_len, frag_off和check分别设置。关于first_len的值,下面这张图可以清晰的解释(frags是支持SG的设备 可能会出现的,不支持的话,skb->data_len=0):

Linux内核分析 - 网络[八补]:IP协议补充

frag = 

skb_shinfo(skb)->frag_list;     
skb_frag_list_init(skb);     
skb->data_len = first_len - skb_headlen(skb);     
skb->truesize -= truesizes;     
skb->len = first_len;     
iph->tot_len = htons(first_len);     
iph->frag_off = htons(IP_MF);     
ip_send_check(iph);

下面是循环每个分片的代码,中间省略了每个分片的处理,这部分单独拿出来说明,frag是从 skb中取出的skb_shinfo(skb)->frag_list。

for (;;) {     
 if (frag) {     
  …… // 分片处理     
  if (err || !frag)     
   break;     
  skb = frag;     
  frag = skb->next;     
  skb->next = NULL;     
 }     
}

对于后续分片,要生成它的IP报头,设置好其中字段,这里根据分片的排列设置了片偏移iph->frag_off,以及 偏移标识(前续分片打上IP_MF标签)。ip_copy_metadata()从前一个分片中拷贝些数据,比如pkt_type, protocol, dev, priority, mark, flags等。ip_options_fragment()处理分片的IP选项部分,因为很多选项只要第一个分片有就可以了,后续分 片可以去除。

frag->ip_summed = CHECKSUM_NONE;     
skb_reset_transport_header(frag);     
__skb_push(frag, hlen);     
skb_reset_network_header(frag);     
memcpy(skb_network_header(frag), iph, hlen);     
iph = ip_hdr(frag);     
iph->tot_len = htons(frag->len);     
ip_copy_metadata(frag, skb);     
if (offset == 0)     
 ip_options_fragment(frag);     
offset += skb->len - hlen;     
iph->frag_off = htons(offset>>3);     
if (frag->next != NULL)     
 iph->frag_off |= htons(IP_MF);     
/* Ready, complete checksum */ 
ip_send_check(iph);

对于每一个分片,在处理完后,调用发送函数向下发送,这里output就是ip_finish_output2() 。

err = output(skb);

情况二:ip_finish_output2()

(编辑:云计算网_宿迁站长网)

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