TCP/IP
TCP/IP
TCP UDP
协议簇。
应用层,传输层,网络层,网络访问层。
TCP:面向连接的,需要两个端互相识别后才发送数据。
- TCP 在发送之前要先进行三次握手,建立链接。并把链接信息放在头部。
建立链接:
UDP:面向非链接的,单端发送。发送目的在UDP协议包里描述。
- UDP不理会接收端是否接收到,一股脑的发送。是不可靠的
- 报文头很小,比较高效
TCP
建立链接的三次握手
A:你好 能通吗
B:收到 可以建立链接
A:建立连接成功消除链接的四次握手
A:你好我要关闭了
B:确认可以关闭
B:我先关闭
A:我也关闭
应用程序获取数据
用户空间
socket
内核空间
网卡,驱动等
文件描述
数据准备,数据拷贝
- 阻塞IO
- 非阻塞IO
- IO多路复用
· 零拷贝
epoll使用了 零拷贝
内核-用户epoll 共享部分空间。
- 信号驱动
异步IO
总结
Java IO
Buffer
flip
position
capacity
limit
为什么要用读写翻转 flip
sc.read(buffer)
buffer.flip
socket从内核空间拷贝到用户空间,其实是对用户空间的写。
- AIO
Linux 上多路复用实现的AIO。
所以netty 是基于NIO实现的
用户空间还是需要同步阻塞以获取内核的发送的消息。
在内核到用户控件的时候通过事件的方式进行通知,达到异步状态。
netty
- api复杂
- 多线程开发复杂
- 半包 粘包
- 心跳,网络中断,网络堵塞
- nio bug空轮询
epoll 水平 触发 一次IO中没有读完,等到下次信号来时候才能读。信号驱动
边缘 触发 尽可能多的读取IO