poll和epoll都是多路转接的调用,但是epoll实在过于优秀了,一般也都是用epoll的,除此之外还着使用时还蕴含着Reactor设计模式的思想
pollpoll几乎是解决了select的痛点问题的,就像c和c with class一样
使用poll的函数原型和数据结构长这样
123456789#include <poll.h>int poll(struct pollfd *fd, nfds_t nfds, int tiemout);struct pollfd{ int fd; // 文件描述符 short events; // 时间类型 short revents; // 实际发生的时间};
fds:只想一个pollfd结构体数组的指针,每一个结构体都在监视一个文件描述符
nfds:文件描述符的数量
timeout:与select相同,只是直接使用int作为类型,单位是毫秒
epollepoll是为了处理大量句柄而做了改进的poll,在实际中运用的最多的也是这个
系统调用
这个系统调用是用于创建一个epoll模型...
select多路转接多路转接有三种方案,分别是select,poll和epoll,我们都会讲解和介绍
select的函数原型是这样的
他一共有五个参数,但是可以分为三组
nfds:需要监视的最大的文件描述符值+1
readfds:可读文件描述符集合writefds:可写文件描述符集合exceptfds:异常文件描述符集合
timeout:设置select等待的时间
就绪事件分为三种,可读事件,可写事件,异常事件
timeoutselect可以帮我们同时等待多个文件描述符,但是如果一直轮询多个描述符是不合理的,我们应当可以设置他阻塞或者轮询
因此timeout可以传入三种数据
NULL : 表示没有timeout,select一直阻塞等待,直到有了就绪的文件描述符
0 : 进检测文件描述符集合的状态,然后立即返回,不会进行任何阻塞等待,继续执行后面的逻辑
确定的时间 : 阻塞指定的时间段,没有等到则超时返回
前两个都好理解,第三个的数据类型是timeval,要怎么用呢
他的内部有两个成员,分别对应了秒和微秒
长这样
1234struct timeval { ...
Linux高级IO之五种IO模型IO的理解IO模型其实更像是网络部分的延伸和拓展,在学习完计算机网络之后,结合Linux系统,我们就该认识到,计算机网络所做的工作其实是将计算机的功能和性能无限扩大
因为进程间通信的本质没有变,网络将计算机之间的进程通信链接起来,相当于世界的计算机性能也能链接起来,只是受限于网络的性能和复杂度,速度远远达不到计算机总线的速度
进程处理数据自然有数据的处理和交换两个过程
处理部分就是我们所学的各种语言,面向对象思想,算法
而交换则对应了输入和输出两个部分,由于计算机网络的影响,IO也不应当狭义的理解为从内存中IO,而应当也扩展至从网络中IO,虽然设备上,是内存和网卡的区别,但是对于Linux来说他们都是文件,是没什么区别的我们具体到IO本身上,因为外设的速度上远低于CPU处理的速度的,对于内存和网卡都是这样,因此IO一定是效率很低的事情
在IO时,一共做了两件事情,第一件事情是等待,等待缓冲区的文件,或是网卡上来,或是从内存中来,第二件事情是拷贝,将缓冲区数据拷贝到内存中
因此IO一共分成两个部分,等待+拷贝,其中拷贝使用才是我们希望他做的事情
类似...
UDP协议前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理
毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情
我们首先知道计算机网络世界是搭建在四层架构上的
而HTTP协议是处于最顶层,是应用层协议,应用层协议的最大特点就是非常多,而且各异
这样多的协议要在网络中传输,必须得给他统一了,并且还能将底层收上来的数据,正确的交付到各个端口中
做到这些的就是传输层协议,主要有两个,就是大名鼎鼎的UDP和TCP
UDP协议数据报所有的协议都规定了两部分,就是报头和数据本身,在传输层我们一般习惯把这整体称之为数据包
报头
报头是这样的
相比于IP协议和TCP协议,UDP协议的报头还是十分友好的
UDP的报头大小是固定的,8字节,因此当我们获取到一个UDP数据报之后,取前8个字节,找到UDP数据报的总长度,就能完整的取到整个报文数据
需要注意的是,16位UDP长度指的是UDP数据报的总长度,包含报头和数据部分,因此UDP的最大数据大小就是2^16-1,大小就是64KB
UDP的传输过程是不可靠的,无连接的,面向数据报,在我们之前介绍的时候有说过,他的主要应用场景其实就是直...
HTTPS这也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层
为什么要加密呢,这主要是因为如果不对传输主体加密,当中间人拿到数据后,可以对其中的关键内容进行保存甚至篡改
例如说把服务器ip改成自己的,假装自己是服务器跟你通信
加密加密就是把明文转换成暗文,解密则相反
在加密和解密的过程中可能需要某些数据进行辅助,这些数据称为密钥
例如说我们双方通信规定和把数据对114514按位异或
我要传输5201314这个数据,异或之后就是5169904
然后这个数据在网络上传输
你收到5169904之后,再对114514按位异或,就能得到5201314了
这样我们其实就完成了一次加密通信,但是实际情况远比这个复杂
常见加密方式对称加密刚刚我们传输的这个过程其实就是对称加密,我们使用了同一个密钥114514,也称之为单密钥加密
常见的由DES 3DES AES TDEA Blowfish RC2
这种加密的方式好处就是计算量小,当然是对于计算机来说
速度快,算法公开,加密效率高
但是有一个问题,我要怎么让你知道我使用的是什么方式加密呢
直接写在明文里吗,那这样别人拿到不也能解密
除...
HTTP方法HTTP方法有这些
但是怎么说呢,这些方法只有GET和POST方法是99%情况用到的
剩下的几乎不太用,如果有兴趣可以找《图解HTTP》,是处于了解的范畴
大家肯定一看就明白的
GET方法GET方法就是顾名思义,要从服务器中获取某些资源所用的方法,比如说获取一个网页,图片,视频
GET方法是分为带参数的GET方法,不带参的GET方法
如果单纯是拿某一个资源,那肯定就不需要带参数,直接给路径就行
但是如果是浏览器搜索关键词,登录,就需要把浏览器客户端的内容传递给服务器
而GET方法显著区别于POST方法的就是,他提供参数是通过URL传递的
也就是将参数以键值对的方式添加在URL之后传过去,服务器再解析URL拿到数据
POST方法POST方法要使用主要就是要上传数据给服务器,但是传递的数据并不在URL
而是在请求正文中,在HTTP的报头里面
相对来说POST方法比GET方法好一点,至少在你的浏览器地址栏里面看不到账号和密码
但是这两者都并不安全,没有加密,一旦被劫持还是会泄漏数据的
状态码与报头状态码状态码就是200 OK,404 NOT FOUND
我们需要记住的其...
HTTP协议HTTP可以说是当今应用最广泛的应用层协议之一,主要面向的是浏览器(客户端)和服务器之间通信的规定
HTTP协议的底层是TCP协议,我们先大概认识一下这个协议是如何使用的
URLURL也称为统一资源定位器,但其实我们可以感性的将其看作网址
例如https://www.google.com,但这个其实是省略过后的,完整的长这样
http就是标识用的http协议,https可以先认为他是一个安全加密版本的http
登录信息一般都不太带了,因为有了数据库等线上的注册登录系统
服务器地址也就是我们常说的域名,他的本质就是用来表示IP地址
因为这个点分十进制四个大数字太难记住,但是像baidu这样的拼音就好记很多
DNS是域名服务器,他的工作就是将域名解析成IP地址
服务器端口号就是对应着Socket编程的端口号,HTTP的默认端口号一般固定为80,不允许更改
带层次的文件路径,/与系统并不同,他表示的是网络根目录,下一篇我们会讲
在?之后的是传递的参数
HTTP报文无论是客户端服务器(CS)还是浏览器服务器(BS)
都是通过报文传递信息的,我们将其分为请求报文和响应...
TCP连接我们这里不去直接讲TCP连接的各种复杂的内容,只是先简单认识,先熟悉再逐步理解原理
前面我们说TCP是面向字节流的,并且需要先连接才能进行传输数据
那么这对于计算机来说意味着什么
序列化首先计算机网络中的各类设备本身就是没办法做到完全相同的,计算机各种型号,操作系统的各种型号
我们想发送的数据不一定是单纯的数值、字符,完全有可能是结构体,是类,我们想要传输这些内容,需要做的就是讲这些数据和结构体转换为字节流,这个过程我们称之为序列化
那么反过来,从字节流解释出来各种数据和结构体的过程就是反序列化
而且这个序列化和反序列化的过程是必须要相同的规则,不然就像字符串加密解密一样,没办法得到你想要的数据,这个相同的规则规矩,我们就称之为协议
这个序列化和反序列化可以自己定制协议,我们后面也会手动实现
也有常见的序列化方案,都是现成写好的,例如json、protobuf、xml,我们也会进行使用
除此之外,既然是面向字节流的,我们如何知道一段数据的开始和结尾呢,就像水流一样,如果不做限制是很难分清的,因此我们还需要在数据的开始和结尾做标识
网络版本的计算器123456789101...