IO多路复用:epoll,poll,select
传统IO一个教室50个学生老师挨个问完成了没,50遍
epoll:谁写完把东西教我,就一遍 nginx,tomcat
redis:单线程-------------网络编程 io模型牛逼
java程序通过native方法,用jni技术调用c方法
客户端与服务器端进行链接的时候有三个socket
通信
http 基于tcp协议 http1.0之前是短连接(一个网页中的图片每一个链接都会发一次请求),1.1之后是长连接(一次请求完成) 不太理解
tcp连接-------------socket.write() socket.write() 一次tcp请求,多次socket连接 长连接
tcp连接-------------socket.write() close() tcp连接------- socket.write() 一次tcp请求,一次socket连接 短连接
tcp协议如何知道响应已经完成?响应头的内容,内容长度
tcp协议三次握手,四次挥手
看tcp三次握手工作原理,如图所示。主机A想要与主机B进行TCP通信,首先他需要向B发送一个syn同步序列编号syncsynchronized squsequence number用来标记保持同步,到这里第一次握手就结束了。第二次握手开始,主机B向A发送一个syn同步序列号和ack确认号确认号为A主机发送的syn号+1,到这里第二次握手结束。第三次握手开始主机A向主机B发送ack确认码为主机B的syn号+1,到此为止三次握手结束进入ESTABLISHED状态,开始进行数据传输。-------->问准备好了吗,准备好了你呢,我也准备好了
主机A想要向主机B结束tcp长连接,第一次挥手发送fin请求,第一次挥手结束。第二次挥手开始,主机B向主机A发送ack确认码,为fin号+1到这里第二次挥手结束。第三次握手开始主机B向A发送fin号结束。第四次挥手开始主机A向B发送ack号为fin+1,这时tcp连接结束--------------------->发送关,收到关,关闭收,收到
四次挥手会导致的问题:应用程序级别不再接受消息,但是内核级别还是会加收消息 谁先提出的关闭谁就要再等两分钟(网络传输时间的两倍)两分钟之内的时间这个端口时不能用的
bio问题:单线程解决不了bio问题,单线程的socket没办法解决并发因为他会阻塞(两个地方) 见注销代码
轮训是操作系统替你轮训,比自己写的轮训要快
nio:非阻塞主要是将list交给操作系统,让操作系统进行管理---------------见代码
bio要想不阻塞只能使用多线程,但是nio是单线程不阻塞