主题
计算机网络 已完结
网络分层模型
介绍一下 OSI 七层模型,各层协议都有什么
- 应用层:为应用程序提供网络服务。HTTP、FTP、SMTP、POP3、DNS
- 表示层:负责应用层编码和转换
- 会话层:控制计算机之间的会话状态
- 传输层:设备间端到端的通讯。UDP、TCP
- 网络层:负责主机寻址和路由。IP、ARP (IP 转 MAC)、ICMP (ping)
- 数据链路层:负责转发,提供节点到节点之间的连接
- 物理层:数据传输的物理介质
TCP/IP 网络模型有哪几层
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
IP 协议和 TCP 协议属于哪一层
IP 协议是网络层
TCP 协议是传输层
网络为什么要分层
降低耦合度,灵活性高
下层为上层提供服务,上册无需关心实现方式
键入网络场景问题
输入网址后,期间发生了什么?
- 发起 HTTP 请求
- DNS 解析
- 传输层 TCP 三次握手
- 网络层封装数据报
- 数据链路层通过 ARP 协议获取 MAC 地址,通过 MAC 地址转发
- HTTPS 还需要四次握手
- 服务器返回 HTTP 相应
DNS 是如何解析的?属于那一层的协议?
应用层协议
迭代查询:先向根服务器查询,获取顶级域名服务器地址;查询顶级域名服务器,获取权威域名服务器地址;查询权威域名服务器,获取指定域名的 ip 地址
DNS 域名解析用的什么协议
UDP 协议。DNS 只需要单次传输,且查询频繁。超时可以超时重发请求。
输入域名是如何知道端口的?
HTTP:80
HTTPS:443
网络传输场景问题
如果浏览器没有显示页面有哪些原因
- 客户端是否能访问其他页面、网络配置是否正确
- 查看服务端是否正在监听对应端口,是否开放防火墙
- Ping 域名,查看是否能使用 ICMP 通讯,是否能解析出 IP 地址
- 查看后台日志,是否存在配置错误或慢 SQL等
客户端 TCP 连接一个 IP 不存在的服务端会发生什么?
- 内网:ARP 不能获取到 MAC 地址,无法发送
- 公网:没有相应,直到最大重传次数
客户端 TCP 连接一个 IP 存在,端口不存在的服务端会发生什么?
返回 RST 报文
客户端 UDP 发送一个 IP 存在,端口不存在的报文会发生什么?
通过 ICPM 报告不可达
HTTP
HTTP 协议有什么特点
- 以文本形式传输
- 请求应答模式
- 基于 TCP 可靠传输
- 头部可以添加字段,扩展性高
- HTTP 请求是无状态的,无需记录信息。
HTTP 报文格式?如何分割的
请求头 请求空行 请求体
分隔符:换行符
HTTP 有什么方法?
GET、POST、DELETE、PUT
OPTION:询问支持的请求方法
HEAD:类似GET,但只获取请求头
CONNECT:用于 SSL 加密
TRACE:显示服务器收到的请求,用于测试
分析一下那些 HTTP 方法是安全或者幂等的?
- 安全:GET、HEAD
- 不安全:PUT、POST、DELETE
- 幂等:GET、HEAD、DELETE、PUT
- 不幂等:POST
GET 和 POST 请求的区别?
- 语义:GET 是请求资源、POST 是提交信息
- 安全和幂等性:GET 安全幂等、POST 不安全不幂等
- 请求参数:GET 在路径中、POST 在请求体中
GET 请求一定安全且幂等吗?
符合 Restful 规范是幂等的,如果开发者未按照规范开发也会造成不安全或不幂等。
HTTP 有什么状态码?
⼀信 ⼆成 三重 四五败
1xx ⼀信
- 接收到请求,正在继续处理。
2xx ⼆成
- 200 : 成功
- 204 : 200状态码 - ⽆Body
- 206 : 200状态码 - 返回了部分body (表示后面还有响应体需要接收)
3xx 三重
- 301 : 永久重定向(会缓存)
- 302 : 临时重定向(不会缓存)
- 304 : 资源未修改,重定向到缓存
4xx 四败 客户端!!!
- 404 : 没找到资源
- 400 : 请求报⽂有误
- 401 : 请求需要认证(未登陆)
- 403 : 禁⽌访问
5xx 五败 服务端!!
- 500 : 未知错误
- 502 : 服务器⽹关或者代理出现问题(Nginx转发请求时找不到源服务器)
- 503 : 服务器繁忙
什么情况会出现 502 错误?
服务器使用了反向代理服务器,且应用服务器出现了宕机,反向代理服务器会返回 502 错误。
什么情况会出现 504 错误
服务器使用了反向代理服务器,且应用服务器出现了超时,反向代理服务器会返回 502 错误。
重定向是哪一类状态码?临时和永久有什么区别?
301、302、304、307
- 301 永久:会被浏览器缓存
- 302 临时:不会缓存
- 307 临时:不允许改变请求方式
- 304 缓存:重定向到缓存
HTTP 1.1、2.0 和 3.0 的区别
HTTP 2.0 相比 HTTP 1.1 的改进:
- 实现并发传输:引入了 Stream,多个 Stream 复用一个 TCP 连接。
- 头部压缩 + 二进制格式
- 支持服务器主动推送资源
HTTP 3.0 相比 HTTP 2.0 的改进:
- HTTP 3.0 使用了基于 UDP 和 QUIC 协议,解决了 TCP 队头阻塞的问题
- HTTP 3.0 使用 QUIC 协议,三次握手可以建立连接和 TLS 握手
- 基于连接 ID 确认连接,在切换网络时不需要重新建立连接
HTTP 用户的操作,服务端如何知道所属一个用户
- 使用 Session 机制,将用户信息存放在服务器,通过 Session 区分用户信息。
- 使用 JWT 机制,将数据存放在客户端
如果禁用 Cookie 怎么实现 Session?
在 URL 中携带 SessionID
Cookie、Session 和 Token 的区别
- 存储位置
- Cookie、Token 存在客户端
- Session 存在服务器
- 数据安全
- Cookie 可能被篡改和截取
- Session 和 Token 安全性较高
- 跨域支持
- Cookie 和 Session 不支持跨域传输,需要前后端进行相关配置
- Token 存储在 LocalStorage,没有跨域问题
JWT 的原理和校验机制
由三部分组成:头部、负载、签名
- 头部:签名算法
- 负载:存放的信息
- 签名:用于服务端验证
什么是跨域
域名、协议、端口,三者有一个不同即为跨域,浏览器不允许发起跨域请求
Restful 是什么?有什么特点?
Restful 是一种接口规范。通过请求方法的语义区分请求。
- /post
- /post/id
HTTPS
HTTP 和 HTTPS 的区别
- 端口号
- HTTP 80
- HTTPS 443
- 安全性
- HTTP 明文传输
- HTTPS 使用 SSL 加密
- 建立连接
- HTTP:TCP 三次握手
- HTTPS:TCP 三次握手 + SSL 握手
- 证书
- HTTPS 使用数字证书验证服务器身份
了解哪些加密算法
- 对称加密:数字签名
- 非对称加密:公钥私钥
- 哈希加密:md5、SHA264
对称加密和非对称加密的区别
- 秘钥:对称加密只有一个秘钥,秘钥加密解密;非对称加密有两个秘钥,由一个加密,使用另一个解密。
- 速度:对称加密速度相对非对称加密较快
HTTPS 建立连接过程
RSA 加密:
- Client Hello:客户端发送支持的 TLS 版本、Client Random、支持的密码套件列表。
- Server Hello:服务器确认 TLS 版本、加密套件、Server Random、数字证书。
- 客户端回应:验证证书后,发送一个随机数 pre-master key、加密算法改变通知。客户端握手结束,并将之前所有报文做摘要供服务端校验。
- 服务端回应:通过 Client Random、Server Random、pre-master key 计算出会话密钥,回应加密算法改变通知,,并将之前所有报文做摘要供客户端校验。
参考文献:
HTTPS 过程经历了多少次加密
HTTPS 握手之前:
- 服务端注册证书需要用 CA 的私钥对服务端公钥前面形成证书,涉及一次非对称加密
HTTPS 握手时:
- 客户端使用服务端公钥加密随机数,服务端解密,涉及一次非对称加密
- 客户端和服务端生成对称密钥之后,都需要对之前握手的数据做个摘要,并用对称密钥加密,这个过程客户端和服务端各用了一次对称加密
HTTPS 握手完成后:
- 每次传输的数据都要进行对称加密和解密
SSL 握手为什么要用非对称加密
保证对称加密的秘钥不被窃取
为什么 HTTPS 不用非对称加密
非对称加密会消耗较多的 CPU 资源,不适合用于大量加解密场景。=
HTTPS 会对 URL 加密吗
HTTPS 会对整个报文加密。
证书是绿色的是什么意思
证书是可信的,被 CA 认证过
自己编一个证书可以吗?
不可以,只有 CA 认证过的证书才是合法的证书。
TCP 三次握手 🤝
TCP 头部有什么字段
目的端口号、源端口号、序列号、确认号、标志位、窗口大小、头部长度
说一下 TCP 三次握手过程
- 客户端 -> 服务端:【SYC】syc = 1, seq = x
- 服务器 -> 客户端:【SYC + ACK】syc = 1, ack = x + 1, seq = y
- 客户端 -> 服务端:【ACK】ack = y + 1
为什么需要三次握手?两次不行吗?
- 三次握手可以确保服务端和客户端都具有收发能力
- 避免建立历史连接
第二次握手丢包会发生什么?
第二次握手是服务端发送 ACK-SYC 报文
- 客户端重发 SYC 报文
- 服务端重发 ACK-SYC 报文
第三次握手丢包会发生什么?
第三次握手是客户端发送 ACK 报文
客户端重传 ACK 报文
聊一下 TCP 的半连接队列和全连接队列?
- 半连接队列:服务端接收到 SYC 请求(第一次握手)后,内核将连接放入半连接队列
- 全连接队列:服务端接收到 ACK 请求(第三次握手)后,内核将连接从半连接队列移动至全连接队列,等待调用 accept 函数时取出连接。
TCP 四次挥手
TCP 四次挥手过程
- 客户端 -> 服务端:【FIN】fin = 1, seq = x, ack = y
- 服务器 -> 客户端:【ACK】ack = x + 1, seq = y
- 服务端 -> 客户端:【FIN】fin = 1, seq = y, ack = x
- 客户端 -> 服务端:【ACK】ack = y + 1, seq = x
为什么需要四次挥手?三次的问题
TCP 是全双工协议,可能在一方想要断开连接时,对方还有消息正在发送。所以需要分别断开连接。
TIME_WAIT 是如何产生的?
在第四次挥手后,TIME_WAIT 状态发生在主动关闭连接的一方(大多为客户端),会持续 2MSL,保证对方收到了最后一个 ACK 报文。
为什么 TIME_WAIT 需要等待 2MSL?
- 保证对方收到了最后一个 ACK 报文(第四次挥手)
- 保证这次连接的所有报文都已经消亡,避免历史连接对新连接造成干扰
TIME_WAIT 过多有什么危害?
客户端:四元组信息中只有客户端端口号是变量,TIME_WAIT 过多会造成占用大量端口号。
服务器:维护 TIME_WAIT 状态,会占用过多系统资源。
怎么解决 TIME_WAIT 过多?
客户端:打开 tcp_tw_reuse,复用 TIME_WAIT 的连接
服务端:由于只有主动断开方会存在 TIME_WAIT,服务端可以让客户端主动断开
服务端产生 TIME_WAIT 过多的原因是什么?
- 没有开启 HTTP 长连接:大量短连接会造成多个 TIME_WAIT。可以开启 Keep-Alive 机制。
- 超过了 HTTP 长连接的最大限制:手动优化调整参数。
服务端产生 CLOSE_WAIT 过多的原因是什么?
服务端代码出现问题,没有及时调用 close 函数关闭连接。
TCP 和 UDP
TCP 和 UDP 有什么区别?
TCP 是传输控制协议,面向连接,发送数据前需要建立连接
UDP 是用户数据报协议,面向报文,无连接协议,直接发送
TCP 有超时重传,拥塞控制、流量控制,保证可靠传输;UDP 不考虑可靠性。
TCP 发送的数据是字节流,没有边界;UDP 是分包发送,有边界。
什么时候用 TCP?什么时候用 UDP?
TCP:关注可靠性和顺序性
UDP:考虑速度和实时性
视频面试用的是什么?UDP丢包的现象
我认为是 UDP 协议
UDP 相比 TCP 实时性较好,UDP 丢包会丢失一个瞬间的画面或声音,但是 TCP 丢包会重传导致画面卡住不动。
UDP 如何变成可靠传输
UDP 可靠的方法:
- 重传:加入序列号和确认号
- 流量控制:滑动窗口,通过缓冲区批量发送和接收
- 拥塞控制:通过拥塞控制算法实现
相比 TCP 的优点:
- TCP 只有固定的算法,可靠的 UDP 实现可以通过不同的目的使用多种算法
- TCP 是在传输层实现的,可靠的 UDP 是在应用层实现的,更方便升级协议
TCP 和 UDP 能用一个端口吗?
可以的,TCP 端口和 UDP 端口互相独立。
Socket 连接由五元组确定,不会冲突。
TCP 可靠性
TCP 是如何保证可靠性的?
- 建立连接需要三次握手
- 有确认应答机制
- 超时重传机制
- 滑动窗口机制
- 拥塞控制
TCP 流量控制与拥塞控制的区别?
- 流量控制:端到端的控制,防止发送方发送的速度超过接收方的接收速度。
- 拥塞控制:网络层的控制,防止过多的数据报造成网络拥塞
滑动窗口怎么设计的?解决了什么问题
窗口是内核的缓冲区,分为发送窗口和接收窗口。
- 发送窗口可以批量发送数据,提高效率
- 接收窗口可以实现流量控制
TCP 拥塞控制是怎么实现的
慢启动、拥塞避免、超时重传、快重传和快恢复
发送窗口 = Min(拥塞窗口, 接收窗口)
- 慢启动:发送方开始设置较小值,每收到一个确认,拥塞窗口翻倍,直到慢启动门限。
- 拥塞避免:达到门限后,每收到一个确认,拥塞窗口 +1。
- 拥塞发生:
- 超时重传:门限设定为当前拥塞窗口的一半,拥塞窗口置为初始值,进入慢启动
- 快重传和快恢复:连续收到三次 ACK,拥塞窗口减半,门限设置为当前拥塞窗口大小,进入拥塞避免
TCP 累计应答和延迟应答是什么?
- 累计应答:接收方可以一次确认多个连续发送的数据
- 延迟应答:接收方不会立即应答,等待一定时间后累计应答,提高效率
TCP 场景
TCP 拆包沾包的原因是什么?怎么解决
原因:
- TCP 面向字节流,不关心数据边界。对于大包会被拆成数个小包,对于小包会拼接成大包。
解决方式:
- 固定消息长度:固定长度大小的选值比较难
- 分隔符:类似 HTTP 的请求空行,方便拆分数据
- 发送消息长度:在包头存放消息的长度
TCP的 keepalive 了解吗?说一说它和 HTTP 的 keepalive 的区别?
HTTP 的 keepalive 是 HTTP 长连接,可以使用一个 TCP 连接多次请求和应答。
TCP 的 keepalive 是 TCP 报活机制,双方长时间没有通信会发送探测报文,确认对方在线。
IP 会分片,为什么 TCP 还需要分片呢?
保证每一个 IP 数据报都有 TCP 头部,提高重传效率。
如果 TCP 不分片,丢包之后需要重传整个消息。TCP 分片之后,只需要重传当前分片即可。
一个服务端进程最多可以建立多少条 TCP 连接?
TCP 连接由四元组决定:源端口、源 IP、目的端口、目的 IP
理论最大值是 2 的 48 次方。(端口 × IP:2^32 * 2^16 = 2^48)
实际会受到服务端系统资源的限制。
如果已经建立了连接,但是服务端突然出现断电了会发生什么?
- 发送消息:超时重传至最大值后断开
- 不发送消息
- 开启 TCP 保活:有探测报文,未收到回应会断开
- 未开启 TCP 保活:保持连接
如果已经建立了连接,但是服务端的进程崩溃会发生什么?
内核会回收连接,发送 FIN 与客户端四次挥手
TCP 中 SYN 洪水是什么?如何防止?
大量 IP 发送 SYN 报文后不进行第三次握手,占用服务端半连接队列。
- 调整半连接队列大小
- 开启 syn cookie 机制,对于正常连接可以跳过半连接队列
- 减少 syc-ack 重传次数
网络层
ping 的工作原理说一下
通过 ICMP 发送 ping 请求,对方接收到后会发送应答的 ICMP 的报文。
常用于连通性测试。
交换机和路由器有什么区别?
- 交换机是二层设备,工作在数据链路层。用于局域网内数据包的转发。
- 路由器是三层设备,工作在网络层。用于不同网络之间的通信。
IP 地址和 MAC 地址有什么区别?
- IP 地址是网络层的标识,用于不同网络之间的传输。
- MAC 地址是链路层的标识,用于局域网之间的通信。
为什么有了 IP 地址,还需要 MAC 地址?
- IP 地址用于网络层,负责在不同网络之间路由,适用于跨网络通信。
- MAC 地址则用于链路层,负责局域网内的通信。
NAT 是什么协议?
NAT 是网络地址转换协议,网络层协议。用于将内网 IP 地址转换成公网 IP 地址。
NAT 协议可以让多个内网 IP 地址的设备共享一个公网 IP 地址,通过端口区分。解决公网 IP 地址匮乏的问题。
192.168.1.100/24 中的斜杠代表什么意思?
表示子网掩码的二进制位数
Socket 和 WebSocket 之间的区别
- Socket 是一种底层的网络通信机制,提供了一种在网络中进行数据传输的接口。
- WebSocket 是一个基于 TCP 协议,为在浏览器和服务器之间提供全双工网络通讯的协议。
网络安全
DNS 劫持是什么?
DNS 服务器的解析结果被篡改,解析到错误的 IP。
- 可以手动修改 DNS 服务器,绕过被劫持的 DNS 服务器。
DNS 污染是什么?
DNS 使用 UDP 协议,无连接。通过监听 DNS 报文,可以劫持并伪造虚假的 DNS 回应。
- 可以修改本地 host 文件
- 绕过被污染的 DNS 服务器
简述 DDoS 攻击原理,如何防范它?
DDoS 攻击是分布式拒绝服务攻击。对服务器发送大量请求,让服务器高负载,不能正常提供服务。
- 使用人机验证,验证码
- 对恶意 IP 进行限制
- 使用 DDoS 防护服务
什么是 XSS 攻击?如何防止?
上传恶意 js 代码
- 过滤特定字符
- 使用 HTTP-Only Cookie:限制 js 访问权限
什么是 CSRF 攻击?如何防止?
跨站点请求伪造攻击。用户有了网站 A 的 Session,网站 B 让浏览器向网站 A 发起恶意请求。
- 验证码
- 同源检测:服务端不允许跨域
- 使用 CSRF 令牌:当前会话的临时验证
- 使用 Token
什么是 SQL 注入攻击?如何防止?
在请求中植入恶意的 SQL 语句,在执行 SQL 时构造出恶意的 SQL 语句。
- 使用预编译语句
- 对于输入进行过滤
- 限制数据库用户的权限