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协议通信中间软件抽象层
import socket
# 创建一个套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 指定本地地址和端口
server_address = ('localhost', 10000)
server_socket.bind(server_address)
# 监听客户端连接请求,最多同时连接5个客户端
server_socket.listen(5)
print('服务器正在等待客户端连接...')
# 进入无限循环,等待并处理客户端的请求
while True:
# 接受客户端的连接请求
client_socket, client_address = server_socket.accept()
print(f'连接来自 {client_address}')
# 接收客户端发送的数据
received_data = client_socket.recv(1024)
print('客户端发送的数据:', received_data.decode())
# 发送数据给客户端
client_socket.sendall(b'Hello, Client!')
# 关闭与客户端的连接
client_socket.close()
# 关闭服务器套接字
server_socket.close()
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 架构与原理-腾讯云开发者社区-腾讯云