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.