验证UNIX和Windows的TCP乱序报文重组策略

老师说:今天听说:
 两个包分别包含:ab ac但是序列号重叠一个
xp 系统重组两个包得到 aac
linux 系统重组两个包得到 abc

你实验一下是否如此?
另外win7是什么结果

 ------------------分割线------------------

这破玩意搞了我整整一天……

由于需要定义序号,所以不能用系统提供的send和recv函数发送两个关键的包了,只能自己构造。无头苍蝇般找相关的工具,找了好一会才下了libnet并安装,把sample里面的tcp1.c稍微改造了一下,添加了seq选项和ack选项,就可以使用自己指定的参数发包了。

但是需要模拟乱序报文的重组,还需要真正地把这个链接建起来。又是临急抱佛脚,幸亏有APUE,于是在两台机子上分别建了个client和server。然后打开tcpdump,打开server和client,数据传输没问题,tcpdump显示正常。接着,通过tcpdump的显示,添加手动发送的libnet包的seq号和ack号。发送!

为了获取已建立链接的seq和ack,server端需要开着tcpdump。但发送以后却不能捕获到构造的包。经老师提示,发现原来是MAC没改……改成发包的虚拟机的网卡后还是不行,破罐子破摔,把环境换到两台真正的linux机子上,就好了。

接着又遇到一个问题,server端的recv函数在每接收到一个包就会运行一次。好像没有选项能让它在接收到两个包以后再一次性读取。

于是,把server用GDB跑起来……然后在connect以后把程序阻塞在recv之前,连续把那两个包发完,然后就得到了结果。

接着把服务器的程序照着windows socket的sample写了一遍。验证的结果是:

linux、win7、xp得到了一样的结果。

发送 seq 1 : ab

发送 seq 2 : ac

recv结果: abc

即3个系统的处理情况一致,都是只对新加入的包进行追加,与已有内容重叠且内容不同的不作改动。

 

参考地址:

http://msdn.microsoft.com/en-us/library/ms740632%28v=VS.85%29.aspx
 

 

转载于:https://www.cnblogs.com/HectorInsanE/archive/2011/01/13/1934520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值