面试 | 网络



TCP/IP 协议 OSI

1
2
3
4
5
6
7
8
OSI
应用层 \ HTTP/SMTP/FTP/SSH 协议
表示层 - 应用程序 数据压缩,数据加密以及数据描述
会话层 / 数据交换的定界和同步功能
传输层 TCP/UDP 传输协议
网络层 IP 协议
链路层 以太网/WiFi/电缆接入网 等
物理层 光纤/电缆 等

TCP 和 UDP 的区别

TCP:
面向连接
一对一通信
面向字节流
全双工通信
可靠传输,使用流量控制和拥塞控制
报头最小20字节,最大60字节

UDP:
无连接
支持一对一,一对多,多对一和多对多的通信
面向报文
不可靠传输,不使用流量控制和拥塞控制
报头开销小,仅8字节

应用:
流媒体应用
用于 DNS 和 SNMP

TCP 的三次握手、四次挥手

  • SYN: Synchronize Sequence Numbers 同步序列编号
  • ACK:Acknowledgement 确认
  • seq:sequence number 序列号
  • ack:acknowledge number 应答号

三次握手:
在客户端和服务器之间建立正常的 TCP 网络连接时,客户端首先会发出一个 SYN 消息,seq 标记为 X;服务器使用 SYN+ACK 应答,ACK 应答是请求方的 seq 序列号加 1,接着置 seq 为 Y;客户端接收后,使用 ACK = Y+1 应答,接着置 seq 为 Z

http 状态码(字节)

301——请求的网页已永久移动到新位置
302——临时性重定向
304——自从上次请求后,请求的网页未修改过
400——客户端发送了一个错误的请求
401——未授权,客户端需要认证
403——请求被服务器拒绝
500——服务器遇到错误,无法为请求提供服务
502——网关故障,代理用的服务器遇到了上游的无效相应
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长

http 缓存

https://juejin.cn/post/6844903832435032072#heading-27

强缓存和协商缓存

  1. 强缓存在浏览器加载资源时,先从缓存中查找结果,如果不存在则向服务端发起请求

Exprires 是 http1.0 提出的, 服务端返回数据到期的时间.

Cache-Control有很多属性,不同的属性代表的意义也不同。

private:客户端可以缓存
public:客户端和代理服务器都可以缓存
max-age=t:缓存内容将在t秒后失效
no-cache:需要使用协商缓存来验证缓存数据
no-store:所有内容都不会缓存。

  1. 协商缓存的更新策略是不再指定缓存的有效时间,客户端会先从缓存数据库拿到一个缓存的标识,然后向服务端验证标识是否失效,如果没有失效服务端会返回304,这样客户端可以直接去缓存数据库拿出数据,如果失效,服务端会返回新的数据

Last-Modified:服务器在响应请求时,会告诉浏览器资源的最后修改时间。

  • if-Modified-Since: 从某个时间节点算起,是否文件被修改了
  • if-Unmodified-Since: 从某个时间点算起, 是否文件没有被修改

强缓存优先于协商缓存

http 1.0/1.1/2.0/3.0

https://juejin.cn/post/6869376045636648973/#heading-18

http 1.0 浏览器与服务器只保持短暂的连接, 每次请求都需要与服务器建立一个 tcp 连接服务器完成请求处理后立即断开 tcp 连接

http 1.1 默认支持长连接, 在一个 tcp 连接上可以传送多个 http 请求和响应; 同时允许客户端不用等待上次请求结果返回就发出下一次请求; 此外增加了更多的请求头和响应头, 例如引入了更多的缓存控制策略, 也添加了 put/delete/options 等请求方法

http 2.0 性能上有很大提升, 实现多路复用, 可以复用 tcp 连接, 在一个连接里, 客户端和浏览器都可以同时发送多个请求或响应, 不用在意顺序; 也采用了二进制分帧, 将请求和响应的数据分割成更小的帧, 采用二进制编码, 解析更高效, 同域名下所有通信都在单个连接上完成, 可以承载任意数量的双向数据流; 还采用了首部压缩, 也就是使用首部表跟踪和存储发送的键值对, 对于相同的数据, 不再通过每次请求和响应发送, 首部表在连接续存期始终存在, 由两端渐进更新; 此外还允许服务器推送资源, 很适合加载静态资源

http 3.0 不同于之前的 http, 3.0 建立在 UDP 连接基础上; 首先基础的: tcp 连接可能因为网络等因素断开, 但是 UDP 不会, UDP 没有四元组标识, 而是客户端随机生成的 64 位数字 ID 标识, 只要 ID 不变, 那么 UDP 就一直存在; 另一个问题是 tcp 连接在连接超时, 丢包的情况下会等待重传, 造成阻塞, 但是基于 UDP , 不会等待丢失的数据包, 会再接受完后重新拼装, 就像我们视频中丢包但不影响通话; 再有自定义拥塞控制(QUIC是应用层); 前向安全和前向纠错

参考: https://blog.csdn.net/m0_60360320/article/details/119812431

https

HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理,相对更安全

在HTTPS通信过程中,采用的是对称加密+非对称加密,也就是混合加密; 具体做法是发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”