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
epoll
网络协议
题
- tcp三次握手和四次挥手?为什么需要三次和四次
- rest和rpc的区别
- rest基于http,rpc基于tcp
- rest传输量大,但传输速率不如tcp
- http协议更被普遍支持
- rest面向URI,可使用GET POST PUT等区分动作
- http和https的区别
- http是超文本传输协议,明文传输;https是具有安全性的ssl/tls加密传输
- http需要ca证书,免费证书少需要一定费用
- 不同的连接方式 前者端口80,后者443
- http简单、无状态,https由ssl+http协议构建的可加密传输、身份认证的网络协议,比http安全。
- 从输入url到页面呈现全过程?
输入url -> dns解析 -> 建立tcp连接 -> http客户端请求 -> 服务端响应 -> 返回结果 -> 页面渲染
- Rest和普通http的区别?
- json格式
- 规范HTTP请求动作 get/post/put/delete
- 规范URI风格,URL可读性好,具有自述性
- TCP如何保证可靠传输?
- 建立可靠连接 3次握手 4次挥手
- 超时重传
- 最大消息长度
- 滑动窗口控制
- 拥塞控制
- TCP的UDP的区别?
- tcp面向连接的可靠传输,面向无连接的不可靠传输