Articles of networking

为什么在Linux内核中没有零拷贝联网?

我想知道为什么Linux内核(或任何其他主stream操作系统)没有零拷贝networkingfunction的原因? 通过零拷贝我的意思是说,一个数据包/数据stream不会被复制传递给用户空间中的应用程序,但是例如使用内存池types的分配器来共享内核和用户空间之间的内存。 我自己提出了三个理论: a)我想有安全问题。 但是,当用户空间和内核被用作缓冲区时,真的没有办法使得内存在用户空间和内核之间共享? b)我想有稳定的顾虑。 但是,我们不能假设谁使用零拷贝networking,例如需要实例化并传递一个用于内核调用的内存池,是否知道内存pipe理? 意识到足以避免泄漏? c)目前为止还没有完成/需要。 我无法真正想象没有人要求这个function,因为每个使用小包的人通常都会受到“慢”TCP协议栈实施的阻碍,并且有第三方工具提供了0复制networking以供特殊用途使用网卡。 随意张贴任何猜测,但请标记你是否承担或有更深层次的理由保持StackOverflow质量:-)

绑定地址和Mysql服务器

我试图configurationmysql服务器时遇到绑定地址。 我想要configuration绑定地址的细节在下面的链接中。 多个主机名和多个权限? 现在,我想了解绑定地址的用途。 在这个意义上,是一个绑定地址我们分配给主机的MySQL服务器的地址? 我没有任何线索。 如果有人能解释我的目的,那真的会有帮助吗? 并将0.0.0.0绑定地址分配创build任何安全漏洞/循环孔?

如何在Java上支持IPv4和IPv6

我们的一个Java程序启动时,它只能监听IPv6(8080) 例如 # netstat -ntpl Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN – tcp6 0 0 :::8080 :::* LISTEN – tcp6 0 0 :::22 :::* LISTEN – 问题是不能从外部访问(localhost除外),解决这个问题,我有这个手动添加 -Djava.net.preferIPv4Stack=true 但是这使得这个程序只能用于IPv4networking。 是否有可能像上面的sshd一样,都支持IPv4和IPv6?

使用C中的Linux中的Raw套接字进行数据包嗅探

我需要在Linux中编写一个数据包嗅探器来检测发送的HTTPS数据包,并保存请求中的url。 我发现这个安全怪胎的代码,并运行它。 这个代码运行,只能嗅探收到的数据包,但我需要在嗅探器中获取发送的数据包。 如何在这个代码中获取发送的数据包? 我不能使用像libcap(禁止)的任何库。 代码是: sniffer.c

如何获得Linux中使用C的开放套接字列表?

有没有办法在Linux中使用用户空间或内核中的C获得所有打开的套接字(套接字地址或套接字描述符)列表? 谢谢

绑定在客户端代码连接之前

我有多个以太网I / F。 eth0,eth1,eth2 …我想连接到外部服务器,例如1.2.3.4:80。 我的连接是好的,但在某些特殊情况下,我想连接为eth1而不是eth0。 服务器的代码检查我的接口的IP地址。 我认为我需要绑定之前连接。 没有绑定(2)服务器总是从eth0获取数据包 我正在查找演示此行为的代码。 有人有一个例子的链接?

如何彻底销毁C中的套接字连接

我使用套接字在linux中创build了一个聊天客户端,并且我希望完全破坏这个连接。 以下是代码的相关部分: int sock, connected, bytes_recieved , true = 1, pid; char send_data [1024] , recv_data[1024]; struct sockaddr_in server_addr,client_addr; int sin_size; label: if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("Socket"); exit(1); } if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) { perror("Setsockopt"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(3128); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero),8); if (bind(sock, (struct […]

如何捕获内核模块中的networking帧

我想在某些网卡接收到帧的时候捕获帧; 从中提取一些信息(目前我需要捕获源MAC和源IP地址); 将这些信息保存在一些公共数据结构中; 并让框架上升到TCP / IP协议栈。 我以前使用Netfilter,但显然它不提供链接层挂钩。 有什么办法可以做到这一点? 我正在把它写成一个内核模块。 运行Linux内核2.6.32

AF_UNIX套接字开销?

我看到有一对AF_UNIX套接字通过调用创build一对奇怪的东西,例如: socketpair(AF_UNIX, SOCK_STREAM, 0, sfd); 其中sfd是文件描述符的int [2]数组。 首先,默认缓冲区大小似乎是122K(124928字节),而不是来自/ proc / sys / net的任何内容(例如设置为128K的wmem_default)。 有谁知道这个奇怪的缓冲区大小的原因? 其次,通过套接字(8字节)写小信息。 在写块之前我只能写423个字节,只有8 * 423 = 3384个字节,还有一个奇怪的大小。 这些消息就好像它们每个都占用了295+个小字节。 这种开销的来源是什么? 在RHEL6上运行(2.6.32,64位) 我编写了一个程序来尝试不同大小的数据来比较开销成本: #include <errno.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define DATA_SIZE 4 void run(size_t size) { int sfd[2]; if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) == […]

在linux内核中增加一个新的networking协议

我知道在linux内核中,我们可以在传输层添加自己的协议,类似于TCP,UDP等。 是否有任何钩子在networking层注册一个新的协议,类似于IP,ARP,它可以将数据包传输到应用程序,以及如何将这个协议添加到Linux内核?