day28(阻塞与非阻塞、IO模型、同步与阻塞、异步与非阻塞、atoi、assert、字符拼接等)
- 阻塞与非阻塞
阻塞:阻塞的系统是指,当进行系统调用的时候,除非出错(被信号打断也视为出错),进程将会一直陷入内核态直到调用完成。
非阻塞:非阻塞的系统调用是指无论I/O操作成功与否,调用都会立即返回。
在linux环境下,所有的I/O系统调用都是阻塞的,我们可以给socket系统调用的第二个参数SCOK_NONOLOCK标志,或通过fcntl系统调用F-SETFL,将其设置为非阻塞。 - I/O模型
UNIX下五种I/O模型
阻塞I/O、非阻塞I/O、I/O复用(select、poll)、信号驱动I/O、异步I/O
前四个是同步I/O,同步I/O模型要求用户代码自动执行I/O操作。而异步I/O机制则由内核来执行I/O操作。 - 同步与阻塞,异步与非阻塞
同步与异步是对应的,他们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
阻塞与非阻塞是同一个线程来说的,在某个时刻,线程要么是处于阻塞,要么是处于非阻塞。
阻塞是使用同步机制的结果,非阻塞是使用异步机制的结果。 - int atoi(const char *ptr)把字符串转化成整型数,char itoa(int n,char *ptr,int deix)参数对应要转化的直、目标字符串、进制,一般不用。
string to_string(a);把a转化成字符串。 - assert(),括号里的条件返回false则停止执行后面的程序。
strcat(char * a,const char *b),把b接在a后面。
strncat(char *a,const char *b,int size ),把b的size个字符接在a后面。
memset(void *a,int value,int size),将a的前n个字节置为 value。
memcpy()内存拷贝,要考虑内存重叠的问题,重叠式拷贝可能会出错,从后往前拷贝一般不会出错。而memmove不会出错。
day29(计算机网络五层结构、TCP/IP四层结构、广播信道、多点接入、载波接听、碰撞检测、争用期、MAC、IP数据报格式、IP地址编码、网页请求过程、路由、http与https、http1.x、状态码、http1与http2、http方法)
- AVL树-平衡二叉树
- epoll的两种触发方式
- LT与ET
计算机网络
-
应用层、运输层、网络层、数据链路层、物理层
a. 应用层,为特定应用程序提供数据传输服务,例如http、dns,数据单位是报文。
b. 运输层,提供进程间的通用数据传输服务。由于应用层协议很多,定义通用的运输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:TCP数据单位为报文段、UDP数据单元是用户数据报。
c. 网络层,为主机之间提供服务,而不是像运输层协议那样是为主机中的进程提供服务。网络层把运输层产生的报文段或者用户数据报封装成分组来进行传输。(IP协议)
d. 数据链路层,网络层针对的是主机之间,而主机之间可以有很多的链路,链路层协议就是为相邻结点之间提供服务。数据链路层把网络层传来的分组封装成帧。
e. 物理层,考虑的是怎么在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能的屏蔽传输媒体和通信手段的差异,使物理层上的数据链路层感觉不到差异。 -
TCP/IP体系结构,只有四层,相当于把五层协议中的数据链路层和物理层合并为网络接口层。
广播信道:CSMA/CD表示载波监听多点接入/碰撞检测
多点接入:说明是总线型的网络,许多计算机以多点的方式接入到总线上。
载波监听,每个站都必须不停的和监测信道。在发送前,如果检测到信道正在使用,就需要等待。
碰撞检测,在发送中,如果监听到已有其他站在发送数据,就表示发生了碰撞。是由于电磁波的船舶时延,可能会发生碰撞。
记端到端的传播时延为t,最先发送的站点最多经过2t就可以知道是否发生了碰撞,称2t为争用期。只有经过争用期之后还没监测到碰撞,才能肯定这次发送不会发生碰撞。发生碰撞时,要停止发送,等待一段时间再发送。时间采用截断二进制指数退避算法来确定。 -
MAC
mac地址是6字节(48位)的地址,用来唯一标识网络适配器(网卡),一台主机拥有多少个适配器就有多少个MAC地址。
虚拟局域网,他可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到广播信息。 -
网络层(网际协议IP)
使用IP协议,可以把异构的物理网络连接起来,使得在网络层看起来像是一个统一的网络。
与IP协议配套使用的协议:
地址解析协议ARP、网际控制报文协议ICMP、网际组管理协议IGMP
ARP协议:实现IP地址得到MAC地址。
每个主机有一个ARP高速缓存,存放映射表。如果一个IP地址到MAC地址的映射不在表中,主机通过广播的方式来发送ARP请求分组,匹配IP地址的主机会发送ARP相应分组告知地址。 -
IP数据报格式
版本:有4(IPv4)和6(IPv6)两个
首部长度:站4个字节,因此最大值15.值为1表示的是1个32位子的长度,也就是4字节。
标志:数据报过长发生分片情况下,不同分片具有相同的标志符。
片偏移:和标志符一起,发生在分片时。片偏移的单位是8字节。
生存时间:TTL,防止无法交付的数据报一直在互联网中兜圈子。以路由跳数为单位,当TTL为0就丢到数据报。
首部校验和:数据报没经过一个路由就要计算校验和,所以数据部分不计入计算校验和,减少运算量。 -
IP地址编址
a. 分类的IP地址:有两部分组成,网络号和主机号,其中不同类别有不同的网络号长度。
b. 划分子网,通过在网络号字段中那一部分作为子网号,把两级IP地址分为三级IP地址。外部网络看不到子网的存在。
IP地址:{网络号,子网号,主机号}
使用子网,必须配置子网掩码。一个B类地址的默认子网掩码是255.255.0.0,如果B类地址的子网站两个比特,那么子网掩码为:11111111 11111111 11000000 00000000
也就是255.255.192.0
c. 无分类编址CIDR(构成超网) -
路由是在网络层,识别IP地址并转发分组。
交换机工作与数据链路层,识别MAC地址,转发数据帧。 -
专用网内部的主机使用本地IP地址想和互联网上主机通信时,可以使用NAT来讲本地IP转换为全球IP。
-
运输层
网络层只把分组发送到目的主机,但真正通信的并不是主机而是主机中的进程。
运输层提供了应用进程间的逻辑通信。 -
web页面请求过程
a. 向DNS服务器发送DNS查询报文来解析域名。
b. 开始进行HTTP会话,需要建立tcp连接。
c. 在运输层传输过程中,HTTP报文才封装在TCP中。HTTP请求报文使用端口号80,因为服务器监听的是80端口。连接建立之后,服务器会随机分配一个端口号给特定的客户端,之后TCP传输都是用这个分配的端口号,
d. 到网络层,TCP报文被封装进IP分组,IP分组经过路由的选择,最后到达目的地。
e. 到数据链路层,IP分组会被封装进MAC帧,IP地址解析称MAC地址用ARP协议。
f. 客户端发送HTTP请求报文,请求获取页面。
g. 服务器发送HTTP相应的报文,客户端从而获得该页面。
h. 浏览器得到该页面后,协议并渲染,向用户展示。
HTTP
11. http方法
客户端发送的请求报文第一行为请求行,包含了方法字段。
GET:获取资源。当前网络中,绝大部分使用的是GET方法。
HEAD:获取首部报文。和GET方法类似。但是不返回报文实体主体部分。主要用于确认 SUL的有效性以及资源更新的日期等。
POST:传输实体主体。POST主要用来传输数据,而GET主要用来获取资源。
PUT:上传文件。由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
PATCH:对资源进行部分修改。PUT也可以用于修改资源,但是会完全替代原始资源,PATCH允许部分修改。
DELETE:删除文件。与PUT功能相反,并且也不代表验证机制。
OPTIONS:查询支持的方法。查询指定的URL能够支持的方法。会返回:Allow:GET,POST,HEAD,OPTIONS这样的内容。
CONNECT:要求在与代理服务器通信时建立隧道。使用SSL和TLS协议把通信内容加密后经网络隧道传输。
TRACE:追踪路径。服务器会将通信路径返回给客户端。
12. HTTP状态码
服务器会返回响应报文中的第一行为状态行,包含状态码。
1XX,信息状态码,接收的请求正在处理。100,表示目前为止都正常,客服端可以继续发送请求。
2XX,成功状态码,请求正常处理完毕。200,OK。
3XX,重定向状态码,需要进行附加操作以完成请求。
4XX,客户端错误状态码,服务器无法处理请求。400,请求报文中存在语法错误。
5XX,服务器错误状态码,服务器处理请求出错。500,服务器正在执行请求时发生错误。
13. 短连接与长链接
长链接只需要简历一次TCP连接就能够进行多次HTTP通信。
从http/1.1开始就是默认长链接的,如果要断开连接,需要客户端或者服务器提出断开,使用Connection:close;
在heep/1.1之前是默认短连接的,如果需要使用场链接,使用Connection:Keep-Alive;
流水线
默认情况下,http请求是按顺序发送的,下一个请求只有在当前请求受到相应之后才会被发出。由于受到网络延迟和带宽的限制,可能需要等待很长时间。
流水线就是在同一条长连接上连续发出请求,而不用等待响应返回,这样可以减少延迟。
Cookie
Http协议是无状态的,主要是为了让http协议尽可能的简单,使得它能够处理大量事务。http/1.1引入Cookie来保存状态信息。
- HTTPS
https不是新协议,是让http先和ssl通信,再由ssl和tcp通信,也就是说https使用了隧道进行通信。
通过使用SSL,https具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
加密:对称密钥加密、非对称密钥加密(更安全但速度慢)。
https采用混合加密机制,使用非对称密钥加密用于传输对称密钥来保证传输过程的安全性,之后使用对称密钥加密进行通信来保证通信过程的效率。
认证:主要是CA认证。
完整性保护:SSL提供报文摘要功能来进行完整性保护。
缺点:因为需要进行加密解密等过程,速度会更慢。
需要支付证书授权的高额费用。
-
HTTP/1.0和HTTP/1.1的一些区别
a. 缓存处理,http1.1引入更多的缓存控制策略,可以更多的提供可供选择的缓存头来控制缓存策略。
b. 带宽优化以及网络连接的使用,1.0存在带宽浪费的现象,如:客服只需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。而1.1在请求头引入了range头域,他允许只请求资源的某个部分,这样就可以自由选择充分利用带宽和连接。
c. 错误通知管理,1.1新增了24个错误状态响应码。
d. Host头处理,1.0认为每台服务器都要绑定一个唯一的IP地址,所以请求消息中的URL没有传递主机名。现在一台物理服务器上可以存在多个虚拟主机,共享一个IP,1.1的请求消息和响应消息都支持HOST头域,请求消息没有HOST头域时就会报错。
e. 长连接,1.1支持长连接和流水线处理,一个TCP链接上可以传送多个HTTP请求和响应,减少建立和关闭的消耗和延迟,1.1是默认开启keep-alive。1.0每次都需要建立连接 -
HTTP2.0与HTTP1.x相比
a. 新的二进制格式,1.x的解析是基于本文的。新的二进制则不同,只认0和1的组合,实现方便并且健壮。
b. 多路复用,就是连接共享,每一个请求都是 用作连接共享机制的。一个请求对应一个ID,这样一个连接上就可以有多个请求,每个连接的请求可以随机的混杂在一起,接收方可以根据请求的ID将请求归属到各自不同的服务端请求里。
c. header压缩,1.x的header带有大量的信息,而且每次都要重复发送。2.0使用encoder来减少需要传输的header大小,通讯双方各自存储一份头部索引表,避免了重复的传输且减小了传输的大小。
d. 服务端推送,服务端可以主动推送资源给客户端,避免客户端花过多的时间逐个请求资源,这样可以降低整个请求的响应时间。