我们说一下网络收发的常见问题

1.网络收发过程中的缓冲区的位置,主要是对收发队列 缓冲区位置的疑问

在Linux网络中,我们涉及了多个队列和缓冲区

网卡收发网络包的时候,通过DMA方式进行交互的环形缓冲区

网卡中断处理程序为网络帧分配的,内核数据结构 sk_buff 缓冲区

应用程序通过套接字接口,与网络协议栈交互时候的套接字缓冲区

对应的缓冲区,都在内核管理的内存中

其中环形缓冲区,需要DMA和网卡进行交互,理应属于网卡驱动的范围

sk_buff 缓冲区,维护网络帧接口的双向链表,链表的每一个元素都是一个网络帧,在不同网络层之间的传输中,传递的是其指针,避免数据复制

套接字缓冲区,和应用程序直接交互的区域,包含发送和接收的缓冲区

至于这些缓冲区和Buffer Cache的关系

Buffer是直接和块设备交互的,其他的都是Cache

sk_buff 套接字这些内存占用,都是用的slab分配器管理的

内核协议栈的运行时交由那些内核线程进行的处理呢?

包含多个不同的线程,但是主要的线程是软中断线程,由专门的内核线程 ksoftirqd,每个CPU一个,比如2个CPU时候,就有ksoftirqd/0 和 ksoftirqd/1两个内核线程

最大连接数是不是受限于65535个端口

先说结论,并不是,但不是之中,还分为了客户端和服务器端,

因为对于网络收发,是由一个五元组标识为一个连接的

源IP 源端口 目的IP 目的端口 协议栈

客户端每次发起连接,都需要一个本地端口去连接远端服务器,故受端口号的限制

服务器端的应用程序则是利用的端口进行的监听,等待客户端的连接

但是客户端的IP和端口是可变的,如果不考虑IP地址分类和资源限制,那么服务器端的理论最大连接数,可以达到2的48次方

但是,受限于物理资源和网络协议栈等问题,实际连接可能C10K都达不到

多个应用程序共享一个端口,NAT可以正常工作吗

是可以正常工作的,因为每个连接都有自己的信息,一个连接的标志需要五元组,五元组不是相同的话,网络连接就是正常的

但是如果连接数很大的话

可能出现,NAT后都是一个IP,这就需要源端口进行区分,端口号这就成了连接数的限制

除此外,带宽等问题,都是潜在的瓶颈

发表评论

邮箱地址不会被公开。 必填项已用*标注