Articles of tcp

可以在Unix域套接字上使用SO_REUSEPORT吗?

Linux内核> = 3.9允许在内核负载平衡的进程之间通过设置SO_REUSEPORT共享套接字: http : //lwn.net/Articles/542629/ 这怎么可以用于AF_UNIXtypes的套接字? 看来,它只适用于TCP,而不是Unix域套接字。 这是一个Pythontesting程序: import os import socket if not hasattr(socket, 'SO_REUSEPORT'): socket.SO_REUSEPORT = 15 if True: # using TCP sockets # works. test with: "echo data | nc localhost 8888" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) s.bind(('', 8888)) else: # using Unix domain sockets # does NOT work. […]

多个以太网接口 – 如何创build一个单独的networking和从C代码访问

我有一个Linux设备(实际上是一个用于原型的BeagleBoard),带有两个以太网适配器。 我想要的是这样的: 主要以太网接口(eth0)连接到客户端的networking(可能是DHCP或分配一个静态IP)。 第二个以太网接口(eth1)直接连接到另一个Linux板。 Beagle上的用户级C程序可以侦听来自客户端networking的传入连接(在eth0上),根据需要进行响应,并可能在eth1上连接到其他设备 我们希望第二台设备完全隐藏在networking的其他部分,这样只有Beagle上的程序才能连接到它。 我希望两个接口可以完全分开,我的代码可以select想要监听/打开连接的接口。 典型代码: socket_desc = socket(AF_INET, SOCK_STREAM, 0); memset(&client_addr, 0, sizeof(client_addr)); client_addr.sin_family = AF_INET; inet_pton( AF_INET, address, (void *)(&(client_addr.sin_addr.s_addr)) ); client_addr.sin_port = htons(port); /* Connect to remote on TCP port: */ connect(*socket_desc, (struct sockaddr*) &client_addr, sizeof(client_addr) ); … 我们可以设置地址和端口连接,但不能设置以太网接口。 我find了这个答案 。 这是否意味着我所要实现的内容必须留给内核路由? 我知道我可以将eth1设置在自己的子网上,但是我有一个问题:鉴于我们对客户端networking一无所知,我怎么知道我使用的任何子网不会最终冲突与客户的networking? 例如,我在这里使用192.168.1.0,所以我可以把eth1放在192.168.0.0上,但是如果客户端使用那个范围呢? 我们不希望为每个部署重新configurationeth1及其连接设备的设置,尽pipe我们可能必须configurationeth0。 那么有没有更好的方法来做到这一点? 或者可能是一个保留的IP地址范围,我可以使用eth1上的子网,这是保证不会冲突客户端的networking(如169.254.1.x)? 对不起,这有些含糊,但我已经search了几天,可能变得更困惑,而不是更less。 编辑 – […]

我怎样才能得到与TCP套接字关联的接口名称/索引?

我正在写一个TCP服务器,需要知道每个连接从哪个接口到达。 我不能使用地址/子网来推断使用哪个接口,因为可能有接口具有相同的地址/子网值。 它基于Linux,不需要代码是可移植的。 我能find的所有函数都是通过索引获取所有接口或单个接口。 我找不到任何方式来获得与接受的TCP套接字关联的接口。 有任何想法吗? 我错过了什么? 编辑:重申,在我的情况下,IP地址不是唯一的。 目标地址(服务器本身)和源地址(客户端)都不是。 是的,这是一个非常极端的IP计划。

使用tc模拟特定端口上的networking延迟

我试图在ubuntu上使用tc命令模拟来自源端口7000的tcp数据包的固定时间延迟。 我使用的命令是: sudo tc qdisc add dev eth1 root handle 1: prio sudo tc qdisc add dev eth1 parent 1:1 handle 2: netem delay 3000ms sudo tc filter add dev eth1 parent 1:0 protocol ip u32 match ip sport 7000 0xffff flowid 2:1 这个filter似乎没有任何延迟,有人可以指出我要去哪里错了吗? 另外,有什么办法可以ping一个端口或做一些等效的testing延迟? 谢谢!

TCP ECN源代码

我已经在include / net / tcp.h中理解了TCP(net / ipv4 / tcp_input.c)的Linux源代码的问题,它已经定义了TCP_ECN_OK = 1,但是真正的意思是 tp->ecn_flags & TCP_ECN_OK 另外请在socket,sock,tcp_sock,sk_buff之间解释一下。 有没有任何解释更详细或更清楚的参考。 谢谢。 更新: 内核的networking部分主要使用两种数据结构:一种保持连接状态,称为sock (对于“套接字”),另一种保持input和输出数据包的数据和状态,称为sk_buff (对于“套接字BU FF ER“)。 这两部分都在本节中介绍。 我们还包括tcp_opt的简要描述,它是sock结构的一部分,用于维护TCP连接状态。 ( 来自“Linux Kernel 2.4.20中的networking代码的映射” )

我如何检测在Linux上的TCP死连接?

我在C上编写了一个程序,在这个程序里,客户端向服务器发送了一次信息。 我使用TCP套接字。有一段时间服务器计算,应该发送结果给客户端。 如何检测服务器或客户端上的连接是否中断?

确定TCP listen()队列中的积压连接的当前数量

有没有办法find在Linux上的TCP套接字上等待accept()的当前连接尝试次数? 我想我可以统计在每个事件循环中触发EWOULDBLOCK之前成功的accept()的数量,但是我使用隐藏这些细节的高级库(Python / Twisted)。 它也使用epoll()而不是老式的select()/ poll()循环。 我试图得到一个高性能的无阻塞networking服务器上的负载的一般意义,我认为这个数字将是一个很好的描述。 加载平均值/ CPU统计数据帮助不大,因为我在并发工作进程中执行了大量的磁盘I / O操作。 Linux上的这些统计数据中的大多数花费了等待磁盘I / O作为加载的一部分(对于我的特定服务器体系结构来说,这不是)。 accept()和response之间的延迟也不是一个好的措施,因为一旦服务器接近它,每个请求通常会得到很快的处理。 我只是试图找出我有多接近达到一个突破点,服务器不能更快地派遣请求比他们进来。

scapy中的sniff函数的filter不能正常工作

似乎snifffunction的filter不能正常工作。 我用下面的filter执行嗅探 a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010") 但有一段时间, sniff捕获这样的UDP数据包: >>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010") >>> a <Sniffed: TCP:0 UDP:1 ICMP:0 Other:0> 有一段时间, sniff捕获错误端口的TCP数据包: >>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010") >>> a <Sniffed: TCP:1 UDP:0 ICMP:0 Other:0> >>> a[0] <Ether dst=00:26:55:cb:3b:10 src=00:22:64:55:c8:89 type=0x800 |<IP version=4L ihl=5L tos=0x10 len=92 id=8683 […]

Unix vs BSD vs TCP vs Internet套接字?

我正在阅读Linux编程接口,它介绍了Linux上使用的几种不同types的套接字: Unix域 伯克利 TCP 互联网 本书所说的一件事是,如果你想在远程主机之间进行通信,你不能使用Unix域套接字,因为它们是在同一个主机上的IPC。 你必须使用“Internet”套接字。 但是,我仍然有点困惑,这是如何与“TCP”套接字,伯克利套接字和其他2? 他们的关系是什么? 为什么你会有一个Internet套接字以及一个TCP套接字? 总之,我试图理解所有的(我错过了什么?)各种不同types的Unix套接字,在什么情况下我会使用它们?

无法由ngrok ssh进入远程Linux

远程Linux在内部networking中,没有公共IP地址。 所以我安装了ngrok。 ngrok tcp 22 ngrok by @inconshreveable(Ctrl + C退出)在线隧道状态 版本2.0.19 / 2.0.17 Web界面http://127.0.0.1:4040 转发tcp://0.tcp.ngrok.io:36428 – > localhost:22 连接ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00 我检查了sshd正在运行。 在当地的电脑上,我试了一下 ssh ssh myuser@ngrok.com -p36428 这引起了 ssh:连接到主机ngrok.com端口36428:连接被拒绝