首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > 《TCP/IP详解,卷2:实现》读书笔记-IP分片和重组
【标  题】:《TCP/IP详解,卷2:实现》读书笔记-IP分片和重组
【关键字】:TCP,IP,IP
【来  源】:http://blog.csdn.net/stevenmou/archive/2007/04/14/1564613.aspx

《TCP/IP详解,卷2:实现》读书笔记-IP分片和重组

 
IP具有一种重要功能,就是当分组过大而不适合在所选硬件接口上发送时,能够对分组进行分片。过大的分组被分成两个或多个大小适合在所选定网络上发送的IP分片。而在去目的主机的路途中,分片还可能被中间的路由器继续分片。在目的主机上,一个IP数据报可能放在一个IP分组内或者多个IP分组内。因为各个分片可能以不同的路径到达目的主机,所以只有目的主机才有机会看到所有分片。因此,也只有目的主机才能把所有分片重装成一个完整的数据报,提交给合适的运输层协议。
IP首部内有三个字段实现分片和重装:标识字段(ip_id)、标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位比特)。标志字段由三个1bit标志组成。
1) 比特0是保留的,必须为0;
2) 比特1是“不分片”(DF)标志,如果将这一比特置1,IP将不对数据报进行分片,这时如果有需要进行分片的数据报到来,会丢弃此数据报并发送一个ICMP差错报文给起始端。
3) 比特2是“更多分片”(MF)标志。除了最后一片外,其他每个组成数据报的片都要把该比特置1
片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
BSD中,标志和偏移字段结合起来,由ip_off访问。ip_id标识了特定数据报的分片,ip_off确定了分片在原始数据报内的位置,除最后一个分片外,MF标识每个分片。
 
 
下面先简单讲一下IP分片的流程:
1)当IP需要分片时,会从原来的分组中把IP首部和IP选项复制到新的分组中,IP首部复制在一个结构中,只复制那些将被复制到每个分片中的选项。
2)设置分片包括MF比特的偏移字段(ip_off)。如果原来分组中已设置了MF比特,则在所有分片中都把MF置位。如果原来分组中没有设置MF比特,则除了最后一个分片外,其他所有分片中的MF都置位。
3为分片设置长度,以网络字节序存储长度。
4)从原始分组中把数据复制到分片中。调整新创建的分片的mbuf分组首部,使其具有正确的全长。把新分片的接口指针清零,把ip_off转换成网络字节序,计算新分片的检验和。通过m_nextpkt把该分片与前面的分片链接起来。
 
在讲IP重组之前,先介绍一下ipq的结构:
struct ipq {
    
struct ipq *next,*prev;    /* to other reass headers */
    u_char ipq_ttl;        
/* time for reass q to live */
    u_char ipq_p;          
/* protocol of this fragment */
    u_short ipq_id;         
/* sequence id for reassembly */
    
struct ipasfrag *ipq_next,*ipq_prev;
                    
/* to ip headers of fragments */
    
struct in_addr ipq_src,ipq_dst;
};
 
struct ipasfrag {
#if BYTE_ORDER == LITTLE_ENDIAN 
    u_char ip_hl:
4,
        ip_v:
4;
#endif
#if BYTE_ORDER == BIG_ENDIAN 
    u_char ip_v:
4,
        ip_hl:
4;
#endif
    u_char ipf_mff;        
/* XXX overlays ip_tos: use low bit
                     * to avoid destroying tos;
                     * copied from (ip_off&IP_MF) 
*/
    
short   ip_len;
    u_short ip_id;
    
short   ip_off;
    u_char ip_ttl;
    u_char ip_p;
    u_short ip_sum;
    
struct ipasfrag *ipf_next; /* next fragment */
    
struct ipasfrag *ipf_prev; /* previous fragment */
};
具体结构的组织信息如下下图所示:
1)所有结构都放在一个mbuf的数据区内。
2)ipq链表由next和prev链接起来的ipq结构组成。每个ipq结构保存了唯一标识一个IP数据报的四个字段。
3)当作为分片链表的头访问时,每个ipq结构被看成是一个ipasfrag结构。这些分片由ipf_next和ipf_prev链接起来,分别覆盖了ipq结构的ipq_next和ipq_prev成员。
4)每个ipasfrag结构都覆盖了到达分片的ip结构,与分片一起到达的数据在缓存中跟在该结构之后。ipasfrag结构中的字段ipf_mff,ipf_next,ipf_prev的含义与其在ip结构中不太相同。
 
IP重组的流程:
1)由于ip_off包含DF比特、MF比特以及分片偏移,如果MF比特或分片偏移非零,则DF就被掩盖掉了,分组就是一个必须被重装的分片。如果两者都为零,则分组就是一个完整的数据报,不需要进行重组。
2)在一个全局双向链表i p q上记录不完整的数据报。分片是由4元组{ip_id、ip_src、ip_dst和ip_p}唯一标识的,利用这个4元组作为匹配项对表ipq进行线性搜索,为当前分片找到合适的数据报。
3)修改ip_len,从中减去标准IP首部和任何选项,把MF标志复制到ipf_mff的低位,把ip_tos覆盖掉。用8乘ip_off,把它从以8字节为单元转换成以1字节为单元。ipf_mff和ip_off决定ipintr是否应该重组。
4)通过把当前分片与以前收到的分片组合在一起,能重装成一个完整的数据报,它就返回指向该重装好的数据报的指针。如果没有重装好,则保存该分片,跳到next去处理下一个分片。如果重装处理产生一个完整的数据报,就把这个完整的数据报上传给合适的运输层协议。 
网络工程——企业网络规划(ppt版):【上一篇】
杀毒软件介绍:【下一篇】
【相关文章】
  • UpdatePanel 内部的JavaScript 问题—— C#弹出对话框
  • javascript 和 上传文件的问题
  • 单网卡双ip双网关,更换网线自动上网的方法
  • 转贴:JavaScript 对象与数组参考大全
  • [原创]JavaScript版仿Windows扫雷(源码2)
  • Web 2.0应用存在缺陷 Javascript导致泄密
  • 有关HIPS的一些概念及相关软件介绍
  • 主流HIPS产品深度测试
  • 在myEclips中轻松建立DispatchAction
  • java zip 中文问题
  • 【随机文章】
  • .Net的精髓-XML和SOAP(二)
  • 看看这么多版本的linux
  • 路由器OSPF协议配置命令<一>
  • asp 也可以对象化写程序
  • 动态添加CEdit控件的值
  • 对于破解的一些想法
  • 错误代码中文查询GetLastError返回代码的含义
  • 纽约时报 历史上的头版头条 2006年2月
  • linux使用技巧
  • [转载]Debian下关闭触控板
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.