抓包后,怎么确认重复的tcp包

hunterize 2007-11-01 10:31:34
1.用winpcap截获了一个完整的tcp连接,需要过滤所有重复的包,由于可能存在的网络原因导致tcp包重复发送,本来过滤吊重复包的任务是由tcp栈完成的,但是winpcap截获的是原始包,怎么来判断某个重复的tcp包呢? 我们项目的设计文档中写的是只要source ip address, source port 和 sequence number 相同就可以了,但是很显然这个是错的,会过滤掉很多有用的ack包.
2.档tcp超时重发的时候,怎么判断这包是重发并过滤掉呢?也就是说我要通过这些截获的包恢复一个应用层的数据包,比如发送的一个1m的数据.
谢谢
...全文
918 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunterize 2007-11-08
  • 打赏
  • 举报
回复
to captain_x
没弄懂你说的东西,原则上讲,tcp连接只要在syn之后每个包都带ack标志,不知道你说的ack数据和ack内容是甚么东西。我需要一些只有ack没有payload的包,是希望模拟出一个完整的tcp连接。其实这里我本来想看看有没有简单点的办法实现,看来还是要模拟tcp栈做的那些事,seq、ack、payload来还原了。不过多谢兄弟不厌其烦的和我讨论这个问题。
captain_x 2007-11-08
  • 打赏
  • 举报
回复
你要模拟一个tcp连接?
早说不就好了,实现协议栈,没有其它方法。
如果有简单的方法,tcp协议也就不会这么复杂了。
captain_x 2007-11-07
  • 打赏
  • 举报
回复
不是有个ack字段吗?里面总共有六个内容,你先检查一下是不是ack,如果是ack的话那这个数据包就是一个ack数据
里面也可能有数据内容,也可能只有ack内容,如果你想把ack包都保存下来的话,那么就判断一下这个,把ack保存下来就可以了。

不过我不知道你在开发什么,为什么要保存ack?
raven_young 2007-11-07
  • 打赏
  • 举报
回复
利用SEQ 和 NEXT SEQ判断。
hunterize 2007-11-07
  • 打赏
  • 举报
回复
to captain_x
能详细说说吗?怎么先检查ack字段?
captain_x 2007-11-06
  • 打赏
  • 举报
回复
那你就先检查ack字段
hunterize 2007-11-05
  • 打赏
  • 举报
回复
to WingForce
多谢,可能我条件没讲清楚,其实,我已经过滤了一个完整的tcp连接,这个时候我不用指定destip和destport就可以过滤重复包了
to captain_x
这样做会过滤掉ack包,ack包我一定要保留
WingForce 2007-11-03
  • 打赏
  • 举报
回复
source ip address, source port 和 sequence number 相同就可以了
===================================================================================================================
明显漏了destintion port嘛,呵呵
captain_x 2007-11-03
  • 打赏
  • 举报
回复
难道是我理解错了?
你不就是要找到重发的ip包吗?
那tcp序列号一样的不都是重发的吗?你把seq一样的只保存一份不就可以了?
做协议分析不是这样搞的吗?
hunterize 2007-11-02
  • 打赏
  • 举报
回复
to captain_x
多谢,我讲的也不是这个,复杂的网络环境中都可能出现seq相同的包,比如说tcp超时重发,也有可能是路由器那里出现的重发ip分片,我现在想把抓到的包,过滤,排序,然后恢复成应用程数据.过滤这一步用确认并删除重复的包.
龙凤呈祥焱 2007-11-02
  • 打赏
  • 举报
回复
TCP应该是根据校验和来决定是否重发的吧.自己计算就可以了.
star119119 2007-11-02
  • 打赏
  • 举报
回复
那就在數據報裏面加兩個標誌位,一個代表是 那一次通信的id另外一個是這個包的發送次數。

我以前一個項目是這麽做的。

服務器程序發送數據包,第一次發送的時候,發送次數為0,如果超時或者出錯,發送次數加1。

然後數據包裏面有一個通信id,發送的id決定這個數據是針對哪一個業務的通信。
captain_x 2007-11-02
  • 打赏
  • 举报
回复
http://hi.baidu.com/starlg/blog/item/4e5b62592990602a2934f04b.html
captain_x 2007-11-02
  • 打赏
  • 举报
回复
tcp的包头里面有个标志位,具体叫什么忘记了,它是随着包的发送而递增的,递增的规则是每次发送的字节数,比如本来是1的,这次的这个包里有40个字节的数据,那么下个包的序列号就是41了,可以根据这个来判断
具体楼主再查下资料吧,好像就是叫序列号
hunterize 2007-11-02
  • 打赏
  • 举报
回复
to star119119
你可能误会我的意思了,我希望确认的不是我们在应用层写的数据报,而是本来应该有tcp栈完成的tcp包的重复和排序,因为winpcap截获的是ethernet frame.

to aaronwang81,
谢谢,但是checksum,并不能检查出tcp由于超时重发的包,还有某些因为路由器重发的ip datagram.
hunterize 2007-11-01
  • 打赏
  • 举报
回复
多谢star119119,但是问题是tcp的包都没有过滤,排序,就算知道应用层数据中的id也没有用
star119119 2007-11-01
  • 打赏
  • 举报
回复
只能在数据里面加上一个 发送id,用这个判断一下。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧