乱写IO一气
-
全双工:两边双向同时发送,或者说是一边又发送又接收,并且可以正确识别是请求还是响应
-
网络和io的关系,io面向的是谁呢,说道网络和io的关系会想到OSI七层模型和TCP/IP(五层)协议模型
-
OSI模型(七层):由低到高
物理层、数据链路层、网络层、传输控制层、会话层、表示层、应用层 -
TCP/IP模型(五层):由低到高
物理层、数据链路层、网络层、传输控制层、应用层(包含:会话层、表示层、应用层) -
程序员(两侧):由低到高
公共内核(物理层、数据链路层、网络层、传输控制层)、程序(应用层—>包含:会话层、表示层、应用层) -
省略的会话层为什么还会出现:
- 首先会话层不在传输控制层上,就说明不在内核层
- 浏览器向服务器中发送请求,浏览器中存了通过会话层生成的cookie后,向服务端发送请求,服务端就可以识别你是谁
- 之后浏览器和服务端建立了TCP连接(连接是由内核层建立的),但是这个连接只要带着曾经会话层生成的cookie(没过期的)去请求服务端,那么服务端还是会识别你的
-
TCP是个什么东西
- 面向
连接
的 可靠的传输机制,其中可靠的传输机制来自于ack(确认机制),seq(序列号) - 这个连接说的是什么:三次握手之后建立的连接叫
资源
的开辟,这个资源在主机里面是一直存在的,但是四次分手之后会销毁这个资源,只要这个资源在,那么后续client端发送数据包,那么server端就可以继续处理这个包,这个资源就是socket和一个queue(也可以说是一个空间),开辟了队列之后数据包才能放到队列中 - 所以说三次握手是一个瞬时数据包交互的过程,其实就是建立一个socket 和queue 称为资源,这个资源在内核里面,所以说服务端返回的数据是给了内核
- 所以说网络通讯,是程序读取的内核
- 所以,网络IO的读写行为可以理解为单机行为,其实是面向socket中的queue去进行读写
- 三次握手之后建立的资源有一个就是socket
- 面向
-
什么是socket
- sockrt就是
套接字(一个人无法运转)
,套可以理解理解为客户端和服务端套在一起了,最后套出的结果是一个四元组(全局唯一,具有排他性) - 四元组包含客户端的IP地址和端口号(ip:port)还有服务端的IP地址和端口号(ip:port)
- 四元组中,客户端一直在损耗他的端口号,所以客户端可以有很多的连接,但是访问服务端就一直是一个端口号,常规都是80,所以说四元组中一直在变化的是客户端的端口号
- socket是一个套接字,是一个四元组其实也是一套
匹配规则
,规则匹配的是找到Socket满足自己对应的队列(包含:recev queue(接收),send queue(发送)),这是一套内核操作 - 每一个socket会自带一个queue
- sockrt就是
-
内核开启心跳检查
- 为什么会存在检查内核心跳:原因是tcp中只有三次握手,三次握手成功之后就各自发包了,就不管以后了,如果系统挂了也不好判断,所以就存在检查内核心跳
- 通过内核开启心跳检查(属于健康检查),内核开启的心跳检查,检查的维度(层次)其实是tcp对应的socket是不是能连上,验证的是连接,但是这种心跳是不适用于服务之间的
- 在服务和服务之间的心跳,有一部分是写在应用层的
heart beat
- 所以心跳分为内核级别的tcp的心跳以及服务和服务之间应用层的心跳
-
ping的行为属于内核级别的,icmp,ip层次,网络层次
-
设置了心跳,tcp连接是不是一直不断开呢
- 首先要注意,tcp开启了连接只是双方服务器开辟了资源
- 长连接和短连接:如果一次请求和一次响应过后,这个连接不需要了,那么就是短连接,反之如果需要复用这个请求去拿东西的话,反复好多次那么则是长连接
- 但是无论是长连接还是短连接都可以开启keep-alive保持心跳,为了看程序是否是健康的,可以理解为应用层级别的东西
-
什么是四次分手?
-
IO模型
- 一个APP无论读写都是通过内核中的queue去操作的,同时需要知道一般这种操作都是两端在相互进行
- BIO:对方没有发送信息,但是自己却一直在读,这时候会变成blocking状态,属于堵塞状态,BIO,每一个连接都会对应一个线程,随着线程的增加,消耗资源也会逐渐变多
- NIO:NIO指的是程序中只要是read操作,无论结果有没有数据都进行返回,需要我们自行做一个判断,用一个线程一直循环判断去读,以为指不定什么时候对方就会发送数据
- 多路复用器(select,poll epoll):拆开来看是,多,路,复用器。多个连接就是多条路,多个连接作为参数传递给一个函数,这个函数会返回其中谁有数据的状态/事件,于是得出结论,这些路,这些连接查询状态的时候复用了这个函数,多路复用器只是用来获取事件,之后操作是进行读
- 程序如果都需要自己去读的话就是同步IO模型,异步IO是程序不消耗自己的线程去做的事情,属于内核级别的操作了