2012-03-07 51 views
0

我对原始套接字以及如何创建它们感到好奇,并且希望实现我自己的TCP机制。我已经阅读了一些示例,并成功地发送了自定义的TCP数据包和UDP数据包以及我自己编写的IP头(当然受到很多示例的影响)。我已经检查过Wireshark数据包是否到达目的地,所以一切都很好。如何通过原始套接字接收“syn”数据包时使用“syn ack”数据包进行响应?

但对于TCP数据包,使全握手:

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

我从视server's点需要什么来获得syn包,所以我可以在syn ack发送回客户端?

+0

“我需要从服务器的角度来获得syn包“这是什么意思? – 2012-03-07 10:17:37

+0

当SYN数据包到达指定端口上的服务器时,如何捕获运行在服务器上的应用程序内的数据包? – Rox 2012-03-07 10:30:04

+0

由于你自己处理IP,网络协议会将帧传递给你的IP层,你从IP的有效载荷中取出'message',你的'message'现在包含了syn header。 – 2012-03-07 10:36:24

回答

1

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

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

请注意,操作系统通常会自行处理TCP和UDP数据包(包括发送ICMP“端口不可达”或其他端口没有侦听器的响应)......并进行自己的处理最重要的是必然会造成不正常。如果你要实现自己的TCP协议,你可能需要使用不同的协议号。 (当然,那么大多数客户将无法连接到它...你必须做一个客户端。)

+0

比从未更好的迟到,但谢谢你的回复! :-) – Rox 2013-12-29 22:37:00

+0

UDP有套接字,因此如果您正在侦听UDP,则不必担心目标地址,端口和传输协议。 – 2014-03-19 19:25:37

+0

@MooingDuck:如果你有一个UDP套接字,你不必担心 - 操作系统会为你过滤它们,只给你发送给绑定到套接字的address:端口的UDP消息。另一方面,原始套接字是非常愚蠢的 - 操作系统将所有内容都传递给您,并将其放在您身上以识别(并因此解析)您所关心的内容。 – cHao 2014-03-19 20:36:47

相关问题