一江春水向东流

做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  44 随笔 :: 139 文章 :: 81 评论 :: 0 Trackbacks

 重装TCP数据段,我看了《TCP/IP详解卷二:实现》觉得它里面的实现考虑的很全面,当然也就很复杂。而我组装只是为了监视,所以不必那么复杂,于是自己想了一个方法。现在我已经根据这个方法成功组装TCP分段,所以这个方法是可行的。另外,我的IP分片的组装用的方法跟这个方法也差不多。

    首先说下存储tcp分段的数据结构:一个二维链表,我把它叫作重装表。具有相同socket对(源ip地址、目的ip地址、源端口号、目的端口号)的tcp数据包放在一个横向的链表里,该链表的头节点只保存了源ip地址、目的ip地址、源端口号、目的端口号这些信息。如下图所示:

 

    然后介绍重装TCP数据段的方法:

1.每到来一个tcp数据包(pkt),我先将该数据包的源ip地址、目的ip地址、源端口号、目的端口号取出来在重装表(tpq_tbl)中纵向的链表中查找有没有与它相匹配的链表(fp)存在,如果有,就把pkt数据包放入与它有相同socket对的fp链中,放入链表的时,我先查找pkt的顺序号在链表中的适当位置,然后才放入;如果没有,则在tpq_tbl中新创建一个该类型的链表头节点,然后再将其放入新创建的链表中。

2.每当在fp中放入一个tcp数据段后,我就检查fp链表中的数据段是否已经到齐了(判断方法下面介绍),若到齐,就将个链表中所有数据段的数据部分拼接到一起,得到应用层报文,然后释放该链表,然后重复1-2步骤;若没到齐,直接重复1-2步骤。

 关于判断一个链表中tcp数据段是否到齐的方法:
    使用的变量说明:
    count计数器,表示当前链表中的所有tcp数据段数据部分的长度之和。每当在该链表中加入一个新tcp数据段时,我都会将count累加上该tcp数据段的数据部分的长度。
    syn_seq,表示本次tcp连接的第一个数据包的顺序号,也就是建立tcp连接时的第一次握手的SYN包的顺序号。
    fin_seq,表示本次tcp连接的最后一个数据包的顺序号,也就是关闭tcp连接时的第二个FIN包的顺序号。

    判断:当(fin_seq - syn_seq)与count相等时,就说明tcp数据段已经到齐,否则就是没有到齐。

posted on 2008-04-10 23:01 allic 阅读(3413) 评论(3)  编辑  收藏 所属分类: TCP/IP 开发

评论

# re: 关于TCP重组[转] 2009-10-01 14:44 xinwang
能不能把源码贴出来,学习一下 谢谢  回复  更多评论
  

# re: 关于TCP重组[转][未登录] 2010-01-14 17:09 秋水
万一你监视的是一个长连接,而且你监视开始时,连接已经建立,那你就无法获得syn_seq了呀
请问如何处理这种问题  回复  更多评论
  

# re: 关于TCP重组[转] 2011-01-18 21:43 坑跌呢你
这种办法局限性太大了,实验可以,没有实用性  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: