java 网络编程

bio nio aio
netty 4 基于 nio
netty 5 基于 aio, 但 aio 还不成熟
---------------------------------------------
BIO JDK1.0 ~ JDK1.3
---------------------------------------------
同步阻塞,一个线程只能处理一个请求,需要线程主动查询是否有数据可读  
---------------------------------------------
NIO JDK1.4
---------------------------------------------
同步非阻塞,一个线程可以处理多个请求,需要线程主动查询是否有 IO 事件 

NIO 三大组件
Channel Selector Buffer
-------------------------------
IO 多路复用器
没有多路复用器,一个连接一个线程,有了多路复用器,一个连接一个事件,netty reactor
-----------
select
poll
在多路复用器上注册要处理的事件,有事件时,内核会通知有事件发生
需要遍历所有的事件做判断
-----------
epoll - nginx, netty, redis
BSD kqueue
在多路复用器上注册要处理的事件,有事件时,内核会通知对应的处理处理器

// 阻塞方法, 等待事件发生
// 对应 os 里 epoll_wait(); 
int event = selector.select();
---------------------------------------------
AIO JDK1.7
又叫 NIO 2.0
异步非阻塞,有数据时会通知线程处理
---------------------------------------------
为什么 BIO 阻塞, NIO 不阻塞
BIO 阻塞是因为操作系统里 socket 默认就是阻塞的,BIO 是很老的 IO 模型,那时候做的比较简单

NIO 不阻塞是因为她通过操作系统里 socket 的配置方法,配置成非阻塞
---------------------------------------------
osi 7 层网络模型
应用层 为应用程序提供服务
表示层 数据格式转化, 数据加密
会话层 建立管理和维护会话
传输层 建立管理和维护端到端的连接  tcp udp
网络层 IP选址及路由选择          ip
链路层 提供介质访问和链路管理
物理层 物理传输

tcp / ip 5 层模型
把 osi 7 层网络模型的上面 3 层合并成 1层
应用层, 传输层, 网络层, 链路层, 物理层

操作系统实现了 tcp 协议
socket 是操作系统提供给应用程序建立网络连接的接口
-----------------------------------------------------
tcp 
面向连接, 可靠的传输协议,适用需要准确无误传输的场景,传输文件,发送邮件,浏览网页
-----------------------------------------------------
udp 面向无连接的通讯协议,速度快,可能会丢包,适用对实时性要求高,可接收少量丢包的场景,域名查询,语音通话,视频直播等
-----------------------------------------------------
ip 在源地址和目的地址之间传送数据包
-----------------------------------------------------
端口号
用来识别同一台计算机中进行通信的不同应用程序,它也被称为程序地址
-----------------------------------------------------
一个 tcp 连接, 包含源 ip 地址, 目标 ip 地址, 协议号, 源端口号, 目标端口号
-----------------------------------------------------
建立 tcp 连接,三次握手
1. syn_send
客户端向服务端发送请求连接报文, seq 序列号
2. syn_ack
服务端回复确认,ack = 序列号 + 1
3. ack

丢包问题,乱序问题
客户端从发送缓存区切割发送,
服务端根据序列号和长度重组,发现丢失要求重发 ack = 100

通过三次握手建立好连接之后,客户端服务端分配内存,输入缓冲区输出缓冲区
-----------------------------------------------------
关闭 tcp 连接,四次挥手
-----------------------------------------------------
1.客户端发送 FIN 包,停止发送数据
2.服务端回复 ACK 包,表示接收到断开请求,处理完正在处理的数据
3.待服务端发送完数据之后,发送 FIN 包,表示服务端可以断开连接
4.客户端回复 ACK 包,自己进入超时等待状态,经过超时时间后关闭连接,服务端收到 ACK 包后立即关闭连接
-----------------------------------------------------

-----------------------------------------------------
tcp 连接建立好后,如果没有收到 rst 或者 fin 包,不会断开
tcp 通过 keepalive 来保持连接的,会周期性的发送探测包来检测对端是否存活
tcp 连接建立好后,默认两小时没有发送任何数据,建立连接的双方开始发送 keepalive 报文,
如果 75s 没有回应,再次发送,默认重复9次,如果没有回应,tcp 连接就断开了
-------------------------------
rst 包的场景,非正常关闭 tcp 连接
请求没有开启服务的端口时,
请求超时,
被防火墙踢掉的连接,
向一个已经关闭的连接发送数据
对方关闭连接,丢弃输入缓冲区里的数据时,会给对端发送一个 rst 包
-------------------------------
fin 包,正常关闭 tcp 连接
-------------------------------


-----------------------------------------------------


-----------------------------------------------------
udp 面向无连接的通讯协议
-----------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我三师弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值