网络编程与高效IO
2021-02-25 18:18:15 15 举报
AI智能生成
网络IO编程,高效IO, Netty原理, 网络协议
作者其他创作
大纲/内容
网络编程与高效IO
网络协议
网络模型
TCP和UDP的区别
UDP
3. 面向报文
TCP
3次握手
1. C端发起syn请求
2. S端回复ack+syn请求
3. C端回复font color=\"#c41230\
font color=\"#0076b3\
4次挥手
1. C端发起fin请求
2. S端回复ack请求
3. S端信息业务继续发送中
4. S端发送fin请求
2. 仅支持1对1单播
3. 面向字节流
4. 可靠传输
序列号
检验和
确认应答信号
重发控制
窗口控制
拥塞控制
对比
TCP中拆包黏包现象
1、将消息分为头部和消息体,在头部中保存有当前整个消息的长度
2、可以在数据包之间设置边界,如添加特殊符号
3. 消息定长
网络IO
IO
两个阶段
1. 等待数据准备阶段 - 等待数据从socket中到达(recvfrom函数),到达后需要复制到内核的缓冲区中
2. 从内核的缓冲区复制到进程的缓冲区,复制到进程的缓冲区才算读取完毕
IO演进
阻塞IO
一个线程只能同时处理一个socket通道
等待数据准备阶段] 和 [线程read] 都会会阻塞线程
缺点
每个请求都需要开启线程,并且阻塞不能干其他事情,比较耗费资源
非阻塞IO
一个线程能同时处理多个socket通道
socket请求的font color=\"#c41230\
当有大量客户端连接时,每次判断fd状态都需要从用户态切换到内核态,即10k个连接需要循环10k次系统调用,费时费力
多路复用
select O(n)
在非阻塞IO基础上,改进10k次系统调用为1次系统调用
每次系统调用都需要传10k个fd
实际上是由用户循环10k次改为了内核循环10k次,同样是O(n)复杂度
32位机器上,源码中写死了最多接受的fd为1024个,容易成为瓶颈
poll O(n)
在select基础上,改进了1024个的限制
除1024缺陷外,其余都在
epoll O(1)
在poll基础上实现: 1. 在内核开辟一个缓存区,将监听的font color=\"#c41230\
10k个fd不再循环10k次,而实现了事件机制
每次读和写的时候,都是由用户线程自己从内核buffer读
异步IO
在epoll基础上,改进读写的时候由内核完成,用户线程只需要提供读写完成后的回调方法即可
目前linux系统还没有成熟的商用异步IO
C10K问题
C10K
http://www.kegel.com/c10k.html
netty
netty是一款基于NIO开发的网络通信框架.
优势
使用简单
功能强大
定制能力强
性能高
IO 线程模型
主从Reactor多线程模型
内存零拷贝
1. netty接收和发送ByteBuffe采用font color=\"#c41230\
2. 提供了font color=\"#c41230\
3. Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题
内存池设计
串形化处理读写
高性能序列化协议
主要组件
Channel
EventLoop
ChannelFuture
ChannelHandler
ChannelPipeline
Reactor线程模型
Reactor
负责消息监听及事件响应,将事件分发给绑定了该事件的Handler处理
假如是font color=\"#c41230\
Acceptor
font color=\"#c41230\
Handler
单Reactor单线程模型
1个主线程
Reactor和Handlers在同一个线程内
1个Reactor
N个Handler
负责事件的响应处理accept、read、decode、process、encode、send
不能利用多核CPU
高并发时性能上无法支撑
一旦reactor线程意外跑飞或者进入死循环,会导致整个系统通信模块不可用
应用: redis
单Reactor多线程模型
1个主线程+1个worker线程池
1个Reactor(主线程内)
N个Handler(主线程内)
worker线程池
具体的业务处理decode+compute+encode
特点
MainReactor线程池+SubReactor线程池+worker线程池
MainReactor
SubReactor
worker
1. MainReactor只负责连接事件的处理+移交
2. SubReactor负责事件的读写响应及消息处理的分发
3. worker线程负责具体的业务处理
优点
小结
netty模型
NIOLoopGroup
NIOEventLoop表示font color=\"#c41230\
Netty抽象出两组线程池
BossGroup和WorkerGroup类型都是NIOEventLoopGroup
BossGroup:专门负责接收客户端的连接
1:轮询Accept事件
WorkerGroup:专门负责网络的读写
1:轮询font color=\"#c41230\
0 条评论
回复 删除
下一页