Articles of networking

如何用可加载模块修改Linuxnetworking堆栈?

对于一个项目,我们要修改所有在networking栈上移动的数据。 理想情况下,这应该与协议无关,并应无缝融入“正常”networking堆栈。 基本上,每个数据位必须首先在我们的设备上路由,然后再传递给networking堆栈的其余部分。 在这幅图中,设备应该位于第二层和第三层之间的某处。 我的第一个想法是修改socket.c中的代码( 该图显示了networking数据的常用内核stream程 ),在继续进行正常操作之前先将数据写入我们的设备,但是最好能够加载此function以一个内核模块为例),所以用户可以把它关掉,如果他想。 所以我的问题是:有什么办法可以编写内核模块插入到networking堆栈来获取和修改传入和传出的数据? 提前感谢!

如何使用Azure CLI资源pipe理部署模式创build端点(入站安全规则)?

我正在使用资源pipe理部署模式(arm模式)创build端点(如果这是它仍然被称为)。 我目前正在使用资源pipe理部署模式在Azure中创build虚拟机,因为每篇文章实际上都build议将其作为首选方式。 我在Azure中创build了一个Ubuntu Linux虚拟机,希望能真正将Azure用作Linux虚拟机的云平台。 尽pipe新的Azure门户不断发展(可以肯定会改进文档),但我仍然使用新的Azure门户,通过networking安全组(NSG)资源创build了端点。 但是,我仍然无法通过Azure CLI创build端点(如果这就是它所称的),我只是得到“错误:”端点“不是一个azure色的命令,请参阅”azure色的帮助“。 信息。 我已经阅读了Azure文档,知道我需要执行azure login命令,并执行azure config mode arm命令,因为我使用资源pipe理部署模式来创build我的虚拟机。 当我input命令azure vm –help ,我没有看到有关vm create endpoint ,这导致我相信这个命令在资源pipe理模式下不受支持。 如果我使用资源pipe理部署模式创build了Ubuntu Linux VM,我将如何使用Azure CLI创build端点或更具体的入站安全规则?

使用python RAW套接字的TCP握手

我正在使用python RAW套接字实现TCP握手。 然而,Linux内核很烦人,因为它试图处理这个协议的某些方面。 例如,当我发送一个SYN数据包时,服务器响应一个SYN,ACK数据包; 内核自动响应RST包重置连接。 我克服了这一点,我使用下面的iptable规则丢弃所有这样的重置数据包: -A OUTPUT -p tcp -m tcp –sport 999 –tcp-flags RST RST -j DROP 现在我想接收服务器发送的SYN,ACK包并将其打印出来。 但是当我做以下事情时我什么也收不到: a = self.s.recvfrom(4096) 我怀疑内核正在丢弃的SYN,ACK之前,我可以用我的套接字recv它。 有谁知道一个合理的解决方法?

为什么不是我的端口暴露? 包括netstat输出

这是我的问题 # docker exec -ti root_web_1 bash [root@ca32f79bdc14]# curl couchdb:5984 curl: (7) Failed to connect to couchdb port 5984: Connection refused [root@ca32f79bdc14]# curl redis:6379 -ERR wrong number of arguments for 'get' command -ERR unknown command 'Host:' -ERR unknown command 'User-Agent:' -ERR unknown command 'Accept:' ^C 题 为什么我不能访问couchdb:5984 ? 背景 当我在我的couchdb容器中,我可以curl localhost:5984 ,它响应和netstat -nl给我 Proto Recv-Q […]

Linux,了解setsockopt()PACKET_FANOUTnetworking缩放

我已经阅读了包手册页和几个博客 | 试图了解如何使用PACKET_FANOUT套接字选项来扩展接收数据的处理(我正在寻找使用SOCK_RAW以高速,> 10Gbps捕获stream量)。 我已经阅读了这个示例代码(复制下面),但我不知道我是否完全理解它。 让我们想象一个场景; RSS已经在网卡上设置,入口stream量在RX队列之间均匀分布,有8个核心CPU和8个NIC接收队列,每个RX队列[0-7]分别向CPU [0-7]发送一个中断关于MMAP,零拷贝,poll()等的进一步讨论在这里是脱离主题的)。 这是我在示例代码中看到的事件顺序: 8个工作线程[0-7]被启动,每个线程被固定到CPU [0-7]。 每个线程使用setup_socket()绑定到相同的物理网卡,promisc模式和同一个FANOUT组的所有部分,创build一个套接字(我们再次说0-7)。 现在我们有(例如)工作线程0绑定到创build套接字0的CPU 0上。这个线程进入一个无限循环,只对套接字0调用read()。 当数据包进入NIC RX队列0时,将向CPU 0发送中断。CPU 0将数据包DMA写入内核接收缓冲区空间。 PACKET_FANOUT套接字选项与PACKET_FANOUT_CPU标志一起使用,所以只有当数据包进入(核心0)的同一个CPU核心上的套接字才会显示数据可用的数据时,对该套接字执行read()调用(所以套接字0创build只有线程0),然后数据被复制到该线程的用户态接收缓冲区,因为这个标志。 第四点是我理解这个过程的主要疑问。 我是否正确理解了在这种情况下如何使用PACKET_FANOUT进行扩展以及如何将工作线程locking到处理中断的相同内核? void start_af_packet_capture(std::string interface_name, int fanout_group_id) { // setup_socket() calls socket() (using SOCK_RAW) to created the socketFD, // setsockopt() to enable promisc mode on the NIC, // bind() to bind the socketFD to NIC, // […]

任何好的C ++ / C NNTP库?

我偶然发现了一些有限的努力,但是我想知道是否有一些真正的function,我错过了,最好在C ++中,但是C总比没有好。

防止线程写入同一个文件

我在Linux内核2.4(家庭作业)中实现了一个类似于FTP的协议,并且我的印象是,如果一个文件被打开以便任何后续的尝试通过另一个线程打开它将会失败,直到我实际尝试并发现它通过。 我如何防止这种情况发生? PS:我正在使用open()打开文件。 PS2:我需要能够访问现有的文件。 我只是想阻止他们同时写入。

为什么我会从bind()而不是从listen()获得EADDRINUSE?

在一个C ++ Linux应用程序中,我调用了socket(),bind()和listen()来创build服务器套接字。 通常,如果应用程序启动两次(使用相同的服务器端口),则在第二个进程中,bind()将失败,并显示EADDRINUSE错误。 但是,现在我有一个情况下,bind()显然已经成功,但随后的listen()调用抛出了EADDRINUSE错误… 这可能是一个罕见的竞争条件,但我仍然会对第二个bind()成功,但是第二个listen()没有成功的情况感兴趣。 有没有人知道更多关于这种情况? 这是在32位RHEL 5.3上。

pthread_mutex_lock错误

#include "MutexCondition.h" bool MutexCondition::init(){ printf("MutexCondition::init called\n"); pthread_mutex_init(&m_mut, NULL); pthread_cond_init(&m_con, NULL); return true; } bool MutexCondition::destroy(){ pthread_mutex_destroy(&m_mut); pthread_cond_destroy(&m_con); return true; } bool MutexCondition::lock(){ pthread_mutex_lock(&m_mut); return true; } bool MutexCondition::unLock(){ pthread_mutex_unlock(&m_mut); return true; } bool MutexCondition::wait(){ pthread_cond_wait(&m_con, &m_mut); return true; } bool MutexCondition::signal(){ pthread_cond_signal(&m_con); return true; } 我正在做一个networking编程,我有这个扩展MutexCondition的Sound类 #ifndef SOUND_H_ #define SOUND_H_ #include <list> #include "SoundMetaData.h" #include […]

C PF_PACKET链路层处理

我试图找出存储在“缓冲区”后的数据结构如下: sock=socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_IP)); recvfrom(sock, buffer, 2048, 0, NULL, NULL); 我想能够捅入数据结构,并在链接层,IP层和TCP层读取,如果它是一个TCP数据包。 我尝试了man页面和一些头文件,但是它只是遍布整个地方。 提前致谢。