【问题标题】:usng libpcap to implement tcp listen()使用 libpcap 来实现 tcp listen()
【发布时间】:2013-04-05 03:05:04
【问题描述】:

我有一项需要修改 tcp 的研究工作 我想实现我的 TCP listen() 函数版本 我的想法是使用 libpcap 从特定端口捕获所有 TCP SYN 数据包 然后使用原始套接字创建/发送 SYN/ACK 和以下 ACK 数据包

我的问题是

  1. 传统/常规的 TCP 栈 listen() 是如何实现的,谁能简单介绍一下机制?
  2. 我的想法可以实现吗?有什么技巧/障碍吗?
  3. 还有其他库/源 sn-ps 可以用来实现我的需求吗?

谢谢!

【问题讨论】:

    标签: tcp network-programming libpcap raw-sockets


    【解决方案1】:

    如果您想知道listen() 是如何实现的,那么您应该只查看免费操作系统中实现的源代码,但基本上它的工作是在与套接字关联的内核数据结构中设置一个标志这样未来传入的SYN 数据包将获得SYN|ACK 响应(并配置在应用程序使用accept() 从队列中排出它们之前应该响应多少这样的SYNs)。

    您的想法是可以实现的,但需要做很多工作:这相当于在用户空间中实现 TCP 堆栈。如果您只需要为您的研究打开和关闭连接,那么您可以免于执行大部分工作(包括慢启动、窗口缩放以及 TCP 堆栈应该具有​​的所有数据传输功能),但它仍然是一项伟大的工作。

    您需要的一件事是防火墙规则,以防止内核响应传入的 TCP 数据包,以便您的代码可以响应它们。

    【讨论】:

    【解决方案2】:

    你不能这样做。 Libpcap 没有提供阻止数据包被进一步处理的方法,因此每个数据包仍将由 TCP/IP 堆栈的其余部分处理。因此,SYN 将被确认,对 SYN/ACKS 的 ACK 将创建 TCP 连接,FIN 将终止它们等等。

    【讨论】:

    • 你绝对可以做到这一点。为了防止 tcp/ip 堆栈生成数据包,您需要做的就是不配置一个——也就是说,让接口保持打开状态,但没有配置。这意味着您必须自己实现任何 tcp/ip 堆栈功能。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多