-
一、背景
-
二、NtyTcp的微内核网络协议栈方案
-
1. 网络协议栈
-
2. NtyTCP架构图
-
3. TCP传输
-
二、用户态网络协议栈
-
1. 什么是用户态网络协议栈
-
2. TCP状态迁移图
-
四、系列推荐
现在的服务器支撑上百万个并发 TCP 连接已经不是新闻,实现 C1000k 的常规做法是调整内核参数,提高文件数,降低每个连接的内存消耗。在用户态运行 TCP/IP 协议栈意味着并发 TCP 连接不再占用系统文件数,只占内存,解决了 C1000k 的一大瓶颈,内核只要提供一个收发网络 packet 的接口就行。内核的网络协议栈强调通用性,主要是为吞吐量优化(性能指标通常是 MB/s 或 packets per second),顺带兼顾大量并发连接。为支持 C10k,要调整内核参数让每个连接少占资源,这与内核代码的设计初衷是违背的。用户态协议栈,可以根据应用的特点来剪裁协议栈功能。优化也更直接,不再是调黑盒参数组合,而是直接上 profiling,根据结果修改应用程序和协议栈的代码。用户态协议栈的吞吐量比不上内核,不过对 C1000k 的应用场合(例如 comet)应该不成问题。
二、NtyTcp的微内核网络协议栈方案
-
网络协议栈
2.NtyTCP架构图
3.TCP传输
三、用户态网络协议栈
1.什么是用户态网络协议栈
用户态网络协议栈是一套协议的规范,比如HTTP->TCP->IP,通过一个HTTP请求,先转化成TCP数据包,然后再转化成IP数据包,再通过网卡传输出去;接收方通过网卡接收到IP数据包,去掉IP数据头,检测到是一个TCP数据包,就把TCP数据包传到TCP协议处理层,去掉TCP数据头,检测到是一个HTTP数据包,就把HTTP数据包传到HTTP协议处理层。 因为所有的网络数据都是通过这样一层层的堆叠起来的协议来传送的,这一过程叫用户态网络协议栈。
2.TCP状态迁移图
四、推荐系列
五,学习更多资料及视频:
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 上课地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 群909332607备注(XMG) 获取
原文链接:
https://mp.weixin.qq.com/s/hOKk8e8bk88oFPmam-ZGcw
现在的服务器支撑上百万个并发 TCP 连接已经不是新闻,实现 C1000k 的常规做法是调整内核参数,提高文件数,降低每个连接的内存消耗。在用户态运行 TCP/IP 协议栈意味着并发 TCP 连接不再占用系统文件数,只占内存,解决了 C1000k 的一大瓶颈,内核只要提供一个收发网络 packet 的接口就行。内核的网络协议栈强调通用性,主要是为吞吐量优化(性能指标通常是 MB/s 或 packets per second),顺带兼顾大量并发连接。...
1,
Nty
TCP
介绍
Nty
TCP
是王博靖前辈开发的单线程
用户
态
TCP
/
IP
协议栈
,包含epoll实现代码,服务器案例,并发测试案例。原仓库地址: :
2,本仓库的说明
在工作中,由于要解决很多棘手问题,阅读源代码了解原理是开发人员的必修课。为了记录我的学习过程,并且也为了和他人分享我的成果,本仓库会保存我对
Nty
TCP
的详细的注释,内容会不断地更新。如果我的分享能够帮助大家进步,请告诉我,我会非常开心的。 :smiling_face_with_smiling_eyes:感谢王博靖前辈的开源精神,让我对epoll实现原理有了深刻的理解,在这里对他表示非常的感谢!
一,目录介绍
(后期补充)
二,整体框架
(后期补充)
三,更细日志
1、2019-10-25
最终到今天,初步完成的注释如下:
epoll_create()申请_
nty
_socket的详细过程,红黑树和双向链表初
Epoll 的出现
想必能搜到这篇文章的,应该对 select/poll 有一些了解和认识,一般说 epoll 都会与 select/poll 进行一些对比,select、poll 和 epoll 都是一种 IO 多路复用机制。
select 的问题
select 的问题在于描述符的限制,能监控的文件描述符最大为 FD_SETSIZE,对于连接数很多的场景就无法满足;
另外select 还有一个问题是,每次调用 select 都需要从
用户
空间把描述符集合拷贝到内核空间,当描述符集合变大之后,
用户
空间和内核空
一直关注
tcp
/
ip
的底层
协议栈
,终于有了大概的了解,通过
nty
tcp
了解
tcp
相关的底层实现,发现除了
tcp
协议栈
相关的东西,还有udp,arp,icmp(ping命令相关),以及通过netmap对网卡数据进行接收的相关基础知识点,幸好,听过king老师相关的课程,这里就简单的做一些整理。
1:概念介绍:
1:arp: 地址解析协议(
ip
层/数据链路层)
维护了计算机
ip
和mac地址(物理地址)的对应关系。 (因为
网络
通信时实际传输的是“帧”,帧里面是有目标主机的MAC地址的)
==》在TC
有很多朋友就会想到一个点,那为什么我们还需要去
设计
一个
网络协议
栈,我们不是去学这个东西就可以吗?其实我也跟大家解释一下,
其实你在那把
网络协议
上理解的很透彻的话,你一定要站在一个
设计
者的角度,
就是你抛开所有的东西,抛
用户
态
协议栈
是指把
网络协议
栈accept()、listen()等原本在操作系统中的接口,与应用程序放在一起,把
网络协议
的解析放做进程中的一部分。
用户
态
协议栈
的主要作用,是
网络
数据从网卡到应用程序拷贝过程中的系统调用次数,从而减少CPU上下文切换的次数,达到提高性能的目的。
有了
用户
态
协议栈
,对于网卡的想象空间也会增大,网卡的可操作性会更强。比如,可以通过控制网卡,将PC机做成交换机或路由器,可以过滤数据。另外,
用户
态
协议栈
可以用在网关上,因为当连接数增多,网关会成为性能的瓶颈,使用
用户
态
协议栈
可以提高网关的
一、Netmap 简介
Netmap 是一个高性能收发原始数据包的框架,由 Luigi Rizzo 等人开发完成,其包含了内核模块以及
用户
态
库函数。其目标是,不修改现有操作系统软件以及不需要特殊硬件支持,实现
用户
态
和网卡之间数据包的高性能传递。其原理图如下,数据包不经过操作系统内核进行处理,
用户
空间程序收发数据包时,直接与网卡进行通信。
代码位置:https://github.com/luigirizzo/netmap
LinuxC/C++后端技术都要学啥?
在我大学刚毕业的时候,对这个问题也一直很迷茫。
先说下我自身的情况,我本科既不是985也不是211,知乎上称这种毫无存在感的大学为普通高校,学的还是非计算机专业,比起知乎上众多其他网友人均 985,不是 C9 毕业都不好意思说上过大学。
我毕业之后通过自学后端技术进入腾讯做「后端开发」工作
如果你是985、211院校,恭喜你,起点比我高。如果和我一样,不要放弃,看看我,还有机会。
像我这样非科班、无名校光环,经历过自学计算机成功转行软件开发(有想听转行之路经历的话,点
原始的
网络
请求,需要数次在
用户
态
和内核
态
之间切换以及数据的拷贝,这无疑大大影响了处理的效率,零拷贝技术就是为解决这一问题而诞生的。
我们常见的高性能组件(Netty、Kafka等),其内部基本都应用了零拷贝,在学习这些组件之前,有必要先了解什么是零拷贝。
推荐视频:
C++
架构
师学习地址:C/C++Linux服务器开发
高级
架构
师/Linux后台
对于服务器而言,正常的接受一帧Data的过程,客户端先通过
网络
发送一帧数据到网卡,再经过
协议栈
,最后通过系统调用叨叨应用程序。具体的流程图如下:
针对上面的两个流程,涉及到两次拷贝(网卡拷贝到
协议栈
,
协议栈
拷贝到应用程序),所以就产生了
用户
态
协议栈
,将
协议栈
网络
解析作为应用程序的一部分。
2
用户
态
协议栈
原理
1 定义组成图
用户
态
协议栈
主要是用来减少拷贝。采用通过网卡的nmap,DMA方式,将网卡映射到内存中,底层采用DMA直接通道。应用程序直接去内存中取。DMA无copy,copy赋值
现在的服务器支撑上百万个并发
TCP
连接已经不是新闻(余锋2010年的演讲,ideawu 的 iComet 开源项目,WhatsApp 做到了 2.5M)。实现 C1000k 的常规做法是调整内核参数,提高文件数,降低每个连接的内存消耗(参考 ideawu 的博客)。
在今年的 BSDCan2014 会议上, Patrick Kelsey 介绍了把 FreeBSD 9.x 的
TCP
/
IP
协...