计算机网络

28 阅读5分钟

TCP/IP 简化为四层实现,分别应用层、传输层、网络层、网络接口层。

  1. 在网络接口层,增加了帧头和帧尾,帧头包含了 Mac 地址,帧尾包含了循环冗余校验(CRC)
  2. 在网络层,增加了包头,包头包含了源和目标的 IP 地址
  3. 在传输层,增加了 TCP 段头,UDP 数据报头,包含了源和目标的端口号、序列号、确认号、校验和
  4. 在应用层,增加了应用数据和应用层协议的头信息。

TCP 和 UDP 的区别

特性TCPUDP
连接性面向连接无连接
可靠性可靠传输不可靠传输
流量控制
拥塞控制
传输速度较慢较快
数据传输方式字节流报文
应用场景文件传输、网页浏览、电子邮件视频流、实时游戏、DNS查询
开销较大(20字节头部)较小(8字节头部)
  1. 面向连接:使用三次握手和四次挥手机制来实现
  2. 可靠传输:确认应答、重传机制
  3. 流量控制:使用滑动窗口协议
  4. 拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
  5. 字节流和报文的区别
特性字节流 (Byte Stream)报文 (Message)
数据边界无明确边界,连续字节序列有明确边界,独立数据单元
可靠性可靠传输,保证顺序和完整性不保证可靠性,可能丢失或乱序
数据传输方式连续流式传输独立报文传输
// TCP
发送方: Hello, how are you?
接收方: Hello, how are you?

// UDP
发送方: [Message1] [Message2] [Message3]
接收方: [Message1] [Message3] [Message2]

HTTP 版本

  1. HTTP 0.9: 仅有 GET 方法,响应内容只能是 HTML 和文本。
  2. HTTP 1.0: 增加了请求方法,并支持了更多的数据类型。每次请求均需要建立 TCP 连接。
  3. HTTP 1.1: 引入了持久连接,复用 TCP 连接发送多个 HTTP 请求。
  4. HTTP 2.0: 支持多路复用和头部压缩。支持服务端推送。
  5. HTTP 3.0: 基本 QUIC(基于 UDP),引入 O-RTT 握手和连接迁移。

HTTPS 流程

  1. 客户端Hello:

    • 客户端向服务器发送“ClientHello”消息,包含客户端支持的协议版本、加密算法、压缩方法和一个随机数。
  2. 服务器Hello:

    • 服务器响应“ServerHello”消息,包含服务器选择的协议版本、加密算法、压缩方法和一个随机数。
    • 服务器发送其SSL/TLS证书,包含公钥。
    • 服务器可能还会发送“ServerKeyExchange”消息(如果使用了某些密钥交换算法),以及“ServerHelloDone”消息表示服务器Hello结束。
  3. 客户端密钥交换:

    • 客户端生成一个新的随机数,并使用服务器的公钥加密这个随机数,发送给服务器。这个随机数将用作会话密钥。
    • 客户端发送“ChangeCipherSpec”消息,通知服务器所有后续通信将使用协商好的加密算法和会话密钥。
    • 客户端发送“Finished”消息,包含所有握手消息的摘要,确保握手过程未被篡改。
  4. 服务器密钥交换:

    • 服务器使用自己的私钥解密客户端发送的随机数,生成会话密钥。
    • 服务器发送“ChangeCipherSpec”消息,通知客户端所有后续通信将使用协商好的加密算法和会话密钥。
    • 服务器发送“Finished”消息,包含所有握手消息的摘要,确保握手过程未被篡改。
  5. 安全通信:

    • 通过完成握手,客户端和服务器都生成了相同的会话密钥,用于对后续的HTTP数据进行加密和解密。

HTTP 常用的头信息

通用头、请求头、响应头、实体头和安全相关头。

HTTP 状态码

  1. 1xx - 信息性响应:这些状态码表示请求已被接收,服务器继续处理。
  2. 2xx - 成功:这些状态码表示请求已成功被服务器接收、理解并处理。
  3. 3xx - 重定向:这些状态码表示请求需要进一步操作才能完成。
  4. 4xx - 客户端错误:这些状态码表示请求包含错误或无法处理。
  5. 5xx - 服务器错误:这些状态码表示服务器处理请求时发生内部错误。

404 Not Found: 表示服务器无法找到请求的资源。这通常发生在URL错误或资源不存在的情况下。

302 Found 表示请求的资源临时从不同的URL响应,而 301 Moved Permanently 表示请求的资源已永久移动到新的URL。301会更新客户端的书签,而302不会。

500 Internal Server Error表示服务器遇到未预料的情况。处理方式包括检查服务器日志,排查代码中的异常,确保服务器配置正确。

304 Not Modified表示请求的资源未被修改,客户端可以使用缓存的版本。这有助于减少网络流量和提高网站性能。

router 中的 redirect 只能 302 重定向,如果想要永久重定向的话,需要使用在服务器端进行配置。

HTTP 缓存

  • 缓存: 存储资源的副本以减少延迟和带宽消耗,提高加载速度。

  • 缓存头:

    • Cache-Control: 指定缓存策略,如 no-cache, max-age, must-revalidate
    • Expires: 指定资源的过期时间。
    • ETag: 资源的唯一标识符,用于缓存验证。
    • Last-Modified: 资源的最后修改时间,用于缓存验证。

跨域请求

浏览器出于安全原因,阻止网页向不同源的服务器发送请求。不同源指的是协议、域名或端口任意一个不同。

  • 解决方法:

    • CORS (Cross-Origin Resource Sharing) : 服务器通过设置响应头 Access-Control-Allow-Origin 来允许跨域请求。
    • JSONP (JSON with Padding) : 通过 <script> 标签加载数据,适用于 GET 请求。
    • 代理服务器: 通过服务器端代理请求,绕过浏览器的跨域限制。

在 webpack 中可以直接设置。原理就是在本地启一个服务,然后当你请求某个网址的时候,这个服务会真正的去请求网址,并将返回值的 header 中拼上 Access-Control-Allow-Origin 返回给你以绕开浏览器的限制。

浏览器安全

  • CSRF:
  • XSS: