章节
为什么要实现用户态协议栈?
- 深入理解网络协议栈
- 走进Linux内核开发的第一步
- 加入开源组织,提升技术实力
- 用户态协议栈
- dpdk/netmap
- c10M的问题,千万并发
客户端发送数据到服务器,服务器接收数据的步骤:
1. 从网卡copy到内核协议栈
2. 从内核协议栈copy到应用程序
提升系统的性能,降低瓶颈,我们可以设计用户态协议栈,实现零拷贝(直接从网卡copy到应用程序,减少了一次拷贝操作)
为了使网卡的数据,直接到达我们应用程序的方案:
- mmap
- pf_ring, libcap, raw_socket.
既然原生的socket可以实现抓取到链路层的数据,是因为网卡抓取到链路层的数据不代表是抓取到网卡中的数据,使用原生的soket也会经过两次拷贝,从网卡copy到内核协议栈,从内核协议栈copy到应用程序(只是此时不会经过tcp协议栈)
mmap把外设中的数据直接映射到内存中,有了mmap的映射,就有了实现直接抓取网卡数据,netmap就是这样实现的。
netmap与dpdk对比
netmap只是纯软件方式的开源框架,dpdk的使用场景,稳定性比netmap广
C10K->C10M
c10K的解决方案:
(1) 在没有epoll出现时:
- select/poll
- 多线程/多进程
select/poll存在的问题:- 数量(1. 所有io集合的数量; 2. 设置有少量的io会被触发,成为就绪状态):一个select监控1024个fd
- 拷贝():
多线程/多进程存在的问题: - 内存:
(2) epoll的出现解决了的问题:- 数量:所有io集合的数量,把所有需要的网络io放在一起,少量io会被触发程序就绪状态
- 拷贝: 一次一次添加到整个集合
数据结构:
把所有需要的网络io放在一起
少量io会就绪
C10M的解决方案:
需要从以下几个方面来考虑
- 内存
- CPU
- 磁盘
- 网卡
- 应用程序
- 操作系统
网卡, NIC(network interface card),netmap
nic是对网卡的一层软件级封装;
etho是nic针对物理网卡的实例化对象;
netmap由两部分组成:
- 内核模块—>对nic子系统进行了扩展
- 应用程序接口
用户态协议栈之TCPIP设计
首先抛出疑问:
- 滑动窗口如何实现?
- 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不