原始套接字不是我的SYN的ACK

时间:2013-11-01 19:16:43

标签: python sockets networking tcp ip

我一直在教育自己使用原始套接字,因为我总是发现低级网络非常有趣。这里的目标不是使用原始套接字完全重新实现TCP,而是学习如何为自己进行三次握手(绕过内核)。

在我的例子中,我编写了一个小程序,它将创建一个带有用户提供的源和目标地址的IP头,填写TCP协议,组成任意16位标识,将版本设置为4,长度为5 ,以及2的标志(不分段)。 IP报头为它所处理的每个数据包执行此操作(并且工作正常,实际上除了地址和ident与已知良好的TCP SYN数据包具有相同的位)。然后它使用用户提供的端口,随机序列号,0 ACK,5的偏移量(除非选项),标志设置为2(SYN)和任意窗口大小(我一直使用32792)来制作TCP报头。我已经尝试了不同程度的TCP选项,希望其中一个可能阻碍了我的努力,所以有时这个标题已经改变了一些努力以使事情有效。

程序是用python编写的,使用地址族AF_INET的原始套接字和协议IPPROTO_RAW(虽然我也尝试过IPPROTO_TCP)。所以我启动了wireshark,并在等待TCP连接的用户应用程序上拍摄了SYN。 Wireshark显示SYN,并且没有显示与数据包相关的错误,但这就是故事的结尾......没有SYN / ACK,没有RST,什么也没有。 syslog中没有错误,用户应用程序什么都没看到,并且检查iptables确保没有防火墙规则。值得注意的是,到目前为止我所有的测试都是在同一个地址“127.0.0.1”,对于这些初始响应,唯一被欺骗的是源端口。我一直在slackware 14.0上测试它(在VM中运行)。

奇怪的是,启动客户端用户应用程序(即我所针对的简单服务器的客户端)并通过tcp套接字连接显示一个初始SYN,它只与几个字节中的数据包不同:tcp.s_port ,tcp.checksum,ip.checksum,ip.identification。然而,服务器立即用SYN / ACK响应客户端的SYN。我不能为我的生活找出我手工制作的数据包丢失的地方。为了调试这个,我关闭了TCP时间戳和窗口大小。任何人都可以对可能抑制我的事情有所了解

更新 代码在这里:http://pastebin.com/2aHWYGxb#
进一步阅读TCP校验和计算,我偶然发现了这一点:http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm
这解释了一种比我以前见过的方法不同的方法,也许这就是现在的方法呢?不太确定,但我现在正在努力。

按照上面的文章并重新实现要通过伪标头,tcp标头(校验和为0)计算的校验和函数,并且有效负载没有显示任何改进。更改后的代码可以在pastebin链接中找到:k6bwFvX6
到目前为止,我很确定问题确实存在于校验和计算中,但是对于我的生活来说,看不出它有什么问题。

经过进一步审查后,我发现我在字节而不是一半上运行校验和功能,我忘记了一个移位操作。现在一切正常,感谢那些提供帮助的人。

0 个答案:

没有答案