Articles of networking

unix / linux套接字中的阻塞模式是如何工作的?

阻塞模式是否将该特定任务置于“进程等待”状态,因为我认为非阻塞套接字需要来自用户的“忙等待”或“自旋locking”实现。 或者阻塞模式套接字只是内核的繁忙等待的隐式实现。 在信号量/互斥/监视器之类的locking机制中,通常通过将任务推入阻塞状态来实现locking。 我认为,如果这样的事情是可能的locking,然后套接字locking也可能以同样的方式实现。 我不知道,我认为轮询不是一个有效的方法,尤其是内核,因为内核总是有他的双手充满了这么多的任务。 谢谢。

如何将一个原始的L2数据包作为传入数据包注入到Linux上的接口?

我需要在Linux中将某些L2数据包(定制的)作为传入数据包注入特定接口,以testing运行在其上的一些应用程序。 有什么库(python首选)/例子,可以帮助吗? 我正在浏览Scrapy库,但看起来它只能将数据包作为传出数据包注入networking?

链接的docker集装箱之间的通信

我有两个docker集装箱在主机上的以下设置: 容器1 – UDP端口5043映射到主机端口5043(0.0.0.0:5043:5043) 容器2 – 需要以UDP方式将数据发送到端口5043上的容器1。 情况1 我启动Container 1并获取它的IP地址。 我使用这个IP地址并configurationContainer 2并启动它。 容器2能够通过调用udp://Container_1_IP:5043发送UDP数据到容器1 一切工作! 情景2 我通过将5043 UDP端口映射到主机的5043端口( 0.0.0.0:5043:5043 )来启动Container 1 我使用“ – 链接”链接容器2和容器1。 现在,当Container 2调用URL udp://Container_1_IP:5043 ,会出现错误“ Connection refused ”。 我确实能够使用IP从容器2内部ping容器1。 任何帮助,以获得scheme2为我工作将非常感激!

用很多系统呼叫等待分析networking软件/分析软件

我正在研究一个复杂的networking软件,我无法确定如何提高系统性能。 特别是在使用阻塞同步调用的软件的一部分中。 由于这部分系统正在进行繁重的计算,所以几乎不可能确定这个组件的慢度是由这些计算引起还是等待系统的其他部分。 是否有轻量级的分析器可以捕获这些信息? 我不能使用像valgrind这样的重型轮廓,因为这样会完全扭曲结果(虽然valgrind会是完美的,因为它捕获了所有必需的信息)。 我试图使用oProfile,但我只是无法得到任何有意义的结果(也许如果有一个简明的教程的地方…)。

UDP服务器给分段错误

我用UDP写了下面的echo服务器,但是我不知道为什么在sendto函数中给我分段错误,它收到很好,但是发送数据返回给客户端有问题。 我一直试图find几个小时的问题,但没有得到任何地方。 请有人指出错误,或者我可能做错了什么。 谢谢 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #define true 1 #define false 0 int main(int argc,char **args){ int BUF_LENGTH=101; int port_no=1800; struct sockaddr_in serv_addr,rmt_addr; //rmt_addr=malloc(sizeof(struct sockaddr_in)); char *buffer=malloc(BUF_LENGTH); int byte_recv=0; int rmt_length=0; int sock_id; sock_id=socket(AF_INET,SOCK_DGRAM,0); if(sock_id<0){ printf("Error creating socket : %d",sock_id); return […]

Linux:如何将整个数据包发送到另一台主机上的特定端口?

我已经使用libpcap捕获了一个TCP数据包,并且我想把这个整个数据包(不用修改它)发送到另一个主机上的另一个端口上的另一个嗅探器。 有什么办法可以做到这一点? 非常感谢!

在单独的TCP段中发送数据,而不被TCP堆栈合并

在Linux上(内核3.0.0.12; C ++与GCC 4.6.1)我想通过(POSIX)send-call发送几个TCP数据包。 使用Wireshark,我可以看到数据包不是在单独的TCP帧中发送的,而是两个或更多的数据包在一起发送。 有没有办法告诉系统从一个send()缓冲区发送数据到自己的TCP数据包中? 程序stream不应该阻塞在发送呼叫。

sendmsg()中的辅助数据如何工作?

sendmsg()允许发送辅助数据到另一个套接字,我想知道这是如何工作的。 1)辅助数据是否与正常消息一起打包? 2)如果是这样,一个远程接收套接字如何知道如何parsing这个? 3)远程接收客户端如何检索这些辅助数据? 谢谢。

以编程方式获取networking链接types和速度

我不知道是否有一个更紧凑的方法来find链接速度和Linux中的networking接口的types(无线,以太网),而不是打开并读取/sys/class/net/eth0/type和/sys/class/net/eth0/speed文件。 如果没有,谁能告诉我在哪里可以find/sys/class/net/eth0/type返回的数字,在哪种networkingtypes对应? 编辑:它变得更糟! 经过一些无线的实验, /sys/class/net/wlan0/type也返回1,而/sys/class/net/wlan0/speed不存在,我必须从/sys/class/net/wlan0/wireless/link有时会返回不正确的速度。 例如在54Mbits卡中有时会返回55。 提前致谢!

为什么getsockopt()不会返回TCP_MAXSEG的期望值?

我试图以编程方式configuration我的TCP连接的MSS在GNU / Linux系统,特别是Ubuntu 12.04,内核3.2.0-68-generic 根据男子7 tcp TCP_MAXSEG传出TCP数据包的最大段大小。 如果在连接build立之前设置了这个选项,它也会改变在初始数据包中通告给另一端的MSS值。大于(最终的)接口MTU的值不起作用。 技术合作计划还将对所提供的价值施加最小和最大限度的限制。 这让我想我可以在连接TCP套接字之前configuration该值。 我写了一小段代码来创build套接字,我使用setsockopt()来configurationMSS。 在我的testing中,我将这个mss设置为1000B。 代码调用setsockopt()后跟getsockopt()来仔细检查已正确configuration的值。 两个系统调用都返回0(没有错误)。 之后,我连接到远程主机通过tcpdumpvalidation使用的MSS是正确的。 在这里我看到: getsockopt()返回的MSS值始终为536字节 tcpdump显示syn包中configuration的MSS 修改我的代码以在连接套接字后configurationMSS。 getsockopt()返回的MSS值是1448 Bye 有没有解释这种行为的正确方法? 几个注意事项: 根据维基百科536 B = MaxIPDatagramSize – IPHeaderSize – TcpHeaderSize这是为了避免IP数据包碎片。 创build一个套接字并连接它(没有setsockopt()调用),显示由getsockopt()返回的536 B的mss,但tcpdump在SYN数据包中显示一个1460 B的公告,这是有道理的1500 – IpHeader – TcpHeader 下面,如果你有兴趣,是我的代码: int setSocketMss( int i_sd, int i_mss ) { int res = 0; int mss = i_mss; […]