当通过原始套接字接收“syn”数据包时,如何使用“syn ack”数据包进行响应?

时间:2012-03-07 10:05:11

标签: c++ sockets tcp

我很好奇原始套接字以及如何创建它们并希望实现我自己的TCP机制。我已经阅读了一些示例,并成功地使用我自己编写的IP头发送定制的TCP数据包和UDP数据包(当然受到很多示例的影响)。我已经与Wireshark核实了数据包到达目的地,所以到目前为止一切都很好。

但是关于TCP数据包,要进行完全握手:

Client     Server
syn  ---> 
     <---  syn ack 
ack  --->

从服务器的角度来看,我需要获取syn数据包,以便将syn ack发送回客户端?

1 个答案:

答案 0 :(得分:1)

要在原始套接字上接收数据包,只需在其上调用recvrecvfrom即可。操作系统将返回发送给机器的下一个数据包的副本,其中包含标题和所有内容,其中应包含地址信息。观察目标地址,端口和传输协议,并忽略任何不符合您期望的内容。 (因为原始套接字的意思是没有内置的端口概念或操作系统可以用来将数据包路由到套接字的任何东西,它不知道将它发送到哪个程序...所以每个原始套接字应该接收每个发送到机器的数据包。意思是你可能收到很多你不感兴趣的废话。)

一旦看到发送给“你”的数据包,只需构建一个SYN / ACK数据包并将其发送到接收数据包中列为源的地址和端口。

请注意:操作系统通常会自己处理TCP和UDP数据包(包括发送ICMP“端口无法访问”或其他没有侦听器的端口的响应)...并自行处理最重要的是必然导致古怪。如果您要实现自己的TCP风格,可能需要使用不同的协议编号。 (当然,大多数客户都无法连接到它......你也必须建立一个客户端。)