计算机基础知识复习8.29
DNS解析过程
客户端首先会发出一个DNS请求,问www.server.com的IP是什么,并发给本地DNS服务器(也就是客户端的TCP/IP设置为填写的DNS服务器地址
本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回IP地址,如果没有,本地DNS会去问他的根域名服务器:www.server.com的IP地址是什么吗,根域名服务器是最高层次的,他不直接用于域名解析,而是指出一条道路
根DNS收到来自本地DNS的请求后,发现后置是.com,说www.server.com这个域名归.com区域管理,我给你.com顶级域名服务器地址,你去问问
本地DNS收到顶级域名服务器的地址后,发起请求问 能告诉我www.server.com的IP地址吗
顶级域名服务器说:我给你负责www.server.com区域的权威dns服务器的地址,你去问他
本地DNS于是转向问权威DNS服务器,www.server.com对应的IP是什么
权威DNS服务器查询后将对应的IP地址x.x.x.x告诉本地DNS
本地DNS再将IP地址返回客户端,客户端和目标建立连接
进程间通信方式
管道通信,就是内核里的一串缓存,从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据,管道传输的数据是无格式的流且大小受限
消息队列是保存在内核中的消息链表,在发送数据时,会分成一个个独立的数据单元,也就是消息体,消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据,如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。消息队列生命周期随着内核,如果没有释放消息队列或者关闭操作系统,消息队列会一直存在。
共享内存的机制就是拿出一块虚拟地址空间来,映射到相同的物理内存中,这样这个进程写入的东西,另外一个进程马上就能看到了,就不需要拷贝来拷贝去,大大提高了进程间通信的速度
信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
为什么需要Time_Wait状态
主动发起关闭连接的一方,才会有TIME_WAIT状态
采取TIME_WAIT状态,主要原因:
防止历史连接中的数据,被后面相同四元组的连接错误的接受。采用2MSL时长,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的
保证被动关闭连接的一方,能被正确的关闭。Time_wait作用是等待足够的时间以确保最后的ack能让被动关闭方接受,从而帮助其正常关闭
TIME_WAIT过多的危害
占用系统资源,比如文件描述符号,内存资源,CPU资源,线程资源
占用端口资源,端口资源也是有限的。
如果客户端的TIME_WAIT状态过多,占满了所有端口资源,那么就无法对目的IP+目的Port都一样的服务端发起连接,但是被使用的端口,还是可以继续对另一个服务端发起连接的
如果服务端的TIME_WAIT状态过多,并不会导致端口资源受限,因为服务端只能监听一个端口,而且由于一个四元组唯一确定一个TCP连接,因此理论上服务端可以建立很多连接,但是TCP连接过多,会占用系统资源,比如文件描述符号,内存资源,CPU资源,线程资源等
CLOSE_WAIT状态原因
close_wait状态是被动关闭方才会有的状态,而且如果被动关闭方没有调用close函数关闭连接,那么就无法发出FIN报文,从而无法使得close_wait状态的连接转变为last_ack状态
当服务端出现大量close_wait状态的连接的时候,说明服务端的程序没有调用close函数关闭连接
TCP建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号,序列号能够保证数据包不重复,不丢弃和按序传输。不使用两次握手和四次握手的原因:两次握手无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号。四次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项
第二范式(2NF): 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第三范式(3NF):在2NF基础上,任何非主属性,不依赖于其他非主属性。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
OSI七层模型
应用层:负责给应用程序提供统一的接口
表示层:负责把数据转换成兼容另一个系统能识别的格式
会话层:负责建立,管理和终止表示层实体之间的通信会话
传输层:负责端到端的数据传输
网络层:负责数据的路由,转发,分片
数据链路层:负责数据的封帧和差错检测以及MAC寻址
物理层:负责在物理网络中传输数据帧
内存分段
程序是由若干个逻辑分段组成的,如可由代码分段,数据分段,栈端,堆段组成。不同的段是有不同的属性的,所以就用分段的形式把这些段分离出来
分段机制下的虚拟机制由两部分组成,段选择因子和段内偏移量。
段选择因子和段内偏移量:
段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址,段的界限和特权等级等。
虚拟地址中的段内偏移量应该位于0和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。
内存分页
分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小,这样一个连续并且尺寸固定的内存空间叫做页。虚拟地址与物理地址之间通过页表来映射。页表是存储在内存里的,内存管理单元就将虚拟内存地址转换成物理地址的工作。对于一个内存地址转换,就是把虚拟内存地址,切分成页号和偏移量。根据页号,从页表里面,查询对应的物理页号,直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
ARP协议
在传输一个IP数据报的时候,确定了源IP地址和目标IP地址后,就会通过主机路由表确定IP数据包下一跳,然而,网络层的下一层是数据链路层,所以还要知道下一跳的MAC地址。由于主机的路由表中可以找到下一跳的IP地址,所以可以通过ARP协议,求得下一跳的MAC地址。
主机会通过广播发送ARP请求,这个包中包含了想要知道的MAC地址的主机IP地址。当同个链路中的所有设备收到ARP请求时,会去拆开ARP请求包里的内容。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个设备就将自己的MAC地址塞入ARP响应包返回给主机
HTTP状态码
2XX 成功,报文已经收到并被正确处理
3XX 重定向,资源位置发生变动,需要客户端重新发送请求
4XX 客户端错误,请求报文有误,服务器无法处理
5XX 服务器错误,服务器在处理请求时内部发生了错误
TCP头部格式
源端口号(16位) 目标端口号(16位)
序列号(32位)
确认应答号(32位)
首部长度(4位)保留(6位)(URG,ACK,PSH,RST,SYN,FIN) 窗口大小(16位)
校验和(16位)
紧急指针(16位)
IO多路复用
IO多路复用是一种IO的处理方法,指的是复用一个线程,处理多个socket中的事件。能够资源复用用,防止创建过多线程导致的上下文切换的开销
B+树的特点
一种自平衡的多路查找树,所有叶节点都位于同一层,保证了树的平衡,使得搜索,插入,删除操作的时间复杂度为对数级别
非叶子节点仅包含索引信息,不存储具体的数据记录,他们只用来引导搜索到正确的叶节点。非叶子节点的子树指针与关键字数量相同,每个子树指针指向一个子树,子树中的所有键值都在某个区间内
所有数据记录都存储在叶节点中,且叶节点中的数据是按关键字排序的。叶节点包含实际的数据和关键字,他们是数据存储和检索的实体单元。叶节点之间通过指针相互链接,形成一个链表,便于范围查询和顺序遍历
参考资料
小林coding