IO模型的发展

-> demo演示:https://github.com/Cenck/JudyBunny/tree/master/JDKTest/src/main/java/com/zhz/io/socket

  • bio 每线程一客户端连接

服务器可同时运行的线程数不会超过cpu核心*4,因此系统限止不太允许开太多线程,所以bio支持同步在线的客户端连接数非常少
这也是受制于linux内核:accept , recv这类的系统调用是阻塞获取的

  • nio 一个线程处理所有客户端连接

因可以通过配置,设置内核socket连接非阻塞传输,可以一个线程内在一个循环体内单次循环,先accept客户端连接有则返回fd,无则返回-1,然后再遍历所有客户端找到所有ready io.
缺点:1单线程性能不佳 2循环调用

  • select

解决循环调用 应用进程一次把所有的客户端fd传参给内核,内核recv(system call)从中标记出所有ready io
缺点:多次大量无意义的参数传输

  • epoll

内核创建缓冲区A将一个socket中的fds维护到红黑树,应用进程单次只需要传参新accept的客户端fd
缺点:1.空间换时间 2.ready fd需要copy到缓冲区B 如果fds通信特别频繁,性能不一定比select好

多路复用Io

image.png

epoll

image.png

网络协议

image.png

  1. tcp三次握手和四次挥手?为什么需要三次和四次
  2. rest和rpc的区别
    • rest基于http,rpc基于tcp
    • rest传输量大,但传输速率不如tcp
    • http协议更被普遍支持
    • rest面向URI,可使用GET POST PUT等区分动作
  3. http和https的区别
    • http是超文本传输协议,明文传输;https是具有安全性的ssl/tls加密传输
    • http需要ca证书,免费证书少需要一定费用
    • 不同的连接方式 前者端口80,后者443
    • http简单、无状态,https由ssl+http协议构建的可加密传输、身份认证的网络协议,比http安全。
  4. 从输入url到页面呈现全过程?

输入url -> dns解析 -> 建立tcp连接 -> http客户端请求 -> 服务端响应 -> 返回结果 -> 页面渲染

  1. Rest和普通http的区别?
    • json格式
    • 规范HTTP请求动作 get/post/put/delete
    • 规范URI风格,URL可读性好,具有自述性
  2. TCP如何保证可靠传输?
    • 建立可靠连接 3次握手 4次挥手
    • 超时重传
    • 最大消息长度
    • 滑动窗口控制
    • 拥塞控制
  3. TCP的UDP的区别?
    • tcp面向连接的可靠传输,面向无连接的不可靠传输

NETTY