【Java IO详解1】基础知识

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

  1. api复杂
  2. 多线程开发复杂
  3. 半包 粘包
  4. 心跳,网络中断,网络堵塞
  5. nio bug空轮询
    epoll 水平 触发 一次IO中没有读完,等到下次信号来时候才能读。信号驱动
    边缘 触发 尽可能多的读取IO