文章目录
一、进程与内核
1.用户态的Java程序进程
2.内核态的操作系统内核
2.1操作系统
2.1.1内核
二、文件描述符与表引用
1.文件描述符
2.文件描述符表
3.引用比例
三、TCP资源管理与连接维护
1.TCP协议栈
1.1TCB
1.1.1端点
1.1.1.1TCP连接状态
四、Socket引用纵深与端点分布
1.Socket引用纵深
2.Socket端点分布
2.1监听Socket
2.2连接socket
五、资源关闭与连接生命
1.直接关闭
1.1直关资源
2.执行关闭
2.1执关资源
2.2执关流程
2.2.1无引用
2.2.2释放
2.2.2.1正常释放
2.2.2.2异常释放
2.2.2.2.1重传多次失败
2.2.2.2.2收到RST
3.进程Socket与TCP连接的生命周期
六、操作顺梯纵深执行
一、进程与内核
一台主机
应用层里面可以有很多用户态的Java程序进程
但传输层的内核态的操作系统内核只有一个
1.用户态的Java程序进程
Java程序代码在JVM运行起来后,会形成用户态的进程,里面有:
- Java对象
- 堆
- 栈
- 线程
- 用户态缓冲区
- JVM状态
2.内核态的操作系统内核
2.1操作系统
操作系统由:
- 内核
- 系统库
- 系统工具
- 服务
组成
2.1.1内核
内核是操作系统最核心的部分,负责:
- CPU调度
- 内存管理->执行资源回收、关闭fd、释放页表...
- 文件系统
- 网络协议栈->TCP协议栈就在内核里面、管理socket与TCP状态...
- 驱动
- 进程管理->回收进程...
二、文件描述符与表引用
1.文件描述符
文件描述符是在操作系统内核管理资源的编号、提供到进程指向内核资源的整数
2.文件描述符表
操作系统内核 存储每个进程一张的文件描述符表,维护里面文件描述符-内核资源的映射
进程A的文件描述符表
fd0 -> 标准输入
fd1 -> 标准输出
fd2 -> 标准错误
fd3 -> 某个文件
...
fd7 -> 某个socket
3.引用比例
1、文件描述符表与进程,一对一对应
2、文件描述符表里的文件描述符与进程里的对象,一对一引用
3、文件描述符表里映射的内核资源被多个表里的多个文件描述符一起,一对多引用
三、TCP资源管理与连接维护
1.TCP协议栈
操作系统内核里的TCP协议栈 存管 所有在此主机里的 TCB端点,里面进行TCP协议的核心工作:
- TCP序号
- ACK
- 重传
- 滑动窗口
- TCP状态机
- FIN
- SYN
1.1TCB
TCB = TCP Control Block,结构体包着端点,保存 维护端点的TCP协议对向连接状态 的数据:
- 本地IP
- 本地端口
- 对方IP
- 对方端口
- 当前TCP状态:ESTABLISHED、FIN_WAIT_1、TIME_WAIT...
- 发送序号:SND.NXT
- 最早未确认序号:SND.UNA
- 接收下一个期望序号:RCV.NXT
- 发送窗口
- 接收窗口
- 拥塞窗口
- 重传计时器
- TCP选项:MSS、窗口扩大、SACK...
1.1.1端点
端点能收发数据
1.1.1.1TCP连接状态
双端处于TCP协议约定的对向连接状态时,就认为建立了TCP的逻辑连接:
- 两边主机的操作系统内核里的TCP协议栈里面分别存储管理着各自的TCB:
- 客户端->192.168.1.10 : 50000、服务器->1.2.3.4 : 8080
- 双方分别用 源IP、源端口、目的IP、目的端口 四元组标识,交流来回报文,调整两端TCB状态,保持在TCP协议的对向连接状态,就建立了逻辑的TCP连接
(网络上不存在全局的TCP连接对象,它两端的引用分别放在,两边的内核TCP协议栈里面各自的一个TCB,引用同一个通道的两端进行对连)
区分:
- TCP连接 是逻辑上的双端关系
- TCB 是每端本地保存的状态
- 操作系统里的PCB 是进程控制块,保存:
PID
进程状态
寄存器上下文
调度信息
内存信息
文件描述符表
四、Socket引用纵深与端点分布
1.Socket引用纵深
- 进程里的Socket对象,是Java程序操作网络的接口,存在JVM的堆里,处于用户态,用文件描述符指向 操作系统内核里,该进程的文件描述符表里,映射的内核Socket
- 内核里的Socket对象,维护 关联的TCB,里面端点的TCP连接状态
Socket.write(7, data, len):
进程Socket对象
↓
包装与关联 底层的native socket资源
↓
(触发系统调用内核)用进程Socket对象底层持有的文件描述符fd=7 映射文件描述符表到内核Socket对象
↓
内核Socket对象关联到TCB
↓
往里维护写TCP数据
2.Socket端点分布
2.1监听Socket
进程ServerSocket映射的内核监听socket,关联的TCB处于LISTEN状态:
监听socket
*:8080
LISTEN
监查,来向连接状态的TCB{交流握手报文,调整TCB对向状态}听建,回向连接状态的TCB 在此边:
2.2连接socket
连接socketA
server:8080 <-> clientA:50001
ESTABLISHED
连接socketB
server:8080 <-> clientB:50002
ESTABLISHED
连接socketC
server:8080 <-> clientC:50003
ESTABLISHED
五、资源关闭与连接生命
从上往下顺梯传递关闭操作地 关闭 进程到内核一路的资源
1.直接关闭
一步地直做关闭
1.1直关资源
- 进程对象
- 文件描述符:文件描述符在文件描述符表里存储着,一步里无引用地直接关闭
2.执行关闭
多步地执完关闭
2.1执关资源
内核资源:内核资源在文件描述符表里被映射,但不在表里存储的,多步里先无引用地执行关闭
2.2执关流程
2.2.1无引用
进程关闭
↓
在里面的进程对象是先关闭的
↓
紧接它们引用在内核里的,该进程的文件描述符表里的文件描述符,就无引用地直接关闭了
↓
内核资源等到所有引用它的文件描述符都关闭完,无引用指向后,才开始释放
2.2.2释放
2.2.2.1正常释放
ESTABLISHED
↓
FIN_WAIT...
↓
CLOSED
↓
Socket关闭后,关联的TCB一起关闭,里面维护的TCP连接状态才消失了,连接的此端单断
2.2.2.2异常释放
2.2.2.2.1重传多次失败
↓
连接超时
↓
CLOSED
↓
关闭TCB
2.2.2.2.2收到RST
↓
连接abort
↓
关闭TCB
3.进程Socket与TCP连接的生命周期
进程Socket对象生命周期<TCP连接状态生命周期:
- 某个进程[进程Socket对象]关闭
- 它的内核资源[内核Socket对象] 可能还有其它进程的文件描述符在引用、与无引用后可能还在释放中
- 而还存在[关联的TCB,及里面维护的TCP连接状态]
六、操作顺梯纵深执行
操作 从进程上始 顺梯传递 纵深至内核终地 一路执行