IO
Bio:
同步阻塞,一个线程一次连接,基于字符流/字节流
Nio:同步非阻塞
一个线程多个连接,多个请求注册到多路复用selector上,多路复用器轮训连接
面向缓冲区, 从某通道读取数据到缓存区, 当前有则处理 无可处理其他工作
线程向通道写入数据,一旦写入 不需要等待写完就可处理其他工作
元素
channel双向,可读写
fileChannel文件读写,datagramChannel:udp数据包收发
serverSocketChannel服务器tcp数据包收发,socketChannel客户端tcp数据包收发
buffer:可读写内存块
channel读写文件或网络都要经过buffer
byteBuffer类型化数据存取,支持byte char int long double做好类型匹配
mappedByteBuffer可文件内容直接在堆外内存被修改
selector(监听多个channel事件)
对应一个处理线程,注册多个channel,每个channel对应一个buffer
Aio:
异步非阻塞,操作系统完成客户端间read/write,操作系统通知线程去处理后面的工作
零拷贝
直接io:
磁盘 --> 内核缓冲区pageCache 4k --> 应用程序内存 ---> socket缓冲区 ---> 网络
内存映射文件技术:
应用程序内存和内核缓冲区做了映射,数据直接从内核缓冲区到socke缓冲区再到网络
零拷贝:内核缓冲区和socket缓冲区做了地址映射
底层网卡驱动程序读取数据并发送网络
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
TCP/IP
点对点连接,封装传输数据帧 寻址 传输 路由 接收
七层ISO
数据链路层:mac地址表 做映射
arp协议,同一子网内开始都不知道对方的ip,先广播arp请求,对方收到给出响应 本地更新arp表
在数据封装时,数据经过每个层都会打上该层特定标识,添加上头部
窗口大小:流量控制
校验和计算:数据包验证
一文讲透TCP/IP协议 | 图解+秒懂+史上最全-CSDN博客
socket
应用层与tcp/ip协议通信中间软件抽象层
https://blog.csdn.net/huanxiajioabu/article/details/131894903
三次握手建立连接:
半连队列hash表,全连队列链表
send发送数据 recv接收数据,不会马上执行,放到缓冲区 等内核 / 应用程序
当应用程序recv没有数据,进入等待队列 进程休眠
nio
netty
异步,基于事件驱动的网络应用框架;
设计优雅,可拓展 高性能 大吞吐量 零拷贝技术 安全传输 多主流协议 多种编码功能
原理
主从reactor多线程模式
channelHandler处理io交给下一个channelHandler处理,责任链
读 解码 处理 编码 发送
ChannelInboundHandler ChannelOutboundHandler ChannelOutboundHandler
taskQueue:任务提交速度大于线程处理速度缓冲 / 异步处理selector监听io事件
45 张图深度解析 Netty 架构与原理-腾讯云开发者社区-腾讯云