计算机网络知识和多路转接IO总结(持续更新中...)

1.网络的划分?

局域网,城域网,广域网

2 IP地址是什么?分为?

IP地址—网络中唯一标识一台主机
ipv4:无符号32位整数
ipv6:无符号128位整数

3 端口port是什么?

在一台主机上唯一标识一个网络通信进程(实际标识的是socket)
用于描述从哪个socket发送的,发送到哪个socket
一个端口只能被一个socket占用,但是一个socket可以占用多个端口

4 协议是什么?协议分层分为?具体有什么作用?

协议就是数据格式约定
分为OSI七层协议,TCP/IP五层协议
OSI(应用层,表示层,会话层,传输层,网络层,链路层,物理层)
TCP/IP:

应用层:负责应用程序之间的数据沟通 HTTP
传输层:负责进程间数据传输 TCP/UDP
网络层:负责地址管理和路由选择 IP 路由器
链路层:负责相邻设备之间的数据传输 ETH 交换机
物理层:负责光电信号的传输 以太网协议 集线器

5 网络字节序是什么?大小端区别?为什么需要网络字节序,字节序针对哪些数据类型?

网络字节序就是大端字节序,是网络通信中传输数据标准字节序
大端:低地址存高位
小端:地地址存低位
不同的字节序在网络通信中可能会造成二义性
针对存储单元大于一个字节的数据类型

6 udp通信程序流程?

客户端:创建套接字 绑定地址信息(不推荐) 发送数据 接收数据 关闭套接字
服务端: 创建 套接字 绑定地址信息 接收数据 发送数据 关闭套接字

7 tcp通信流程?

客户端:创建套接字 绑定地址信息(不推荐) 向服务器发送请求连接 发送数据 接收数据 关闭套接字
服务端:创建套接字 绑定地址信息 开始监听(LISTEN) 获取新连接 (ESTABLISHED) 接收数据 发送数据 关闭套接字
listen接口的第二个参数表示的是同一时间所能接收的最大请求数量

8 http协议是什么?

http是超文本传输协议,是一种简单的请求—响应式的应用层传输协议

9 http协议格式?

首行:

请求:请求方法 URL 协议版本
响应:协议版本 响应状态码 状态码描述
请求方法:GET/PUT/POST/HEAD/DELETE…
GET和POST区别:GET是获取资源,没有正文,但是可以通过URL查询字符串提交信息(不安全,有长度限制),POST是提交数据
URL:统一资源定位符 在网络中唯一标识一个资源
http://username:password@IP:port/path?query_string#ch
/path:请求资源路径
?query_string:查询字符串 key=value构成
#ch 片段标识符:html中的一个标签id,直接跳转到页面的某个位置
协议版本:0.9(最早只能传输html,只有GET) 1.0 (短连接,增加了几种请求方法,规范了格式)1.1 (长连接,增加了更多请求方法和头部描述信息)2.0(二进制传输,支持服务端主动推送,管线化传输基础上支持无序响应)
响应状态码:1xx:描述协商信息,2xx:表示请求正确处理,3xx:重定向,4xx:客户端请求错误(400,404(不存在)),5xx:服务端错误(500服务器内部错误,502代理请求失败,504代理请求超时)

头部:由key:val键值对,用于对请求或者响应进行一些关键描述的信息

content-Type 正文的数据格式
Content-Length 解决了http的粘包问题(每次只取该大小内容,形成完整一条)
Location:重定向的新位置
状态管理:Cookie(是在客户端保存状态信息的,向服务端发送的数据,但是不安全)
Session:在服务端为客户端建立的会话信息,包含了客户端的身份信息,保存在服务端,通过响应Set-Cookie返回给客户端的Cookie,客户端保存并传递Sessionid,来维护状态

空行:间隔头部和正文
正文:客户端提交的数据或服务端响应的数据

10 HTTPS协议是什么?SSL加密流程?

HTTPS是SSL加密后的HTTP通信协议
SSL加密流程:

身份验证:校验通信双方身份是否是指定的机构 实现:CA电子认证服务
传输加密:保护数据传输过程不被监听以及劫持 实现:对称加密(加密解密用的密匙相同,安全性低,效率高) 非对称加密(各生成一对公钥+私钥,安全效率低) 混合加密(开始使用非对称加密对 对称密钥传输过程加密,后面用对称密钥通信就可以了,效率高安全性高)

总流程:
服务器生成公钥私钥,然后拿着公钥去权威机构生成身份证书
通信双方建立连接之后,服务器先将证书发送给客户端
客户端进行证书解析,然后身份认证
客户端使用证书中的公钥加密对称密钥的协商过程
双方协商完毕后,往后的数据都使用对称密钥进行加密解密

11 UDP协议格式?

16位源端端口
16位对端端口
16位数据报长度(包含报头)
16位校验和

12 udp协议特性?编程影响?

无连接:通信不需要建立连接,只需要知道对方地址
不可靠:没有丢包检测机制,不保证数据能够可靠到达对端
面向数据报:无序,有最大长度限制的传输方式
接收方的recvfrom给的缓冲区必须大,一次能够接收一整条数据
发送方的sendto给的不能超过64K,超过就需要在应用层进行分包处理

13 TCP协议格式?

16位源端端口,16位对端端口
32位序号,32位确认序号
4位报头长度(4*15=60,报头默认20) 6位保留 6位标志位(FIN,ACK,SYN,URG,PSH,RST)
16位窗口大小
16位校验和
16位紧急指针

14 TCP协议特性?

面向连接:三次握手,四次挥手

三次握手:
客户端:发送SYN请求,状态为SYN_SEND->接收ACK+SYN,回复ACK,状态为ESTABLISHED
服务端:收到SYN请求,发送ACK+SYN,状态为SYN_RCVD->收到ACK,进入ESTABLISHED
问题:握手为什么三次? 回答:需要保证建立连接双方都具有收发数据能力,四次没必要,二次不安全
问题:握手失败服务端如何处理的?回答:会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便客户端重新发送ACK包

四次挥手
主动关闭方:发送FIN,进入FIN_WAIT1->收到ACK,进入FIN_WAIT2->收到FIN,进入FIN_WAIT->间隔两个MSL后进入CLOSED
被动关闭方:收到FIN,发送ACK,进入CLOSE_WAIT->发送FIN,进入LAST_ACK->收到ACK,进入CLOSED
问题:挥手为什么四次?回答:因为主动关闭方发送FIN,代表主动关闭方不再发送数据,但是可以接收数据,所有被动关闭方,在回复ACK之后,继续可以向主动关闭方发送数据,因此挥手是四次
问题:TIME_WAIT有什么用?回答:如果最后一次ACK丢失,没有TIME_WAIT的话,被动关闭方会重新发送FIN,如果这时候,新起动的socket占用了同样的内存空间,对新连接造成影响,因此TIME_WAIT是为了避免新启动的socket使用相同的地址信息,但是受到原有连接的影响
问题:一台主机上上出现大量TIME_WAIT原因?意味着这台主机上进行大量的套接字主动关闭,常见于爬虫服务器(服务器作为主动关闭方)
问题:一台主机上出现大量CLOSE_WAIT原因?编程错误,没有关闭套接字

保活机制:7200s没有数据通信,则隔75s服务端向客户端发送保活探测数据包,连续9次没有响应,则认位连接断开


可靠传输:保证有序到达,避免丢包,提升性能

保证有序到达:面向连接,确认应答机制,超时重传机制,包序管理,检验和
避免丢包:滑动窗口机制(通过协议字段中的窗口大小实现流量控制,避免发送方发送数据过多,接收方来不及接收处理而丢弃),拥塞窗口机制(发送方维护一个拥塞窗口,以慢启动快增长的形式发送数据,避免因为网络不好发送过多导致网络拥塞丢包情况)

提升性能:快速重传机制,延迟应答机制,捎带应答机制

快速重传:接收方接收数据,判断哪个地方数据丢失,则连续发送三次重传请求,要求重传
延迟应答:为了保证接收方能够利用延迟时间,确保数据从缓冲区中取出来,来保证窗口大小不变
捎带应答:为了减少纯报头的确认回复报文,稍带到下一条即将发送的数据头部中传输

面向字节流:基于连接,可靠的,有序的,传输不限制大小的一种灵活传输方式。负面反应:TCP粘包问题:有可能会将多条数据当作一条数据进行传输,解决方法:特殊字符间隔,数据定长,应用层头部定义数据长度

15 IP协议格式?

4位协议版本号
4位IP报头长度:数据分用时确定报头长度,最小20最大60
8位服务类型
16位数据长度:限制IP报文总长度不能超过64K
16位分片标识:IP报文超过MTU就会在网络层分片,表示当前分片属于哪个原始报文
3位分片表示:1位保留,1位禁止分片,1位分片结束标志
13位分片偏移:8字节为单位,描述当前分片在原始报文中的位置
8位TTL生存周期:描述一个数据最多能经过的路由器跳数
8位上层协议:数据分用时选择上层的解析协议
16位的校验和
32位的源端IP和对端IP

16 地址管理与路由选择

IP地址组成:网络号(当前IP属于哪个网络)+主机号(在网络中唯一标识主机)
网段的划分:
早期:(IP地址浪费比较大,因为网络划分不够细致)
A:0.0.0.0-127.255.255.255
B:128.0.0.0-191.255.255.255
C:192.0.0.0-223.255.255.255
D:
E:
当前:CIDR方案(子网掩码的方式)
子网掩码取反就是划分网络的最大主机号,确定网络中有多少主机号
子网掩码与IP地址相与可以得到网络号,查看IP地址是属于哪个网络

特殊IP地址
主机号全为0:网络号
主机号全为1:UDP的局域网广播地址
IP地址全为0:识别本机上的任意地址
IP地址全为1:全网广播地址
127.0.0.1:用于回环测试网络-自己发给自己

私网与公网
公网:互联网
私网:没有直接与公网相连的网络称为私网,利用NAT技术实现网络地址转换,节省了公网IP地址

路由选择
路由器对途经的数据,取出目标地址,与自己路由表中的路由表项进行网络号获取对比,判断目标地址属于哪个网络,则使用连接这个网络的网卡将数据发送到指定网络

17 链路层以太网协议格式

48位源端MAC/对端MAC地址
16位上层协议解析
32位校验和

18 MAC地址认识?

网卡的物理硬件地址,用于标识相邻的设备

19 ARP协议认识?

介于网络层与链路层之间的协议,通过IP地址获取MAC地址的一个协议
流程:一台主机连上路由器,通过DHCP给这台主机分配一个IP地址,封装ARP协议,广播ARP请求,ARP包含源端IP,源端MAC.对端IP,对端MAC(空白),相邻设备收到请求,检测是否与自己的目标IP地址相同,相同则将自己的MAC地址填写到ARP,进行回复,否则直接丢弃
ARP欺骗攻击? 有恶意主机明明与自己目的IP地址不否,却进行回复,解决方法:防火墙白名单

20 MTU是什么?对上层协议的影响

链路层根据组网方式(以太网)不同所限制的最大数据帧大小
tcp协议:tcp三次握手会协商一个MSS,MSS=MTU-40,以后每次发送数据的时候,都会从缓冲区中取出不大于MSS大小的数据进行头部封装传输,tcp在传输层自动进行分段,而不会再网络层进行分片的原因
udp协议:因为不会协商MSS,只要数据小于64K-28就能传输,但是报文大于MTU,就会分片,分片在对端重组,分片越多越危险,一个出错,所有都会丢弃,因此最好程序员在应用层就能将数据分割成合适大小在进行传输

21 DNS协议是什么?域名的解析流程?

DNS就是域名系统,用于存储IP地址与域名的映射关系,进行域名解析,将域名解析得到服务器的IP地址
域名系统:进行域名解析,将域名解析得到服务器的IP地址
域名:服务器便于记忆的别名,由字符串组成
域名服务器:根域名服务器->顶级域名服务器->二级域名服务器
域名:顶级域名(.com)->二级域名(.baidu.com)
流程:迭代:浏览器缓存->hosts文件->本地DNS服务器->(根域名服务器,顶级域名服务器,二级域名服务器)
递归:浏览器缓存->hosts文件->本地DNS服务器->根域名服务器->顶级域名服务器->二级域名服务器

22浏览器输入url发生什么 ?

解析域名
根据http协议组织http请求数据
搭建tcp客户端与服务端连接,发送数据
等待响应,得到后进行渲染

23 NAT/NAPT是什么?

网络地址转换技术,用于组建私网节省IP地址的使用
NAT服务:通常部署在网关设备,工作在网络层(进行IP报头中的源端地址替换),通过网关设备进行数据转发

24 典型IO有哪些?区别?

阻塞IO:为了完成IO操作,发起IO调用,若当前不具备IO条件,则调用不返回,一直等待 流程简单,但是效率也是最低
非阻塞IO:为了完成IO操作,发起IO调用,若不具备IO条件,则立即报错返回 需要循环发起IO操作,效率有所提升,但是实时性不高
信号驱动IO:定义IO就绪信号处理,当进程收到信号表示IO已经就绪,则发起IO调用,进行IO操作 操作实时,效率高,需要进行信号回调
异步IO:定义IO完成信号处理,发起异步IO调用,IO操作由系统完成,完成后通过信号通知进程,进程直接对数据进行处理 效率高,占用资源多,流程最复杂

25 阻塞与非阻塞,同步与异步概念与区别?

阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则调用一直等待
非阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则调用立即报错返回
同步:顺序化完成功能,一个完成之后才能下一个
异步:不定序完成功能,发起调用后,由系统完成,什么时候开始什么时候完成都是异步通知
异步阻塞:功能由系统完成,自己等待系统完成
异步非阻塞:功能由系统完成,不等待系统完成,直接返回
同步和异步:表示功能是否由自己完成,完成是否有序

26 多路转接模型作用?

对大量描述符进行事件监控,让进程能够针对就绪的描述符进行操作,提高效率,避免阻塞

27 select实现流程?优缺点分析?

1.程序员定义指定事件的描述符集合,清空集合,将要监控的描述符添加到集合中
2.发起调用,将集合拷贝到内核中轮询遍历判断是否就绪,当有描述符就绪或者监控等待超时则调用返回
3.调用返回之前,将集合中没有就绪的描述符移除,返回之后,程序员遍历哪个描述符还在集合中确定哪个描述符就绪了哪个事件,进行操作
优点:遵循posix标准,支持跨平台
缺点:select所能监控描述符数量有最大数量限制,每次监控需要向内核中拷贝一次,内核采用轮询遍历性能会随着描述符增多而降低,返回移除未就绪需要程序员遍历才能确定哪个描述符就绪,每次监控都需要重新向集合添加描述符

28 poll实现流程?优缺点分析?

1.定义描述符事件结构体数组,将需要监控的描述符以及事件信息填充到数组的各个节点中
2.将事件结构体数组拷贝到内核中进行轮询遍历判断,当有描述符就绪或者监控等待超时则调用返回
3.当调用返回之后,程序员遍历数组的每个节点的revents成员,判断描述符就绪了什么事件
优点:描述符没有最大限制,结构体化简化了多个集合的操作,每次监控不需要重新定义事件结构体
缺点:无法跨平台移植,在内核中轮询遍历性能会随着描述符增多而下降,依然需要程序员遍历数组来判断哪个描述符就绪哪个事件

29 epoll实现流程?优缺点分析?

1.在内核中创建eventpoll结构体,返回操作句柄
2.为描述符组织事件结构体,添加到内核的eventpoll结构体中,使用红黑树保存
3.发起调用开始监控,采用异步阻塞监控,发起调用后,监控由系统完成,系统为每个描述符设置就绪回调函数,当描述符就绪时,调用回调函数,将描述符对应的事件结构体添加到eventpoll的一个双向链表成员中,进程每隔一段时间判断双向链表是否为空,确定是否有描述符就绪,当有就绪,或者监控时间超时则调用返回
4.程序员在调用返回之后,直接获取到就绪描述符事件结构信息,直接针对描述符进行指定事件的操作即可
优点:监控描述符没有数量上限,只需向内核拷贝一次,性能不会随着描述符增多而下降,直接返回就绪的描述符信息事件直接操作不需要遍历
缺点:无法跨平台移植

30 事件触发模式?

水平触发:默认触发方式,只要缓冲区有数据(缓冲区数据大小大于低水位标记)就会触发
边缘触发:需要设置EPOLLET的触发方式,只有缓冲区有数据到来的时候才会触发事件
一般使用水平触发,除非缓冲区有数据但是不完整不想取出的情况下可以使用边缘触发

31 epoll惊群问题?

在多线程或者多进程环境下,有些人为了提高程序的稳定性,往往会让多个线程或者多个进程同时在epoll_wait监听的socket描述符。当一个新的连接请求进来时,操作系统不知道选派那个线程或者进程处理此事件,则干脆将其中几个线程或者进程给唤醒,而实际上只有其中一个进程或者线程能够成功处理accept事件,其他线程都将失败,且errno错误码为EAGAIN。这种现象称为惊群效应,结果是肯定的,惊群效应肯定会带来资源的消耗和性能的影响。
解决:这种情况,不建议让多个线程同时在epoll_wait监听的socket,而是让其中一个线程epoll_wait监听的socket,当有新的链接请求进来之后,由epoll_wait的线程调用accept,建立新的连接,然后交给其他工作线程处理后续的数据读写请求,这样就可以避免了由于多线程环境下的epoll_wait惊群效应问题

32 多路转接的适用场景?

只要有描述符需要监控的场景都可以使用多路转接
多路转接适用于有大量描述符进行事件监控,但是同一时间只有少量活跃的场景
通常搭配线程池组成事件器模式,作为服务器框架模型

Guess you like

Origin blog.csdn.net/Hedenghui777/article/details/114651288