TCP/IP 简化为四层实现,分别应用层、传输层、网络层、网络接口层。
- 在网络接口层,增加了帧头和帧尾,帧头包含了 Mac 地址,帧尾包含了循环冗余校验(CRC)
- 在网络层,增加了包头,包头包含了源和目标的 IP 地址
- 在传输层,增加了 TCP 段头,UDP 数据报头,包含了源和目标的端口号、序列号、确认号、校验和
- 在应用层,增加了应用数据和应用层协议的头信息。
TCP 和 UDP 的区别
特性 | TCP | UDP |
---|---|---|
连接性 | 面向连接 | 无连接 |
可靠性 | 可靠传输 | 不可靠传输 |
流量控制 | 有 | 无 |
拥塞控制 | 有 | 无 |
传输速度 | 较慢 | 较快 |
数据传输方式 | 字节流 | 报文 |
应用场景 | 文件传输、网页浏览、电子邮件 | 视频流、实时游戏、DNS查询 |
开销 | 较大(20字节头部) | 较小(8字节头部) |
- 面向连接:使用三次握手和四次挥手机制来实现
- 可靠传输:确认应答、重传机制
- 流量控制:使用滑动窗口协议
- 拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
- 字节流和报文的区别
特性 | 字节流 (Byte Stream) | 报文 (Message) |
---|---|---|
数据边界 | 无明确边界,连续字节序列 | 有明确边界,独立数据单元 |
可靠性 | 可靠传输,保证顺序和完整性 | 不保证可靠性,可能丢失或乱序 |
数据传输方式 | 连续流式传输 | 独立报文传输 |
// TCP
发送方: Hello, how are you?
接收方: Hello, how are you?
// UDP
发送方: [Message1] [Message2] [Message3]
接收方: [Message1] [Message3] [Message2]
HTTP 版本
- HTTP 0.9: 仅有 GET 方法,响应内容只能是 HTML 和文本。
- HTTP 1.0: 增加了请求方法,并支持了更多的数据类型。每次请求均需要建立 TCP 连接。
- HTTP 1.1: 引入了持久连接,复用 TCP 连接发送多个 HTTP 请求。
- HTTP 2.0: 支持多路复用和头部压缩。支持服务端推送。
- HTTP 3.0: 基本 QUIC(基于 UDP),引入 O-RTT 握手和连接迁移。
HTTPS 流程
-
客户端Hello:
- 客户端向服务器发送“ClientHello”消息,包含客户端支持的协议版本、加密算法、压缩方法和一个随机数。
-
服务器Hello:
- 服务器响应“ServerHello”消息,包含服务器选择的协议版本、加密算法、压缩方法和一个随机数。
- 服务器发送其SSL/TLS证书,包含公钥。
- 服务器可能还会发送“ServerKeyExchange”消息(如果使用了某些密钥交换算法),以及“ServerHelloDone”消息表示服务器Hello结束。
-
客户端密钥交换:
- 客户端生成一个新的随机数,并使用服务器的公钥加密这个随机数,发送给服务器。这个随机数将用作会话密钥。
- 客户端发送“ChangeCipherSpec”消息,通知服务器所有后续通信将使用协商好的加密算法和会话密钥。
- 客户端发送“Finished”消息,包含所有握手消息的摘要,确保握手过程未被篡改。
-
服务器密钥交换:
- 服务器使用自己的私钥解密客户端发送的随机数,生成会话密钥。
- 服务器发送“ChangeCipherSpec”消息,通知客户端所有后续通信将使用协商好的加密算法和会话密钥。
- 服务器发送“Finished”消息,包含所有握手消息的摘要,确保握手过程未被篡改。
-
安全通信:
- 通过完成握手,客户端和服务器都生成了相同的会话密钥,用于对后续的HTTP数据进行加密和解密。
HTTP 常用的头信息
通用头、请求头、响应头、实体头和安全相关头。
HTTP 状态码
- 1xx - 信息性响应:这些状态码表示请求已被接收,服务器继续处理。
- 2xx - 成功:这些状态码表示请求已成功被服务器接收、理解并处理。
- 3xx - 重定向:这些状态码表示请求需要进一步操作才能完成。
- 4xx - 客户端错误:这些状态码表示请求包含错误或无法处理。
- 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 请求。 - 代理服务器: 通过服务器端代理请求,绕过浏览器的跨域限制。
- CORS (Cross-Origin Resource Sharing) : 服务器通过设置响应头
在 webpack 中可以直接设置。原理就是在本地启一个服务,然后当你请求某个网址的时候,这个服务会真正的去请求网址,并将返回值的 header 中拼上 Access-Control-Allow-Origin
返回给你以绕开浏览器的限制。
浏览器安全
- CSRF:
- XSS: