乱写IO一气

乱写IO一气

  1. 全双工:两边双向同时发送,或者说是一边又发送又接收,并且可以正确识别是请求还是响应

  2. 网络和io的关系,io面向的是谁呢,说道网络和io的关系会想到OSI七层模型和TCP/IP(五层)协议模型

  3. OSI模型(七层):由低到高
    物理层、数据链路层、网络层、传输控制层、会话层、表示层、应用层

  4. TCP/IP模型(五层):由低到高
    物理层、数据链路层、网络层、传输控制层、应用层(包含:会话层、表示层、应用层)

  5. 程序员(两侧):由低到高
    公共内核(物理层、数据链路层、网络层、传输控制层)、程序(应用层—>包含:会话层、表示层、应用层)

  6. 省略的会话层为什么还会出现:

    1. 首先会话层不在传输控制层上,就说明不在内核层
    2. 浏览器向服务器中发送请求,浏览器中存了通过会话层生成的cookie后,向服务端发送请求,服务端就可以识别你是谁
    3. 之后浏览器和服务端建立了TCP连接(连接是由内核层建立的),但是这个连接只要带着曾经会话层生成的cookie(没过期的)去请求服务端,那么服务端还是会识别你的
  7. TCP是个什么东西

    1. 面向连接的 可靠的传输机制,其中可靠的传输机制来自于ack(确认机制),seq(序列号)
    2. 这个连接说的是什么:三次握手之后建立的连接叫资源的开辟,这个资源在主机里面是一直存在的,但是四次分手之后会销毁这个资源,只要这个资源在,那么后续client端发送数据包,那么server端就可以继续处理这个包,这个资源就是socket和一个queue(也可以说是一个空间),开辟了队列之后数据包才能放到队列中
    3. 所以说三次握手是一个瞬时数据包交互的过程,其实就是建立一个socket 和queue 称为资源,这个资源在内核里面,所以说服务端返回的数据是给了内核
    4. 所以说网络通讯,是程序读取的内核
    5. 所以,网络IO的读写行为可以理解为单机行为,其实是面向socket中的queue去进行读写
    6. 三次握手之后建立的资源有一个就是socket
  8. 什么是socket

    1. sockrt就是套接字(一个人无法运转),套可以理解理解为客户端和服务端套在一起了,最后套出的结果是一个四元组(全局唯一,具有排他性)
    2. 四元组包含客户端的IP地址和端口号(ip:port)还有服务端的IP地址和端口号(ip:port)
    3. 四元组中,客户端一直在损耗他的端口号,所以客户端可以有很多的连接,但是访问服务端就一直是一个端口号,常规都是80,所以说四元组中一直在变化的是客户端的端口号
    4. socket是一个套接字,是一个四元组其实也是一套匹配规则,规则匹配的是找到Socket满足自己对应的队列(包含:recev queue(接收),send queue(发送)),这是一套内核操作
    5. 每一个socket会自带一个queue
  9. 内核开启心跳检查

    1. 为什么会存在检查内核心跳:原因是tcp中只有三次握手,三次握手成功之后就各自发包了,就不管以后了,如果系统挂了也不好判断,所以就存在检查内核心跳
    2. 通过内核开启心跳检查(属于健康检查),内核开启的心跳检查,检查的维度(层次)其实是tcp对应的socket是不是能连上,验证的是连接,但是这种心跳是不适用于服务之间的
    3. 在服务和服务之间的心跳,有一部分是写在应用层的 heart beat
    4. 所以心跳分为内核级别的tcp的心跳以及服务和服务之间应用层的心跳
  10. ping的行为属于内核级别的,icmp,ip层次,网络层次

  11. 设置了心跳,tcp连接是不是一直不断开呢

    1. 首先要注意,tcp开启了连接只是双方服务器开辟了资源
    2. 长连接和短连接:如果一次请求和一次响应过后,这个连接不需要了,那么就是短连接,反之如果需要复用这个请求去拿东西的话,反复好多次那么则是长连接
    3. 但是无论是长连接还是短连接都可以开启keep-alive保持心跳,为了看程序是否是健康的,可以理解为应用层级别的东西
  12. 什么是四次分手?

  13. IO模型

    1. 一个APP无论读写都是通过内核中的queue去操作的,同时需要知道一般这种操作都是两端在相互进行
    2. BIO:对方没有发送信息,但是自己却一直在读,这时候会变成blocking状态,属于堵塞状态,BIO,每一个连接都会对应一个线程,随着线程的增加,消耗资源也会逐渐变多
    3. NIO:NIO指的是程序中只要是read操作,无论结果有没有数据都进行返回,需要我们自行做一个判断,用一个线程一直循环判断去读,以为指不定什么时候对方就会发送数据
    4. 多路复用器(select,poll epoll):拆开来看是,多,路,复用器。多个连接就是多条路,多个连接作为参数传递给一个函数,这个函数会返回其中谁有数据的状态/事件,于是得出结论,这些路,这些连接查询状态的时候复用了这个函数,多路复用器只是用来获取事件,之后操作是进行读
    5. 程序如果都需要自己去读的话就是同步IO模型,异步IO是程序不消耗自己的线程去做的事情,属于内核级别的操作了
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值