个人在极客时间、工作经验、技术博客的总结。
网络收包流程
当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。比如,在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 > 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。
高并发优化
C10K(并发1w个请求)
I/O 模型优化
- 使用非阻塞 I/O 和边缘触发通知,比如 epoll。
- 使用异步 I/O(Asynchronous I/O,简称为 AIO)(windows推荐)
工作模型优化
- 主进程 + 多个 worker 子进程/线程(如nginx)
这里要注意,accept() 和 epoll_wait() 调用,还存在一个惊群的问题。换句话说,当网络 I/O 事件发生时,多个进程被同时唤醒,但实际上只有一个进程来响应这个事件,其他被唤醒的进程都会重新休眠。其中,accept() 的惊群问题,已经在 Linux 2.6 中解决了;而 epoll 的问题,到了 Linux 4.5 ,才通过 EPOL

本文探讨了网络性能优化,从C10K问题到C1000K、C10M的并发处理。介绍了网络收包流程,高并发优化策略,包括I/O模型优化和工作模型优化,以及拥塞控制算法如TCP的Reno、Bio、Cubic和BBR。同时,提到了面对DDoS攻击的缓解措施和可靠UDP的方案,如KCP和QUIC。
最低0.47元/天 解锁文章
173万+

被折叠的 条评论
为什么被折叠?



