20220904:网络通信之Socket及Java IO模型详解-课程笔记

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 28

Java 架构师第六期直播

网络通信之 Socket 及 Java IO 模型详解


文泰
本节课内容安排

1. 网络通信之 Socket

2. Java 四种 IO 模型

3. 多路复用 IO 模型

4. AIO 异步 IO
1 网络通信之 Socket
网络通信之 Socket

本地 I/O 网络 I/O

用户空间 用户空间
缓冲区 缓冲区

read() read()
内核空间 内核空间

缓冲区 缓冲区

read() read()

磁盘 网卡
网络通信之 Socket

用户进程
用户进程 应用层

Socket 接口

TCP UDP 传输层


TCP UDP

ICMP IP IGMP 网络层


ICMP IP IGMP

ARP 接口硬件 RARP 数据链路层


ARP 接口硬件 RARP
Socket 是什么?

11 Socket 起源于 Unix ,而 Unix/Linux 基本思想之一就是“一切皆文件”,也称为文件描述


12 Socket 是对“ open—write/read—close” 模式的一种实现

1 3 Socket 是对 TCP/IP 协议的封装, Socket 本身不是协议,通过 Socket 才能使用 TCP/IP


协议
2 Java 四种 IO 模型
阻塞 IO
阻塞 IO (Blocking IO)

应用程序 内核
系统调用
recv 数据包没准备好


等待数据



数据包准备好



塞 将数据从内核
拷贝到用户空间
处理数据包 拷贝完成
Socket 交互整体流程
客户端 服务端

new 文件描述符,
文件描述符 new ServerSocket(8080)
Socket(8080) 监听 socket

1. 设置本机端口
bind()
2. 设置本机 IP
保存客户端和
connect()
服务端信息
SYN_SENT 1

2 listen() 1. 让 socket 处于监听模


SYN_SENT 式
ESTABLISHED
2. 创建半连接队列
3 ESTABLISHED
半连接队列

全连接队列

监听 socket 收到请求,
accept()
返回一个新的 socket, 使
用新的 socket 传输数据
发送数据 write() read() 接收数据

发送数据 send() recv() 接收数据

关闭连接 close() close() 关闭连接


怎么知道哪个连接属于哪个 socket

连接四要素: [ 源 IP 、目标 IP 、源端口、目标端口 ]


Socket 在底层的数据结构

进程的 task_stuct

files_struct
文件描述符列表
*Files
Socket Sk_buffer
file[0]
fd_array[] file[1] 接收队列 head
file[2] 发送队列 data
... 等待队列 tail
end
非阻塞 IO
非阻塞 IO (No Blocking IO)

应用程序 内核
系统调用
recv 数据包没准备好
反 系统调用
复 recv 数据包没准备好
轮 等待数据
系统调用
询 recv 数据包没准备好

到 recv
系统调用
数据包准备好



将数据从内核

拷贝到用户空间

处理数据包 拷贝完成
非阻塞 IO (No Blocking IO)

应用程序

内核

channel channel channel channel


3 多路复用 IO 模型
非阻塞 IO (No Blocking IO)

应用程序

内核 多路复用器

channel channel channel channel


NIO 三件套

1 channel: 介于字节缓冲区和套接字之间,可以同时读写,支持异步 IO

2 buffer: 字节缓冲区,是应用程序和通道之间进行 IO 数据传输的中转

3 selector: 多路复用器,监听服务端和客户端的管道上注册的事件
Select模型/Poll模型
已连接 Socket1

接收队列 就绪队列
file[0] 发送队列
线程 1
等待队列
file[1]
已连接 Socket2 把每一

file[2] 接收队列 socket
发送队列 send() 上的等
... 待队列
等待队列 线程引用
file[100 中线程
] 移除,
已连接 Socket3 调用 select.select() 方法
后 , 每一个 socket 的等
并放入
... 接收队列 待队列都会放线程的引用 就绪队

发送队列
等待队列

遍历文件列表准备就绪的 socket
epoll 模型 Selector.open()
1.epoll_create()
线程

selector.select() 3.epoll_wait

file[0] socket
等待列表 eventpoll
file[1] (ep_fd)
2.epoll_ctl(op_accept) 唤醒等待队列中的线程
等待队列
file[2]
epitem rbr
...
rdlist 就绪列表 epitem epitem
file[100
socket epitem epitem
] 等待列表 ...
... (ep_fd)
4.socket 收到数据触发 callback 回调函数
epoll 模型优点

1 支持一个进程打开大数目的 socket 描述符

2 IO 效率不随 FD 数目增加而线性下降
同步与异步、阻塞与非阻塞
应用程序 内核 应用程序 内核

发起请求 发起请求

多次询问

问询后已完成 主动通知

返回数据 返回数据

同步调用 异步调用
同步与异步

1 同步:请求发起方对消息结果的获取是主动的

2 异步:请求发起方对消息结果的获取是被动通知的
应用程序 内核 应用程序 内核

发起请求 发起请求

立即返回


返回数据

阻塞 非阻塞
4 异步 IO
异步 IO

应用程序 内核
系统调用
aio_read 数据包没准备好

等待数据



续 数据包准备好



将数据从内核
拷贝到用户空间
递交 aio_read 中指定信号
处理数据包 拷贝完成

You might also like