Skip to content

计算机网络 已完结 ​

网络分层模型 ​

介绍一下 OSI 七层模型,各层协议都有什么 ​

  1. 应用层:为应用程序提供网络服务。HTTP、FTP、SMTP、POP3、DNS
  2. 表示层:负责应用层编码和转换
  3. 会话层:控制计算机之间的会话状态
  4. 传输层:设备间端到端的通讯。UDP、TCP
  5. 网络层:负责主机寻址和路由。IP、ARP (IP 转 MAC)、ICMP (ping)
  6. 数据链路层:负责转发,提供节点到节点之间的连接
  7. 物理层:数据传输的物理介质

TCP/IP 网络模型有哪几层 ​

  1. 应用层
  2. 传输层
  3. 网络层
  4. 数据链路层
  5. 物理层

IP 协议和 TCP 协议属于哪一层 ​

IP 协议是网络层

TCP 协议是传输层

网络为什么要分层 ​

降低耦合度,灵活性高

下层为上层提供服务,上册无需关心实现方式

键入网络场景问题 ​

输入网址后,期间发生了什么? ​

  1. 发起 HTTP 请求
  2. DNS 解析
  3. 传输层 TCP 三次握手
  4. 网络层封装数据报
  5. 数据链路层通过 ARP 协议获取 MAC 地址,通过 MAC 地址转发
  6. HTTPS 还需要四次握手
  7. 服务器返回 HTTP 相应

DNS 是如何解析的?属于那一层的协议? ​

应用层协议

迭代查询:先向根服务器查询,获取顶级域名服务器地址;查询顶级域名服务器,获取权威域名服务器地址;查询权威域名服务器,获取指定域名的 ip 地址

DNS 域名解析用的什么协议 ​

UDP 协议。DNS 只需要单次传输,且查询频繁。超时可以超时重发请求。

输入域名是如何知道端口的? ​

HTTP:80

HTTPS:443

网络传输场景问题 ​

如果浏览器没有显示页面有哪些原因 ​

  1. 客户端是否能访问其他页面、网络配置是否正确
  2. 查看服务端是否正在监听对应端口,是否开放防火墙
  3. Ping 域名,查看是否能使用 ICMP 通讯,是否能解析出 IP 地址
  4. 查看后台日志,是否存在配置错误或慢 SQL等

客户端 TCP 连接一个 IP 不存在的服务端会发生什么? ​

  1. 内网:ARP 不能获取到 MAC 地址,无法发送
  2. 公网:没有相应,直到最大重传次数

客户端 TCP 连接一个 IP 存在,端口不存在的服务端会发生什么? ​

返回 RST 报文

客户端 UDP 发送一个 IP 存在,端口不存在的报文会发生什么? ​

通过 ICPM 报告不可达

HTTP ​

HTTP 协议有什么特点 ​

  1. 以文本形式传输
  2. 请求应答模式
  3. 基于 TCP 可靠传输
  4. 头部可以添加字段,扩展性高
  5. HTTP 请求是无状态的,无需记录信息。

HTTP 报文格式?如何分割的 ​

请求头 请求空行 请求体

分隔符:换行符

HTTP 有什么方法? ​

GET、POST、DELETE、PUT

OPTION:询问支持的请求方法

HEAD:类似GET,但只获取请求头

CONNECT:用于 SSL 加密

TRACE:显示服务器收到的请求,用于测试

分析一下那些 HTTP 方法是安全或者幂等的? ​

  1. 安全:GET、HEAD
  2. 不安全:PUT、POST、DELETE
  3. 幂等:GET、HEAD、DELETE、PUT
  4. 不幂等:POST

GET 和 POST 请求的区别? ​

  1. 语义:GET 是请求资源、POST 是提交信息
  2. 安全和幂等性:GET 安全幂等、POST 不安全不幂等
  3. 请求参数: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 的改进:

  1. 实现并发传输:引入了 Stream,多个 Stream 复用一个 TCP 连接。
  2. 头部压缩 + 二进制格式
  3. 支持服务器主动推送资源

HTTP 3.0 相比 HTTP 2.0 的改进:

  1. HTTP 3.0 使用了基于 UDP 和 QUIC 协议,解决了 TCP 队头阻塞的问题
  2. HTTP 3.0 使用 QUIC 协议,三次握手可以建立连接和 TLS 握手
  3. 基于连接 ID 确认连接,在切换网络时不需要重新建立连接

HTTP 用户的操作,服务端如何知道所属一个用户 ​

  1. 使用 Session 机制,将用户信息存放在服务器,通过 Session 区分用户信息。
  2. 使用 JWT 机制,将数据存放在客户端

在 URL 中携带 SessionID

Cookie、Session 和 Token 的区别 ​

  1. 存储位置
    1. Cookie、Token 存在客户端
    2. Session 存在服务器
  2. 数据安全
    1. Cookie 可能被篡改和截取
    2. Session 和 Token 安全性较高
  3. 跨域支持
    1. Cookie 和 Session 不支持跨域传输,需要前后端进行相关配置
    2. Token 存储在 LocalStorage,没有跨域问题

JWT 的原理和校验机制 ​

由三部分组成:头部、负载、签名

  • 头部:签名算法
  • 负载:存放的信息
  • 签名:用于服务端验证

什么是跨域 ​

域名、协议、端口,三者有一个不同即为跨域,浏览器不允许发起跨域请求

Restful 是什么?有什么特点? ​

Restful 是一种接口规范。通过请求方法的语义区分请求。

  • /post
  • /post/id

HTTPS ​

HTTP 和 HTTPS 的区别 ​

  1. 端口号
    1. HTTP 80
    2. HTTPS 443
  2. 安全性
    1. HTTP 明文传输
    2. HTTPS 使用 SSL 加密
  3. 建立连接
    1. HTTP:TCP 三次握手
    2. HTTPS:TCP 三次握手 + SSL 握手
  4. 证书
    1. HTTPS 使用数字证书验证服务器身份

了解哪些加密算法 ​

  1. 对称加密:数字签名
  2. 非对称加密:公钥私钥
  3. 哈希加密:md5、SHA264

对称加密和非对称加密的区别 ​

  1. 秘钥:对称加密只有一个秘钥,秘钥加密解密;非对称加密有两个秘钥,由一个加密,使用另一个解密。
  2. 速度:对称加密速度相对非对称加密较快

HTTPS 建立连接过程 ​

RSA 加密:

  1. Client Hello:客户端发送支持的 TLS 版本、Client Random、支持的密码套件列表。
  2. Server Hello:服务器确认 TLS 版本、加密套件、Server Random、数字证书。
  3. 客户端回应:验证证书后,发送一个随机数 pre-master key、加密算法改变通知。客户端握手结束,并将之前所有报文做摘要供服务端校验。
  4. 服务端回应:通过 Client Random、Server Random、pre-master key 计算出会话密钥,回应加密算法改变通知,,并将之前所有报文做摘要供客户端校验。

参考文献:

  1. 3.3 HTTPS RSA 握手解析 | 小林coding (xiaolincoding.com)
  2. HTTPS是什么?加密原理和证书。SSL/TLS握手过程-哔哩哔哩_bilibili

HTTPS 过程经历了多少次加密 ​

HTTPS 握手之前:

  • 服务端注册证书需要用 CA 的私钥对服务端公钥前面形成证书,涉及一次非对称加密

HTTPS 握手时:

  • 客户端使用服务端公钥加密随机数,服务端解密,涉及一次非对称加密
  • 客户端和服务端生成对称密钥之后,都需要对之前握手的数据做个摘要,并用对称密钥加密,这个过程客户端和服务端各用了一次对称加密

HTTPS 握手完成后:

  • 每次传输的数据都要进行对称加密和解密

SSL 握手为什么要用非对称加密 ​

保证对称加密的秘钥不被窃取

为什么 HTTPS 不用非对称加密 ​

非对称加密会消耗较多的 CPU 资源,不适合用于大量加解密场景。=

HTTPS 会对 URL 加密吗 ​

HTTPS 会对整个报文加密。

证书是绿色的是什么意思 ​

证书是可信的,被 CA 认证过

自己编一个证书可以吗? ​

不可以,只有 CA 认证过的证书才是合法的证书。

TCP 三次握手 🤝 ​

TCP 头部有什么字段 ​

目的端口号、源端口号、序列号、确认号、标志位、窗口大小、头部长度

说一下 TCP 三次握手过程 ​

  1. 客户端 -> 服务端:【SYC】syc = 1, seq = x
  2. 服务器 -> 客户端:【SYC + ACK】syc = 1, ack = x + 1, seq = y
  3. 客户端 -> 服务端:【ACK】ack = y + 1

为什么需要三次握手?两次不行吗? ​

  1. 三次握手可以确保服务端和客户端都具有收发能力
  2. 避免建立历史连接

第二次握手丢包会发生什么? ​

第二次握手是服务端发送 ACK-SYC 报文

  1. 客户端重发 SYC 报文
  2. 服务端重发 ACK-SYC 报文

第三次握手丢包会发生什么? ​

第三次握手是客户端发送 ACK 报文

客户端重传 ACK 报文

聊一下 TCP 的半连接队列和全连接队列? ​

  1. 半连接队列:服务端接收到 SYC 请求(第一次握手)后,内核将连接放入半连接队列
  2. 全连接队列:服务端接收到 ACK 请求(第三次握手)后,内核将连接从半连接队列移动至全连接队列,等待调用 accept 函数时取出连接。

TCP 四次挥手 ​

TCP 四次挥手过程 ​

img

  1. 客户端 -> 服务端:【FIN】fin = 1, seq = x, ack = y
  2. 服务器 -> 客户端:【ACK】ack = x + 1, seq = y
  3. 服务端 -> 客户端:【FIN】fin = 1, seq = y, ack = x
  4. 客户端 -> 服务端:【ACK】ack = y + 1, seq = x

为什么需要四次挥手?三次的问题 ​

TCP 是全双工协议,可能在一方想要断开连接时,对方还有消息正在发送。所以需要分别断开连接。

TIME_WAIT 是如何产生的? ​

在第四次挥手后,TIME_WAIT 状态发生在主动关闭连接的一方(大多为客户端),会持续 2MSL,保证对方收到了最后一个 ACK 报文。

为什么 TIME_WAIT 需要等待 2MSL? ​

  1. 保证对方收到了最后一个 ACK 报文(第四次挥手)
  2. 保证这次连接的所有报文都已经消亡,避免历史连接对新连接造成干扰

TIME_WAIT 过多有什么危害? ​

客户端:四元组信息中只有客户端端口号是变量,TIME_WAIT 过多会造成占用大量端口号。

服务器:维护 TIME_WAIT 状态,会占用过多系统资源。

怎么解决 TIME_WAIT 过多? ​

客户端:打开 tcp_tw_reuse,复用 TIME_WAIT 的连接

服务端:由于只有主动断开方会存在 TIME_WAIT,服务端可以让客户端主动断开

服务端产生 TIME_WAIT 过多的原因是什么? ​

  1. 没有开启 HTTP 长连接:大量短连接会造成多个 TIME_WAIT。可以开启 Keep-Alive 机制。
  2. 超过了 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 可靠的方法:

  1. 重传:加入序列号和确认号
  2. 流量控制:滑动窗口,通过缓冲区批量发送和接收
  3. 拥塞控制:通过拥塞控制算法实现

相比 TCP 的优点:

  1. TCP 只有固定的算法,可靠的 UDP 实现可以通过不同的目的使用多种算法
  2. TCP 是在传输层实现的,可靠的 UDP 是在应用层实现的,更方便升级协议

TCP 和 UDP 能用一个端口吗? ​

可以的,TCP 端口和 UDP 端口互相独立。

Socket 连接由五元组确定,不会冲突。

TCP 可靠性 ​

TCP 是如何保证可靠性的? ​

  1. 建立连接需要三次握手
  2. 有确认应答机制
  3. 超时重传机制
  4. 滑动窗口机制
  5. 拥塞控制

TCP 流量控制与拥塞控制的区别? ​

  • 流量控制:端到端的控制,防止发送方发送的速度超过接收方的接收速度。
  • 拥塞控制:网络层的控制,防止过多的数据报造成网络拥塞

滑动窗口怎么设计的?解决了什么问题 ​

窗口是内核的缓冲区,分为发送窗口和接收窗口。

  • 发送窗口可以批量发送数据,提高效率
  • 接收窗口可以实现流量控制

TCP 拥塞控制是怎么实现的 ​

慢启动、拥塞避免、超时重传、快重传和快恢复

发送窗口 = Min(拥塞窗口, 接收窗口)

  1. 慢启动:发送方开始设置较小值,每收到一个确认,拥塞窗口翻倍,直到慢启动门限。
  2. 拥塞避免:达到门限后,每收到一个确认,拥塞窗口 +1。
  3. 拥塞发生:
    1. 超时重传:门限设定为当前拥塞窗口的一半,拥塞窗口置为初始值,进入慢启动
    2. 快重传和快恢复:连续收到三次 ACK,拥塞窗口减半,门限设置为当前拥塞窗口大小,进入拥塞避免

TCP 累计应答和延迟应答是什么? ​

  • 累计应答:接收方可以一次确认多个连续发送的数据
  • 延迟应答:接收方不会立即应答,等待一定时间后累计应答,提高效率

TCP 场景 ​

TCP 拆包沾包的原因是什么?怎么解决 ​

原因:

  • TCP 面向字节流,不关心数据边界。对于大包会被拆成数个小包,对于小包会拼接成大包。

解决方式:

  1. 固定消息长度:固定长度大小的选值比较难
  2. 分隔符:类似 HTTP 的请求空行,方便拆分数据
  3. 发送消息长度:在包头存放消息的长度

TCP的 keepalive 了解吗?说一说它和 HTTP 的 keepalive 的区别? ​

HTTP 的 keepalive 是 HTTP 长连接,可以使用一个 TCP 连接多次请求和应答。

TCP 的 keepalive 是 TCP 报活机制,双方长时间没有通信会发送探测报文,确认对方在线。

IP 会分片,为什么 TCP 还需要分片呢? ​

img

保证每一个 IP 数据报都有 TCP 头部,提高重传效率。

如果 TCP 不分片,丢包之后需要重传整个消息。TCP 分片之后,只需要重传当前分片即可。

一个服务端进程最多可以建立多少条 TCP 连接? ​

TCP 连接由四元组决定:源端口、源 IP、目的端口、目的 IP

理论最大值是 2 的 48 次方。(端口 × IP:2^32 * 2^16 = 2^48)

实际会受到服务端系统资源的限制。

如果已经建立了连接,但是服务端突然出现断电了会发生什么? ​

  • 发送消息:超时重传至最大值后断开
  • 不发送消息
    • 开启 TCP 保活:有探测报文,未收到回应会断开
    • 未开启 TCP 保活:保持连接

如果已经建立了连接,但是服务端的进程崩溃会发生什么? ​

内核会回收连接,发送 FIN 与客户端四次挥手

TCP 中 SYN 洪水是什么?如何防止? ​

大量 IP 发送 SYN 报文后不进行第三次握手,占用服务端半连接队列。

  1. 调整半连接队列大小
  2. 开启 syn cookie 机制,对于正常连接可以跳过半连接队列
  3. 减少 syc-ack 重传次数

网络层 ​

ping 的工作原理说一下 ​

通过 ICMP 发送 ping 请求,对方接收到后会发送应答的 ICMP 的报文。

常用于连通性测试。

交换机和路由器有什么区别? ​

  • 交换机是二层设备,工作在数据链路层。用于局域网内数据包的转发。
  • 路由器是三层设备,工作在网络层。用于不同网络之间的通信。

IP 地址和 MAC 地址有什么区别? ​

  • IP 地址是网络层的标识,用于不同网络之间的传输。
  • MAC 地址是链路层的标识,用于局域网之间的通信。

为什么有了 IP 地址,还需要 MAC 地址? ​

  1. IP 地址用于网络层,负责在不同网络之间路由,适用于跨网络通信。
  2. MAC 地址则用于链路层,负责局域网内的通信。

NAT 是什么协议? ​

NAT 是网络地址转换协议,网络层协议。用于将内网 IP 地址转换成公网 IP 地址。

NAT 协议可以让多个内网 IP 地址的设备共享一个公网 IP 地址,通过端口区分。解决公网 IP 地址匮乏的问题。

192.168.1.100/24 中的斜杠代表什么意思? ​

表示子网掩码的二进制位数

Socket 和 WebSocket 之间的区别 ​

  1. Socket 是一种底层的网络通信机制,提供了一种在网络中进行数据传输的接口。
  2. WebSocket 是一个基于 TCP 协议,为在浏览器和服务器之间提供全双工网络通讯的协议。

网络安全 ​

DNS 劫持是什么? ​

DNS 服务器的解析结果被篡改,解析到错误的 IP。

  • 可以手动修改 DNS 服务器,绕过被劫持的 DNS 服务器。

DNS 污染是什么? ​

DNS 使用 UDP 协议,无连接。通过监听 DNS 报文,可以劫持并伪造虚假的 DNS 回应。

  1. 可以修改本地 host 文件
  2. 绕过被污染的 DNS 服务器

简述 DDoS 攻击原理,如何防范它? ​

DDoS 攻击是分布式拒绝服务攻击。对服务器发送大量请求,让服务器高负载,不能正常提供服务。

  1. 使用人机验证,验证码
  2. 对恶意 IP 进行限制
  3. 使用 DDoS 防护服务

什么是 XSS 攻击?如何防止? ​

上传恶意 js 代码

  1. 过滤特定字符
  2. 使用 HTTP-Only Cookie:限制 js 访问权限

什么是 CSRF 攻击?如何防止? ​

跨站点请求伪造攻击。用户有了网站 A 的 Session,网站 B 让浏览器向网站 A 发起恶意请求。

  1. 验证码
  2. 同源检测:服务端不允许跨域
  3. 使用 CSRF 令牌:当前会话的临时验证
  4. 使用 Token

什么是 SQL 注入攻击?如何防止? ​

在请求中植入恶意的 SQL 语句,在执行 SQL 时构造出恶意的 SQL 语句。

  1. 使用预编译语句
  2. 对于输入进行过滤
  3. 限制数据库用户的权限

Released under the MIT License.