使用libpcap实现tcp侦听()

使用libpcap实现tcp侦听(),tcp,network-programming,libpcap,raw-sockets,Tcp,Network Programming,Libpcap,Raw Sockets,我有一项需要修改tcp的研究工作 我想实现我版本的TCP listen()函数 我的想法是使用libpcap从特定端口捕获所有tcpsyn数据包 然后使用原始套接字创建/发送SYN/ACK和以下ACK数据包 我的问题是 传统的/常规的TCP堆栈listen()是如何实现的,有人能简要描述一下该机制吗 我的想法可以实现吗?有什么诀窍/障碍吗 是否有其他库/源代码片段可以用来实现我的需求 谢谢 如果你想知道listen()是如何实现的,那么你应该在一个自由操作系统中查看实现的源代码,但基本上它的工作

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

我的问题是

  • 传统的/常规的TCP堆栈listen()是如何实现的,有人能简要描述一下该机制吗
  • 我的想法可以实现吗?有什么诀窍/障碍吗
  • 是否有其他库/源代码片段可以用来实现我的需求

  • 谢谢

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

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


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

    您不能这样做。Libpcap不能阻止数据包被进一步处理,因此每个数据包仍将由TCP/IP堆栈的其余部分处理。因此,SYN将被确认已确认,对SYN的确认/ACKs将创建TCP连接,FINs将终止它们,等等。

    我仍然不知道TCP堆栈如何侦听()函数是设计好的,你能再详细一点吗,谢谢!你找不到比这个更详细的细节了:你绝对可以这样做。为了防止tcp/ip堆栈生成数据包,你需要做的就是不配置一个——也就是说,保持接口打开,但不配置。这意味着你必须实现任何tcp/ip堆栈/不过,您自己也可以使用ip堆栈功能。