验证UNIX和Windows的TCP乱序报文重组策略
老师说:今天听说:
两个包分别包含:ab ac但是序列号重叠一个
xp 系统重组两个包得到 aac
linux 系统重组两个包得到 abc
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