« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 登录 |
| 联系我 email: binaryluo(at)gmail.com
Blog信息 |
blog名称:二进制-虚心使人进步,骄傲使人落后。 日志总数:42 评论数量:370 留言数量:88 访问次数:638630 建立时间: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数据段已经到齐,否则就是没有到齐。
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
rex(游客)发表评论于2006/10/25 16:04:30 |
你光这样说,对我们这些初学者效果不好,我希望你叶可以给出示例代码,这样就图文并茂了,,,
还有就是你怎么得到本次TCP连接的最后一个包呢,也就是得到fin_seq呢?
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
SUPERBAO(游客)发表评论于2006/4/23 23:56:59 |
binaryluo:你好!
看了你写的[网络编程技术]NDIS截获数据包学习笔记(一),感触很深,希望你能在百忙中帮我指导一下毕业论文,题目是<<在NDIS微端口层实现网络数据包分析>>,要求是:"
在NDIS微端口层实现数据包的截获与分析,并对数据包进行分类。当前的抓包程序种类比较多,但总结起来不外乎应用层抓包和NDIS中间层抓包两种。在开
发NDIS中间层驱动时,使用现有的抓包程序往往会出现抓包程序与所开发的驱动绑定层次混乱的现象。本课题从这一实际问题入手,利用自研的专用网卡及其驱
动程序开发出一套在NDIS中间层之下的抓包程序,它将为进一步研究和开发NDIS驱动提供极大的支持。",大虾小弟谢谢
我的qq是617673439,加我好吗?
希望我们能成为好朋友!
我是解放军信息工程大学的,我等着你的好消息!
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
binaryluo发表评论于2006/4/22 12:00:13 |
以下引用icefire(游客)在2006-4-21 16:02:47的评论:我在想如果监测我们是不考虑该数据包是不是危险就可以了,那么只要根据协议头判定是不是违法协议不是就可以了吗,为什么还要对数据包进行重组呢这是根据自己的需求决定的。
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
binaryluo发表评论于2006/4/22 11:58:32 |
以下引用雪千寻(游客)在2006-4-20 16:27:03的评论:非常清晰!
如果中间有几个包永远来不了,(会有这种情况吗?)丢失了怎么办?要设置超时机制吗?
注册表是作什么用的?会出现丢包的情况的,因为我们是被动的接收数据包,所以不可能说发生丢包的时候要请求主机重新发给我们,所以出现这种情况的话是没有办法解决的。
如果出现丢包,这条不完整的数据段链将一直留在内存中。所以最好的方法就是设置个超时时限。至于说超时以后你是要继续组装这个不完整的链还是丢弃它,就看你自己的需要了。
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
icefire(游客)发表评论于2006/4/21 16:02:47 |
我在想如果监测我们是不考虑该数据包是不是危险就可以了,那么只要根据协议头判定是不是违法协议不是就可以了吗,为什么还要对数据包进行重组呢
|
回复:TCP数据段的组装 原创空间, 心得体会, 软件技术, 电脑与网络
雪千寻(游客)发表评论于2006/4/20 16:27:03 |
非常清晰!
如果中间有几个包永远来不了,(会有这种情况吗?)丢失了怎么办?要设置超时机制吗?
注册表是作什么用的?
|
|