1.7k words
Linux高级IO之五种IO模型IO的理解IO模型其实更像是网络部分的延伸和拓展,在学习完计算机网络之后,结合Linux系统,我们就该认识到,计算机网络所做的工作其实是将计算机的功能和性能无限扩大 因为进程间通信的本质没有变,网络将计算机之间的进程通信链接起来,相当于世界的计算机性能也能链接起来,只是受限于网络的性能和复杂度,速度远远达不到计算机总线的速度 进程处理数据自然有数据的处理和交换两个过程 处理部分就是我们所学的各种语言,面向对象思想,算法 而交换则对应了输入和输出两个部分,由于计算机网络的影响,IO也不应当狭义的理解为从内存中IO,而应当也扩展至从网络中IO,虽然设备上,是内存和网卡的区别,但是对于Linux来说他们都是文件,是没什么区别的我们具体到IO本身上,因为外设的速度上远低于CPU处理的速度的,对于内存和网卡都是这样,因此IO一定是效率很低的事情 在IO时,一共做了两件事情,第一件事情是等待,等待缓冲区的文件,或是网卡上来,或是从内存中来,第二件事情是拷贝,将缓冲区数据拷贝到内存中 因此IO一共分成两个部分,等待+拷贝,其中拷贝使用才是我们希望他做的事情 类似...
2.7k words
UDP协议前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网络世界是搭建在四层架构上的 而HTTP协议是处于最顶层,是应用层协议,应用层协议的最大特点就是非常多,而且各异 这样多的协议要在网络中传输,必须得给他统一了,并且还能将底层收上来的数据,正确的交付到各个端口中 做到这些的就是传输层协议,主要有两个,就是大名鼎鼎的UDP和TCP UDP协议数据报所有的协议都规定了两部分,就是报头和数据本身,在传输层我们一般习惯把这整体称之为数据包 报头 报头是这样的 相比于IP协议和TCP协议,UDP协议的报头还是十分友好的 UDP的报头大小是固定的,8字节,因此当我们获取到一个UDP数据报之后,取前8个字节,找到UDP数据报的总长度,就能完整的取到整个报文数据 需要注意的是,16位UDP长度指的是UDP数据报的总长度,包含报头和数据部分,因此UDP的最大数据大小就是2^16-1,大小就是64KB UDP的传输过程是不可靠的,无连接的,面向数据报,在我们之前介绍的时候有说过,他的主要应用场景其实就是直...
1.6k words
HTTPS这也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 为什么要加密呢,这主要是因为如果不对传输主体加密,当中间人拿到数据后,可以对其中的关键内容进行保存甚至篡改 例如说把服务器ip改成自己的,假装自己是服务器跟你通信 加密加密就是把明文转换成暗文,解密则相反 在加密和解密的过程中可能需要某些数据进行辅助,这些数据称为密钥 例如说我们双方通信规定和把数据对114514按位异或 我要传输5201314这个数据,异或之后就是5169904 然后这个数据在网络上传输 你收到5169904之后,再对114514按位异或,就能得到5201314了 这样我们其实就完成了一次加密通信,但是实际情况远比这个复杂 常见加密方式对称加密刚刚我们传输的这个过程其实就是对称加密,我们使用了同一个密钥114514,也称之为单密钥加密 常见的由DES 3DES AES TDEA Blowfish RC2 这种加密的方式好处就是计算量小,当然是对于计算机来说 速度快,算法公开,加密效率高 但是有一个问题,我要怎么让你知道我使用的是什么方式加密呢 直接写在明文里吗,那这样别人拿到不也能解密 除...
902 words
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 我们需要记住的其...
671 words
HTTP协议HTTP可以说是当今应用最广泛的应用层协议之一,主要面向的是浏览器(客户端)和服务器之间通信的规定 HTTP协议的底层是TCP协议,我们先大概认识一下这个协议是如何使用的 URLURL也称为统一资源定位器,但其实我们可以感性的将其看作网址 例如https://www.google.com,但这个其实是省略过后的,完整的长这样 http就是标识用的http协议,https可以先认为他是一个安全加密版本的http 登录信息一般都不太带了,因为有了数据库等线上的注册登录系统 服务器地址也就是我们常说的域名,他的本质就是用来表示IP地址 因为这个点分十进制四个大数字太难记住,但是像baidu这样的拼音就好记很多 DNS是域名服务器,他的工作就是将域名解析成IP地址 服务器端口号就是对应着Socket编程的端口号,HTTP的默认端口号一般固定为80,不允许更改 带层次的文件路径,/与系统并不同,他表示的是网络根目录,下一篇我们会讲 在?之后的是传递的参数 HTTP报文无论是客户端服务器(CS)还是浏览器服务器(BS) 都是通过报文传递信息的,我们将其分为请求报文和响应...
2.3k words
TCP连接我们这里不去直接讲TCP连接的各种复杂的内容,只是先简单认识,先熟悉再逐步理解原理 前面我们说TCP是面向字节流的,并且需要先连接才能进行传输数据 那么这对于计算机来说意味着什么 序列化首先计算机网络中的各类设备本身就是没办法做到完全相同的,计算机各种型号,操作系统的各种型号 我们想发送的数据不一定是单纯的数值、字符,完全有可能是结构体,是类,我们想要传输这些内容,需要做的就是讲这些数据和结构体转换为字节流,这个过程我们称之为序列化 那么反过来,从字节流解释出来各种数据和结构体的过程就是反序列化 而且这个序列化和反序列化的过程是必须要相同的规则,不然就像字符串加密解密一样,没办法得到你想要的数据,这个相同的规则规矩,我们就称之为协议 这个序列化和反序列化可以自己定制协议,我们后面也会手动实现 也有常见的序列化方案,都是现成写好的,例如json、protobuf、xml,我们也会进行使用 除此之外,既然是面向字节流的,我们如何知道一段数据的开始和结尾呢,就像水流一样,如果不做限制是很难分清的,因此我们还需要在数据的开始和结尾做标识 网络版本的计算器123456789101...
934 words
会话会话是session,代表的是客户端与服务器的一次交互过程,我们可以简单理解为,当我们打开一个终端,在用户登录时,就是创建了一个会话 一般来说会话都与各自的终端关联,这个会话中的第一个进程称之为首进程,也称为进程组长 一个会话中可能有很多进程,我们称之为进程组,为了表示也就有了进程组ID:PGID,会话ID:SIG 使用setsid系统调用可以创建新会话 需要注意的是,创建会话的进程不能是组长进程 进程组的主要特征就是信号可以发给一个进程组中的所有进程,可以进行作业控制 PGID就是这个进程组的唯一标识,其实也就是进程组组长的id 也就是要求一个进程只能当一个组的组长,否则id不就重复了嘛 但是说进程组长挂了,进程组中只要还有一个进程存在,整个进程组还在 守护进程守护进程也叫做精灵进程,Deamon,是一种运行在后台的进程,所谓前台后台可以简单理解为能否直接收到键盘指令的进程 守护进程独立于终端,并且周期性的执行某种任务或者等待处理某些发生的事件 当Linux系统启动时,或者bash启动时,会启动很多进程服务,例如ssh连接,或者一些代理服务,在进程终止或者系统终止时服务...
2.2k words
端口号我们说即便是计算机网络,他们之间的通信也仍然是进程间通信 那么要如何在这么多计算机中,找到你想要的那个进程呢 在网络中标识的唯一的计算机使用的是ip地址 在同一台计算机的进程是通过进程id区分的,而要在对方的计算机中按照进程id来找恐怕不是一共好的想法,因为你也不知道对方进程的id是多少,于是就商量(传输层协议)使用port端口来确定进程 因此ip加上port就能确定这个世界上的唯一一台计算机中的唯一一个进程 ip地址是用四个八位二进制数来表示 而port端口号是一共2字节16位整数 端口号用来标识进程,告诉操作系统数据要交给哪一个进程 都已经有了进程id了为什么还要有个端口号呢 这是因为一个端口号只能被一个进程占用,但是一个进程是可以拥有多个端口号的 他们之间并不是完美的1对1关系 TCP/UDP我们先简单重新认识一下这两个协议 这两个都是传输层的协议 TCP面向的是有连接,意思是在正式的传递信息之前,需要建立连接,确保是能收到的,就像对暗号一样,土豆土豆我是地瓜 而UDP则是无连接的,相当于直接把数据扔出去 由此可见,TCP是可靠传输,他规定了一些措施来保...