本篇文章整理的是在秋招过程中遇到的计算机网络高频面试题,应付部分中小厂的测试开发工程师面试完全没有问题,如果时间充足的话,建议再看一下笔者的另外一篇文章:【测开求职】面试题:计算机网络 详细版整理,会让你对整个计算机网络有足够全面深刻的理解,亲测应付各个大厂的面试毫无压力👉
目录
- 网络结构
- TCP vs UDP
- TCP三次握手
- 两次握手可以吗
- 四次挥手
- 为什么要等待2MSL
- TCP首部字段
- TCP 和 UDP 的区别
- TCP 和 UDP 对应的协议
- TCP的粘包和拆包
- TCP如何确保可靠性
- 流量控制
- 拥塞控制
- 拥塞控制 VS 流量控制
- HTTP
- DNS的解析过程
- 浏览器输入URL之后会发生什么
- HTTP的特点
- HTTP的报文格式
- HTTP状态码
- HTTP请求方法
- 状态码301和302的区别
- URI 和 URL的区别
- POST 和 GET的区别
- 如何理解HTTP无状态
- HTTP 长连接 和 短连接
- 如何实现长连接
- 长连接在什么时候会超时
- HTTP 1.0 和 2.0 有什么区别
- HTTP存在的问题
- HTTPS的通信过程
- 为什么传输内容要是用对称加密
- 使用了HTTPS就绝对安全吗
- HTTP与HTTPs的区别
- 网络安全
- 什么是数字签名
- 为什么数字签名要对摘要进行非对称加密
- 什么是数字证书
- 什么是cookie和session
- 对称加密、非对称加密、散列函数
- 网络各层的安全问题
- webSocket 和 Socket 的 区别
- ARP协议的工作过程
- ICMP协议的功能
- DOS、DDOS、DRDOS
- CSRF攻击
- XSS攻击
网络结构
-
物理层: 通过媒介传输比特,确定机械及电气规范,传输单位为bit,(主要包括的协议为:IEE802.3 CLOCK RJ45)
-
数据链路层: 将比特组装成帧和点到点的传递,传输单位为帧,主要包括的协议为MAC HDLC PPP
-
网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,主要包括的协议为IP ARP ICMP
-
传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为TCP UDP
-
会话层:建立、管理和终止会话,(主要包括的协议为RPC NFS)
-
表示层: 对数据进行翻译、加密和压缩,(主要包括的协议为JPEG ASII)
-
应用层: 通过应用进程的交互来实现特定网络应用,主要包括的协议为FTP HTTP DNS
TCP vs UDP
TCP三次握手
-
第一次握手:
- 客户端向服务端发起建立连接请求
- 标志位SYN=1,以及随机生成的序列号seq=x
- 客户端状态:closed 👉 syn-send
-
第二次握手:
- 服务器向客户端回复一个确认报文
- 标志位 SYN=1,ACK=1,以及随机生成的序列号seq=y,确认号ack=x+1
- 服务器状态:listen👉syn-recv
-
第三次握手:
- 客户端向服务器发送一个报文
- 标志位 ACK=1,seq=x+1,ack=y+1
- 客户端状态:syn-send 👉 established
两次握手可以吗
需要三次握手是为了防止已经失效的连接请求报文突然传输到了服务器端
- 假设客户端向服务器端发起的请求连接报文,由于一些错误,没有到达服务器端
- 在该报文超时之后,客户端重传了一个请求连接报文,经过两次握手建立了连接,完成通信之后,四次挥手断开了连接
- 此时,最开始发送的那个连接请求报文,被服务器端接收
- 服务器回应一个确认报文,由于没有第三次握手,所以服务器会误以为客户端真的新的请求要建立,所以还保持这个连接,占用资源
四次挥手
-
第一次挥手:
- 客户端向服务器端发送一个连接释放报文,并停止发送数据
- FIN=1, seq=u
- 客户端状态:established 👉 fin-wait-1
-
第二次挥手:
- 服务器端向客户端回复一个确认报文
- ACK=1,ack=u+1,seq=v
- 服务器状态:established 👉 close-wait
- 客服端收到该确认报文之后状态:fin-wait-1👉fin-wait-2
- 此时客户端到服务器的连接断开,服务器继续将剩下的数据发送完毕
-
第三次挥手:
- 服务器端向客户端发送一个连接释放报文
- FIN=1,ACK=1,seq=w,ack=u+1
- 服务器状态:close-wait 👉 last-ack
-
第四次挥手:
- 客户端向服务器发送一个确认报文
- ACK=1,seq=u+1,ack=w+1
- 客户端状态:fin-wait-2👉time-wait
- 等待两个最长报文段生存时间(MSL)后释放 time-wait 👉 closed
- 凡是需要对端确认的,一定消耗TCP报文的序列号。SYN和FIN需要对端的确认,因此需要消耗一个序列号。
- 记住,seq=ack,如果上个阶段没有ack,就用一个新的序列号
- ask=seq(上一次对面的seq)+1
- 除了第一个报文,每一个报文都有ACK
为什么要等待2MSL
保证客户端的发送的最后一个挥手报文能够成功到达服务器端
- 这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态。
- 若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。
防止已经失效的报文段出现在下一个新的连接中
- A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。
TCP首部字段
- 源端口号
- 目的端口号
- 序号
- 确认号
- 头部长度
- 标志位
- 窗口大小
- 校验和
TCP 和 UDP 的区别
- TCP有连接,UDP无连接
- TCP可靠,UDP不可靠
- TCP面向字节,UDP面向报文
- TCP首部开销大(20B),UDP首部开销小(8B)
- TCP功能多,UDP功能少:
- UDP:分用复用,差错校验
- TCP:分用复用,差错校验,可靠传输,拥塞控制,流量控制
TCP 和 UDP 对应的协议
TCP
- HTTP:80
- FTP:文件传输协议 20/21
- POP3 :邮件读取协议
- SMTP:邮件发送协议
UDP
- DNS:53
- TFTP:简单文件传输协议 69
TCP的粘包和拆包
-
粘包:
- 要发送的数据小于TCP发送缓冲区的大小,这时就会在缓冲区中写入多个数据,会发生粘包
- 接收方没有及时地读取接收缓冲区中的数据,会发生粘包
-
拆包:
- 要发送的数据大于发送缓冲区的大小,会发生拆包
- 要发送的数据大于最大报文长度,需要拆包
-
解决方法
- 在数据尾部增加特殊字符进行分割
- 发送方将每个数据包封装为固定长度
- 数据划分为头部+内容体,头部大小固定,用一个字段来声明内容体的大小
TCP如何确保可靠性
- 连接:三次握手,四次挥手,可靠连接
- 校验:首部字段中有校验和,检测数据在传输中有没有任何变化
- 序号:报文段中第一个字节的序号作为报文段的序号,保证数据包能够按序到达
- 确认:TCP使用累计确认,确认按顺序到达的报文段
- 重传:
- 有超时重传:每个报文段有一个计时器,采用自适应算法,动态改变重传时间RRTs(加权平均往返时间)
- 快速重传:接收到三个冗余ACK时重传
流量控制
- 目的:根据自己的接收缓存,告诉方法自己的接收窗口大小,从而动态调整发送方的发送窗口大小,控制发送方的发送速度
- 实现方法:滑动窗口
- 接收方在确认报文段的窗口字段中将接收窗口rwnd告诉发送方
- 发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值
拥塞控制
- 目的:监测网络状况,用四个算法估算出拥塞窗口的值
- 拥塞控制算法:
- 慢开始:连接刚刚建立时,拥塞窗口指数增长,达到慢开始门限ssthresh时改用拥塞避免
- 拥塞避免:拥塞窗口线性增长,发生超时重传后,改为慢开始
- 快重传:不是等到真正出现网络拥塞的时候才执行慢开始,而是接收方收到三次冗余ACK之后就改变为慢开始
- 快恢复 :快重传之后,拥塞窗口设置为门限值,继续执行拥塞避免
拥塞控制 VS 流量控制
- 目的不同:拥塞控制控制量,流量控制控制速度
- 范围不同:拥塞控制面向整个网络,流量控制面向当前连接
- 任务不同:拥塞控制的任务是发送方根据四个算法监测网络,不断调整拥塞窗口的大小;流量控制的任务是动态修改报文中的窗口字段,及时告知发送方接收窗口大小是多少
- 结果相同:最终结果都是改变了发送窗口(发送窗口=min(拥塞窗口,接收窗口)从而控制发送方发送数据的速度
HTTP
DNS的解析过程
- DNS的作用:将浏览器中输入的域名转换为ip地址
- DNS的原理:ip地址与域名的对应关系会存储在某一个“权限域名服务器”上,DNS的解析过程就是查找这个权限域名服务器,并且从该服务器上获取域名对应的ip地址的过程。查询到这个权限域名服务器还需要其他域名服务器的帮忙
DNS的查询方式:
- 递归查询:靠别人来查
- 迭代查询:靠自己来查,本地域名服务器的负担较重。
DNS的过程:以迭代方式为例
- 拿到域名之后现在本地高速缓存中查询,如果最近访问过这个域名,本地缓存中会保存对应的ip
- 高速缓存中没有查到ip的话,需要向本地域名服务器发起查询请求
- 本地域名服务器向根域名服务器发起请求
- 根域名服务器向顶级域名服务器发起请求
- 顶级域名服务器找到权限域名服务器
- 逐步返回查询到的请求,并缓存在本地的DNS高速缓存中
- 通常情况下,客户端和本地域名服务器是递归查询,本地域名服务器和其他服务器之间是迭代查询
浏览器输入URL之后会发生什么
- 解析域名:浏览器分析链接,用DNS协议解析服务器的ip地址。首先会在本地域名服务器的高速缓存中查询,如果查不到的话,就要向根域名服务器,顶级域名服务器,权限域名服务器一层一层往下查询,可以是递归查询,也可以是迭代查询。
- 三次握手:DNS是基于UDP的,所以在传输层会用到UDP协议,HTTP是基于TCP的,因此要三次握手建立TCP连接
- 发起请求:连接建立之后,浏览器发起一个HTTP请求,参数从客户端传送到服务器端。
- 响应请求:服务器得到参数之后,进行相应的业务处理,将结果封装为HTTP包返回给客户端
- 解析渲染:浏览器解析响应内容,进行渲染,呈现给用户
- 四次挥手:在数据传送完成之后,客户端和服务器端四次挥手断开链接
除此之外还有一些更底层的内容:在网络层需要进行路由选择,选择合适的下一跳ip。有了ip地址还不能实现传送,需要用到网络层的ARP协议,将ip地址解析为mac地址,经过数据链路层的交换机,确定转发端口;物理层的集线器对传输信号进行再生和放大。
HTTP的特点
- 允许传输任意类型的数据:传输的类型由Content-Type加以标记
- 无状态:对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系
- 支持客户端/服务器模式
HTTP的报文格式
- 请求行
- 请求头
- 请求体
HTTP状态码
- 1XX:消息状态码
- 2XX:成功状态码
- 3XX:重定向状态码
- 4XX:客户端错误状态码
- 5XX:服务端错误状态码
- 200:OK 请求成功。一般用于 GET 与 POST 请求。
- 301:Moved Permanently 永久移动。请求的资源已被永久的移动到新 URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。今后任何新的请求都应使用新的 URI 代替。
- 302:Found 临时移动,与 301 类似。但资源只是临时被移动。客户端应继续使用原有URI
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 404:Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。
- 405:Method Not Allowed 客户端请求中的方法被禁止。
- 500:Internal Server Error 服务器内部错误,无法完成请求。
HTTP请求方法
- GET:请求读取url标识的信息
- POST:给服务器添加信息
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法
- HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,主要作用是调试
- PUT:向指定资源位置上传其最新内容
- DELETE:请求服务器删除Request-URI所标识的资源
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- CONNECT:用于代理服务器
状态码301和302的区别
- 302:永久性转移,请求的资源被永久转移到新的位置,服务器返回此响应的时候,会自动地将请求者转移到新的位置上
- 301:临时转移,客户端应继续使用原有的URI
URI 和 URL的区别
- URI:uniform resource identifier 统一资源标识符:唯一标识一个资源
- URL:uniform resource location 统一资源定位符:提供资源的路径
URI是身份证,URL是住址
POST 和 GET的区别
区别 | GET | POST |
---|---|---|
1. 🍓规范 | 用于查询 | 用于添加、更新、删除等 |
2. 参数传递方式 | URL | 请求体 |
3. TCP数据包个数 | 1个 | 2个 (先发请求头,服务器响应100,再发请求体) |
4. 请求参数保留到浏览器的历史记录 | ✅ | ❌ |
5. 回退和刷新 | 直接干,无影响 | 会再次提交数据 |
如何理解HTTP无状态
- 当浏览器第一次发送请求给服务器时,服务器响应了;
- 如果同个浏览器发起第二次请求给服务器,它第二次响应
- 服务器不知道你就是刚才的那个浏览器。
- 简言之,服务器不会去记住你是谁,所以是无状态协议。
HTTP 长连接 和 短连接
- 短连接:每进行一次HTTP请求,就要建立一个TCP连接,任务结束就中断 (http1.0 默认)
- 长连接:多个HTTP请求复用同一个TCP连接,节省建立和断开连接的开销 (http 1.1默认)
如何实现长连接
- http 1.0 版本默认短连接,客户端和服务器的HTTP首部的Connection都要设置keep-alive才会支持长连接
- http1.1 以后都是默认支持长连接的
长连接在什么时候会超时
HTTP 1.0 和 2.0 有什么区别
- 新的传输格式:HTTP1.1 基于文本格式传输数据;HTTP2.0采用二进制格式传输数据,解析更高效
- 多路复用:在一个连接里,允许同时发送多个请求或响应,并且这些请求或响应能够并行的传输而不被阻塞
- 头部压缩:使用特定算法压缩头帧,有效减少头信息大小
- 服务端推送:HTTP2.0允许服务器向客户端推送资源,无需客户端发送请求到服务器获取。
HTTP存在的问题
- 请求信息明文传输,容易被窃听
- 不能保护数据的完整性,容易被篡改
- 没有验证对方的身份,存在冒充危险
HTTPS的通信过程
- HTTPS一般理解为HTTP+SSL/TLS,通过SSL数字证书来验证服务的身份,并为浏览器和服务器之间的通信进行加密
- SSL是TLS的前身,现在浏览器都不支持SSL了
HTTPS的流程:
- 客户端通过URL访问服务器建立连接
- 服务器返回自己的证书,证书中包含有自己的公钥
- 客户端根据双方同意的安全等级,建立会话秘钥
- 将这个秘钥使用服务器的公钥加密后传输给服务器端(非对称加密)
- 服务器使用自己的私钥解析出该会话秘钥
- 后续双方的通信都使用这个会话秘钥进行加密(对称加密)
为什么传输内容要是用对称加密
- 对称加密的效率更高
- 一对公钥私钥解决的是单向的加解密,如果使用非对称加密,每一个浏览器都需要有自己的私钥,这明显是不合理的,因为私钥是需要申请的。
使用了HTTPS就绝对安全吗
不绝对安全,可能存在中间人攻击,本地存储的会话秘钥(随机数)也有安全隐患
- 中间人攻击:https的请求可以被中间人拦截(只是内容是加密的),为了防止中间人攻击,浏览器会在通信前验证服务器公钥是否合法,如果不合法会给出风险提示,但是此时用户仍然可以授权证书继续访问,此时就会有中间人攻击的风险。
- 本地会话秘钥:在传输内容时,使用的是对称加密,因此该会话秘钥在客户端和服务器本地都需要进行存储。针对本地存储的随机数,https是不能保证它的安全性的。(https只保证传输过程的安全,针对本地的安全,需要安装杀毒软件等,是另一个安全范畴)
HTTP与HTTPs的区别
- http不安全,明文传输、不校验参数完整性,不验证身份,https是它的安全版本
- https即采用了对称加密,也采用了非对称加密,并且引入了CA(certificate authority)证书做身份认证,来避免中间人攻击。
- http的端口是80,https的端口是443
- https缺点:
- 部署成本比较高(购买CA证书,加解密使得cpu消耗资源比较多)
- 过程比较复杂(SSL握手),会导致延时增加
网络安全
- 明文->hash函数->消息摘要
- 消息摘要->签名算法->数字签名
什么是数字签名
数字签名的作用:用于确认发送者的身份和保护数据完整性
过程:比较两个消息摘要是否相等!
- A通过hash函数生成一个消息摘要
- A用自己的私钥给消息摘要加密生成数字签名
- A发送数字签名和明文消息
- B用A的公钥解密数字签名得到消息摘要(能用A的公钥解开说明消息确实是A发送的)
- B使用相同的hash函数对明文消息计算生成消息摘要
- B对比这两个消息摘要,一个是公钥解密数字签名得到的消息摘要,一个是直接对消息hash得到的消息摘要,如果一样说明数据没有被篡改,这时候接收数据。
签名算法:
- RSA(RSA既可以用来非对称加密,也可以用来做数字签名)
- DSS(只能用来签名,不能用来加密),基于离散对数困难问题
为什么数字签名要对摘要进行非对称加密
为什么不是对原始数据进行加解密计算呢?
- 非对称加密技术并不适合对大量信息使用,明文长度太长会降低加密效率
- 由MD5和SHA生成的散列值分别是128和160位固定的长度,体量较小,所以选择对消息摘要进行加解密
什么是数字证书
- 数字证书的作用:确定公钥没有被伪造,证明公钥和发送方的绑定关系
- 数字证书的生成:
- A将自己的身份信息和公钥发送给认证中心CA
- CA将A的身份信息和公钥生成一个用CA的私钥加密的数字签名,并组合成一个数字证书给A
- 数字证书的使用:
- A在发送时,将自己的证书附在信件后面
- B收到后,先将证书中的数字签名取下来用CA的公钥解密,得到消息摘要,用hash函数对其他信息进行运算得到另一个消息摘要,对比两个消息摘要,如果相同说明公钥确实是A的。
什么是cookie和session
对称加密、非对称加密、散列函数
对称加密:
- DES:循环 16 轮的 Feistel 结构, 明文分组长度和初始密钥长度都是 64 位
- AES:字节代换+行位移+列混合+轮秘钥加密
非对称加密:
- RSA;基于大整数分解困难问题
- ECC:基于椭圆曲线离散对数的困难问题,与大整数分解问题相比,椭圆曲线离散对数问题要困难很多,ECC的特点是秘钥短(秘钥短的好处),安全性高。
散列函数:MD5、SHA-1、SHA-256
- 强无碰撞性:两个不同的变量对应两个不同的hash值
- 单向性:有变量求hash值容易,由hash值反求变量值很困难
- 定长:任意长度的变量能够映射到定长的比特串(比如说消息摘要就是定长的)
网络各层的安全问题
1️⃣ 应用层:
- DHCP:伪造DHCP发现报文,消耗地址池中的所有地址;伪造释放报文,让ip地址重新分配;伪造提供报文,提供无效的ip地址
- DNS:伪造大量的DNS查询报文,发起DOS攻击,淹没DNS服务器;伪造DNS应答报文,恶意篡改域名和ip对应的表项
2️⃣ 传输层:
- TCP:
- SYN泛洪攻击:客户端资源是在第三次握手之后分配的。攻击者发送大量第一次握手的数据包,对服务器回复的ACK不予确认。导致服务器所有的连接处于挂起状态,消耗服务器资源。
- RST复位攻击:攻击者创建tcp复位数据报,将数据报发送给受害者和服务器,终止两者的连接。复位数据报的伪造要求【源IP、源端口、目标IP、目标端口、序号】都要正确,而且序号要落在窗口内,因此窗口越大,越容易发起复位攻击
- 会话劫持:扰乱客户和服务器之间的同步状态,改写客户与服务器之间的会话
- UDP:
- 攻击者可以向被攻击者发送大量的UDP消息,被攻击目标会忙于处理这些消息而浪费大量的存储资源和计算资源,从而实现拒绝服务攻击的目的。
3️⃣ 网络层:
- ARP协议:中间人攻击
webSocket 和 Socket 的 区别
ARP协议的工作过程
- 功能:ARP完成本局域网上主机或路由器ip地址到mac地址的映射,解决下一跳走哪的问题
- 过程:
- 主机A要向另一个网段中的主机B发送一个ip分组,ip分组的源ip地址是A的ip地址,目的ip地址是B的ip地址,在传输过程中不会变化
- 主机A在自己的ARP缓存中查找网关路由器ip对应的mac地址,假设找到了该mac地址,则将网关地址作为mac帧的目的mac地址,自己的mac地址作为源mac地址封装在mac帧中,发送给网关路由器。
- 网关路由器将这个mac帧解封装,查看ip分组的目标ip地址,查找路由表,得到发往目标ip地址的下一跳ip地址,在本例中主机B与网关路由器直接相连,即目标ip地址就是下一跳地址。
- 此时网关路由器查找自己的arp缓存,查看是否有主机B的ip地址对应的mac地址,发现并没有,此时向本局域网内的所有节点发送一个arp广播分组,并将待查询的ip地址封装在该分组中,本局域网内的所有主机将会收到这个分组,并且查看其中的ip地址,如果ip地址不是自己就置之不理,如果是自己就返回自己的mac地址。
- 网关路由器得到arp响应分组,成功得到了主机B的mac地址,将其写进mac帧中,传送成功。
ICMP协议的功能
- 目的:为了更有效地转发ip数据报和提高交付成功的机会,是网络层的协议
- 功能:报告错误、交换受限控制和状态信息等
- 时机:当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息
- 应用:ping 基于ICMP
DOS、DDOS、DRDOS
- DOS: (Denial of Service),翻译过来就是拒绝服务,一切能引起DOS行为的攻击都被称为DOS攻击。最常见的DoS攻击就有计算机网络宽带攻击、连通性攻击。
- DDoS: (Distributed Denial of Service),翻译过来是分布式拒绝服务。是指处于不同位置的多个攻击者同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。常见的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood等。
- DRDoS: (Distributed Reflection Denial of Service),中文是分布式反射拒绝服务,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,从而形成拒绝服务攻击。
CSRF攻击
- CSRF,跨站请求伪造(英文全称是Cross-site request forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
怎么解决CSRF攻击呢?
- 检查Referer字段
- 添加校验token
XSS攻击
- XSS,跨站脚本攻击(Cross-Site Scripting)。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS