Articles of 联网

在不使用环回networking的情况下将数据包转发到同一台主机上

我有这个libnetfilter_queue应用程序接收来自内核的一些iptables规则的数据包。 在直接回答我的问题之前,我给了一个示例代码和其他工具来设置一个testing环境,以便我们的问题定义和可能的解决scheme可以更加准确和强大。 以下代码描述了应用程序的核心function: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <linux/types.h> #include <linux/netfilter.h> /* for NF_ACCEPT */ #include <errno.h> #include <libnetfilter_queue/libnetfilter_queue.h> #define PREROUTING 0 #define POSTROUTING 4 #define OUTPUT 3 /* returns packet id */ static u_int32_t print_pkt (struct nfq_data *tb) { int id = 0; struct nfqnl_msg_packet_hdr *ph; struct nfqnl_msg_packet_hw *hwph; u_int32_t […]

在接受连接之前或之后分叉?

以下代码片段创build了4个进程,全部共享相同的侦听套接字。 这样做有没有危险? 我应该一直有一个听取过程和叉后连接被接受,传统的方式? for (p = 0; p < 3; p++) { pid = fork(); if (pid == 0) break; } while (1) { unsigned int clientlen = sizeof(echoclient); /* Wait for client connection */ if ((clientsock = accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) { die("Failed to accept client connection"); } fprintf(stdout, "Process […]

如何通过不同的接口路由TCP / IP响应?

我有两台机器,每台都有两个有效的networking接口,一个以太网接口eth0和一个tun / tap接口gr0 。 目标是使用接口gr0在机器A上启动一个TCP连接,然后让机器B的响应(ACK等)通过以太网接口eth0 。 因此,机器A在gr0上发送一个SYN,机器B在它自己的gr0上收到SYN,然后通过eth0发送它的SYN / ACK。 tun / tap设备是一个GNU Radio无线链路,我们只是希望通过以太网来响应。 什么是最简单的方法来完成这个? 我需要对TCP / IP进行更多的研究,但是我最初认为,伪造传出数据包的源代码会告诉接收者响应欺骗地址(应该被路由到eth0 )。 这将涉及通过gr0从tun / tap接口路由IP,并将其他通信保留到eth0 。 我们正在使用Linux和Python解决scheme将是可取的。 感谢您的期待!

如何重现一个默默丢弃的TCP / IP连接?

我有一种情况,一个Java程序build立一个长期运行的TCP / IP连接到一个服务器,并且所说的连接的function与文档完全一样,除了在我的控制之外的环境中的一件事。 每个星期六,服务器都重新启动,但由于某种原因,这不能正确传达给我的客户端,所以连接只是挂起来等待响应。 这与使用过时的JDBC连接看到的行为完全相同,在服务器和客户端之间的某个路由器发现连接处于空闲状态并在没有通知的情况下将其删除。 我需要能够重现这种情况能够创build一个适当的修复。 因此,我需要知道是否有一个很好的方法来模拟路由器在我的控制下默默地放下连接? 我可以在我的开发环境和服务器之间放置一个Linux机器或Mac。 我可以在虚拟机(vmware播放器)中运行JVM,如果我可以在那里下载的话。 build议是非常受欢迎的。 编辑2012-12-18:为我工作的解决scheme是使用本地的基于Java的SOCKS5代理,可以用Ctrl-Z任意暂停,并告诉我的应用程序通过它。

ngrok如何在防火墙后面工作?

Ngrok( https://ngrok.com/ )应该允许您通过转发将本地端口和服务展示给万维网。 但是,如果我打开我的本地机器上的端口80,如下所示: ngrok 80 我回来了: Tunnel Status online Version 1.3/1.3 Forwarding http://3a4bfceb.ngrok.com -> 127.0.0.1:80 Forwarding https://3a4bfceb.ngrok.com -> 127.0.0.1:80 Web Interface http://127.0.0.1:4040 # Conn 0 Avg Conn Time 0.00ms 据我所知,任何对http://3a4bfceb.ngrok.com的请求都将通过端口80发送到本地计算机,但如果我坐在阻止传入通信的NAT /防火墙之后(这是一种非常常见的情况)。 ngrok是否会启动轮询请求以确定何时收到数据?

启用TCP_NODELAY的Linux环回性能

我最近偶然发现了一个有趣的TCP性能问题,同时运行了一些比较networking性能和环回性能的性能testing。 在我的情况下,networking性能超过了环回性能(1Gignetworking,相同的子网)。 在这种情况下,我处理延迟是至关重要的,所以TCP_NODELAY已启用。 我们提出的最好理论是TCP拥塞控制正在维持数据包。 我们做了一些数据包分析,可以肯定的看到数据包正在被占用,但是原因并不明显。 现在的问题… 1)在什么情况下,以及为什么通过回送进行通信比通过networking慢? 2)尽可能快地发送时,为什么切换TCP_NODELAY对环回的最大吞吐量有比networking更多的影响? 3)如何检测和分析TCP拥塞控制作为对性能差的一个潜在的解释? 4)有没有人有这个现象的理由? 如果是的话,任何方法来certificate这个理论? 这里是一些简单的点到点的c + +应用程序生成的示例数据: 传输消息大小(字节)TCP NoDelay发送缓冲区(字节)发送方主机接收方主机吞吐量(字节/秒)消息速率(msgs / sec) TCP 128 On 16777216 HostA HostB 118085994 922546 TCP 128closures16777216 HostA HostB 118072006 922437 TCP 128在4096 HostA HostB 11097417 86698 TCP 128closures4096 HostA主机B 62441935 487827 TCP 128 On 16777216 HostA HostA 20606417 160987 TCP 128closures16777216 HostA HostA […]

有多less线程创build和什么时候?

我有一个networkingLinux应用程序接收来自多个目的地的RTPstream,做非常简单的数据包修改,然后转发stream到最终的目的地。 如何决定我应该有多less线程来处理数据? 我想,我不能打开每个RTPstream的线程,因为可能有成千上万。 我应该考虑CPU内核的数量吗? 还有什么事呢? 谢谢。

如何将networking连接绑定到PID而不使用lsof或netstat?

有没有办法将networking连接绑定到一个PID(进程ID),而不分叉到LSF或NETSTAT? 目前正在使用lsof来查询哪个连接属于哪个进程ID。 但是,在繁忙的主机上,lsof或netstat可能会相当昂贵,并且希望避免必须分叉这些工具。 有没有类似于/ proc / $ pid的地方可以find这些信息? 我通过检查/ proc / net知道networking连接是什么,但是无法弄清楚如何将它连接到一个pid。 在/ proc / $ pid中,似乎没有任何networking信息。 目标主机是Linux 2.4和Solaris 8到10.如果可能的话,在Perl中有一个解决scheme,但愿意做C / C ++。 补充笔记: 我想强调这里的目标是将一个networking连接绑定到一个PID。 find一个或那个是微不足道的,但以低成本的方式将两者结合在一起似乎是困难的。 感谢迄今为止的答案!

客户端发送延迟FIN ACK(〜500ms)到服务器

我有一个node.js客户端(10.177.62.7)从服务器(10.177.0.1)的http rest服务请求一些数据。 客户端只需使用node.js http.request()方法(agent = false)。 客户端在Ubuntu 11.10框中。 为什么客户端在475ms之后发送FIN ACK? 为什么这么慢? 他应该立即发送FIN ACK。 我有很多这样的情况 整个通信量的1%是延迟FIN ACK的请求。 客户端上的空闲CPU约为99%,所以没有任何东西正在耗尽CPU。 如何debugging呢? 会是什么呢? 有没有我需要调整的sysctl选项? 截屏2列是数据包之间的stream逝时间。 链接到更大的图片。

使用Linux,如何指定传输哪个以太网接口数据

我正在开发一个基于Linux的服务器系统,其中有两个networking接口,都在同一个子网上(现在,我们只需说他们是172.17.32.10 & 172.17.32.11 )。 当我将数据发送到networking上的主机时,我想指定我的服务器上的数据在哪个接口上传输。 我需要能够通过软件从一个接口切换到另一个接口(或者甚至可以同时传输)(静态路由规则不适用于这个应用程序)。 我在StackOverflow中发现了一个相关的问题,build议使用netlink库来即时修改路由。 这直观上似乎应该工作,但我想知道是否有任何其他选项来完成相同的结果。