欢迎访问binary的Blog   虚心使人进步,骄傲使人落后。

          W3CHINA Blog首页    管理页面    写新日志    退出



«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


登录

用户名称:
登陆密码:
密码保存:


联系我
email: binaryluo(at)gmail.com

我的分类

日志更新

最新评论

留言板

Blog信息

 
blog名称:二进制-虚心使人进步,骄傲使人落后。
日志总数:42
评论数量:370
留言数量:88
访问次数:638695
建立时间:2005年2月19日




[网络编程技术]TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

binaryluo 发表于 2006/4/19 11:07:49

   重装TCP数据段,我看了《TCP/IP详解卷二:实现》觉得它里面的实现考虑的很全面,当然也就很复杂。而我组装只是为了监视,所以不必那么复杂,于是自己想了一个方法。现在我已经根据这个方法成功组装TCP分段,所以这个方法是可行的。 另外,我的IP分片的组装用的方法跟这个方法也差不多。    首先说下存储tcp分段的数据结构:一个二维链表,我把它叫作重装表。具有相同socket对(源ip地址、目的ip地址、源端口号、目的端口号)的tcp数据包放在一个横向的链表里,该链表的头节点只保存了源ip地址、目的ip地址、源端口号、目的端口号这些信息。如下图所示: 500)this.width=500'>     然后介绍重装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数据段已经到齐,否则就是没有到齐。  


阅读全文(24238) | 回复(24) | 编辑 | 精华
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

eagle0033(游客)发表评论于2008/5/8 16:23:50

我现在正在做这方面的东西 能不能给我这个重组的代码 eagle0033@163.com 


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

gauchy(游客)发表评论于2007/6/1 10:40:03

不同的高层协议,TCP分段传输是不一样的,有时打开一个页面时,连接到了多个网址,并没有启动新的TCP连接,即没有SYN的数据包,也没有FIN的数据包,而seq已经重新开始了。这种情况就无法解决了吧?欢迎讨论gauchy@163.com以下为blog主人的回复: 好久没上博了,今天回来看下才看见你的留言: 1.只要是用TCP协议传输,分段肯定是一致的,跟高层的协议无关;除非高层协议在传输层用的不是TCP协议。 2.TCP协议里边规定的3次握手,不进行握手无法进行seq序号初始协定,这种包通常会被认为错误包被丢弃。注意, 建立组装表的依据就是以收到SYN包为开始。  

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

baixue(游客)发表评论于2007/4/3 11:38:02

你好,我也有与进一步求索(游客)一样的疑问,望赐教!我的邮箱是liubin_1223@126.com thank you! 以下为blog主人的回复:  邮件已转发,请查收。 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

binaryluo发表评论于2007/1/8 23:41:43

以下引用进一步求索(游客)在2007-1-8 10:48:31的评论:      很荣幸在网上看了您一个关于“TCP数据包重组”的帖子 感觉很好,对我的帮助很大。有个问题想请教你一下,还望 不吝赐教:         问题1:            在描述判断某链表中的TCP包是否已经接收完整,您是        通过统计所有相关包的数据长度和(count),再将它同数据        包的 syn_seq与fin_seq的差比较,如果count=syn_seq-fin_seq        就表示tcp数据包都到齐了。             这里我不明白,syn_seq是tcp连接第一数据包的顺序号,        fin_seq是最后一个包的顺序号,它们的减,就总是表示整个tcp        的数据长度吗?同时,你又是以哪个、怎么判断数据包的顺序的呢?         问题2:            如果应用是在通过TCP在传输一个比较大的文件,比如2G,        您又是怎么处理这样的大文件数据包的接收的呢?全部一次性        在内存中重组完,感觉有点不现实一样!   望指教,谢谢!已在邮件中回复,请查收。 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

进一步求索(游客)发表评论于2007/1/8 10:48:31

      很荣幸在网上看了您一个关于“TCP数据包重组”的帖子 感觉很好,对我的帮助很大。有个问题想请教你一下,还望 不吝赐教:         问题1:            在描述判断某链表中的TCP包是否已经接收完整,您是        通过统计所有相关包的数据长度和(count),再将它同数据        包的 syn_seq与fin_seq的差比较,如果count=syn_seq-fin_seq        就表示tcp数据包都到齐了。             这里我不明白,syn_seq是tcp连接第一数据包的顺序号,        fin_seq是最后一个包的顺序号,它们的减,就总是表示整个tcp        的数据长度吗?同时,你又是以哪个、怎么判断数据包的顺序的呢?         问题2:            如果应用是在通过TCP在传输一个比较大的文件,比如2G,        您又是怎么处理这样的大文件数据包的接收的呢?全部一次性        在内存中重组完,感觉有点不现实一样!   望指教,谢谢! 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:TCP数据段的组装
原创空间,  心得体会,  软件技术,  电脑与网络

rex(游客)发表评论于2006/10/25 16:08:15

我的邮箱是qinfengwang@163.com,,我现在正在学这个,希望可以给我一点代码参考,谢谢先!~~ 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 2 3 4 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144778832 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号