笔记3 2025/3/2
开头状态码
HTTP 状态码 是服务器对客户端请求的响应结果的三位数字代码。状态码分为五类,分别以不同的数字开头表示不同的响应类型。以下是 HTTP 状态码的分类及其含义:
1. 1xx(信息性状态码)
表示请求已被接收,需要继续处理。
(1)100 Continue
- 含义:客户端应继续发送请求的剩余部分。
- 场景:客户端发送了一个包含
Expect: 100-continue
头的请求,服务器同意接收请求体。
(2)101 Switching Protocols
- 含义:服务器同意切换协议(如从 HTTP 切换到 WebSocket)。
- 场景:客户端请求升级协议,服务器同意。
2. 2xx(成功状态码)
表示请求已成功被服务器接收、理解并处理。
(1)200 OK
- 含义:请求成功,服务器返回了请求的数据。
- 场景:GET、POST 请求成功。
(2)201 Created
- 含义:请求成功,并且服务器创建了新的资源。
- 场景:POST 请求成功创建资源。
(3)204 No Content
- 含义:请求成功,但响应中没有返回内容。
- 场景:DELETE 请求成功,或不需要返回数据的请求。
3. 3xx(重定向状态码)
表示需要客户端进一步操作以完成请求。
(1)301 Moved Permanently
- 含义:请求的资源已永久移动到新的 URL。
- 场景:网站改版或资源迁移。
(2)302 Found
- 含义:请求的资源临时移动到新的 URL。
- 场景:临时重定向。
(3)304 Not Modified
- 含义:资源未修改,客户端可以使用缓存的版本。
- 场景:客户端发送了条件请求(如
If-Modified-Since
),服务器判断资源未修改。
4. 4xx(客户端错误状态码)
表示客户端请求有误,服务器无法处理。
(1)400 Bad Request
- 含义:请求无效,服务器无法理解。
- 场景:请求参数错误或格式不正确。
(2)401 Unauthorized
- 含义:请求需要身份验证。
- 场景:未提供有效的身份验证信息。
(3)403 Forbidden
- 含义:服务器拒绝请求。
- 场景:客户端没有访问资源的权限。
(4)404 Not Found
- 含义:请求的资源不存在。
- 场景:URL 错误或资源已被删除。
(5)405 Method Not Allowed
- 含义:请求方法不被允许。
- 场景:使用了不支持的 HTTP 方法(如对只支持 GET 的资源发送 POST 请求)。
5. 5xx(服务器错误状态码)
表示服务器处理请求时发生错误。
(1)500 Internal Server Error
- 含义:服务器内部错误,无法完成请求。
- 场景:服务器端代码或配置错误。
(2)502 Bad Gateway
- 含义:服务器作为网关或代理时,从上游服务器收到无效响应。
- 场景:上游服务器不可用或响应超时。
(3)503 Service Unavailable
- 含义:服务器暂时无法处理请求。
- 场景:服务器过载或维护中。
(4)504 Gateway Timeout
- 含义:服务器作为网关或代理时,未能及时从上游服务器收到响应。
- 场景:上游服务器响应超时。
6. 总结
状态码 | 类别 | 含义 |
---|---|---|
1xx | 信息性状态码 | 请求已被接收,需要继续处理 |
2xx | 成功状态码 | 请求已成功被服务器接收、理解并处理 |
3xx | 重定向状态码 | 需要客户端进一步操作以完成请求 |
4xx | 客户端错误状态码 | 客户端请求有误,服务器无法处理 |
5xx | 服务器错误状态码 | 服务器处理请求时发生错误 |
通过理解 HTTP 状态码的含义,可以更好地调试和优化 Web 应用程序!
为什么3握手4挥手,为什么是3和4
三次握手(Three-Way Handshake) 和 四次挥手(Four-Way Handshake) 是 TCP 协议中用于建立和终止连接的核心机制。它们的次数是由 TCP 协议的设计和通信双方的状态转换需求决定的。以下是详细解释:
1. 三次握手(Three-Way Handshake)
(1)为什么是三次握手?
三次握手是为了确保客户端和服务器双方都能确认彼此的发送和接收能力,从而建立一个可靠的连接。
(2)三次握手的过程
第一次握手:
- 客户端向服务器发送
SYN
报文,表示请求建立连接。 - 客户端进入
SYN_SENT
状态。
- 客户端向服务器发送
第二次握手:
- 服务器收到
SYN
报文后,向客户端发送SYN+ACK
报文,表示同意建立连接。 - 服务器进入
SYN_RECEIVED
状态。
- 服务器收到
第三次握手:
- 客户端收到
SYN+ACK
报文后,向服务器发送ACK
报文,表示连接已建立。 - 客户端和服务器都进入
ESTABLISHED
状态。
- 客户端收到
(3)为什么不是两次或四次?
- 两次握手:
- 如果只有两次握手,服务器无法确认客户端的接收能力,可能导致连接建立失败。
- 四次握手:
- 三次握手已经足够确保双方的发送和接收能力,四次握手会增加不必要的开销。
2. 四次挥手(Four-Way Handshake)
(1)为什么是四次挥手?
四次挥手是为了确保客户端和服务器双方都能安全地关闭连接,释放资源。
(2)四次挥手的过程
第一次挥手:
- 客户端向服务器发送
FIN
报文,表示请求关闭连接。 - 客户端进入
FIN_WAIT_1
状态。
- 客户端向服务器发送
第二次挥手:
- 服务器收到
FIN
报文后,向客户端发送ACK
报文,表示同意关闭连接。 - 服务器进入
CLOSE_WAIT
状态,客户端进入FIN_WAIT_2
状态。
- 服务器收到
第三次挥手:
- 服务器向客户端发送
FIN
报文,表示请求关闭连接。 - 服务器进入
LAST_ACK
状态。
- 服务器向客户端发送
第四次挥手:
- 客户端收到
FIN
报文后,向服务器发送ACK
报文,表示连接已关闭。 - 客户端进入
TIME_WAIT
状态,服务器进入CLOSED
状态。
- 客户端收到
(3)为什么不是三次或五次?
- 三次挥手:
- 如果只有三次挥手,服务器无法确保客户端已经收到关闭请求,可能导致资源未释放。
- 五次挥手:
- 四次挥手已经足够确保双方安全关闭连接,五次挥手会增加不必要的开销。
3. 总结
机制 | 次数 | 目的 |
---|---|---|
三次握手 | 3 | 确保客户端和服务器双方都能确认彼此的发送和接收能力,建立可靠连接 |
四次挥手 | 4 | 确保客户端和服务器双方都能安全地关闭连接,释放资源 |
通过三次握手和四次挥手,TCP 协议能够可靠地建立和终止连接,确保数据传输的完整性和可靠性!
udp和tcp区别
UDP(User Datagram Protocol,用户数据报协议) 和 TCP(Transmission Control Protocol,传输控制协议) 是两种常用的传输层协议,它们在数据传输方式、可靠性和适用场景上有显著区别。以下是它们的详细对比:
1. 连接方式
(1)TCP
- 面向连接:在数据传输之前,需要通过三次握手建立连接。
- 可靠传输:确保数据按顺序、无差错地传输。
(2)UDP
- 无连接:不需要建立连接,直接发送数据。
- 不可靠传输:不保证数据的顺序和可靠性。
2. 数据传输方式
(1)TCP
- 流式传输:将数据分割成多个数据包,按顺序传输。
- 确认机制:接收方收到数据后发送确认(ACK),发送方根据确认重传丢失的数据包。
(2)UDP
- 数据报传输:每个数据包独立发送,不保证顺序。
- 无确认机制:发送方不等待接收方的确认,数据包可能丢失或乱序。
3. 可靠性
(1)TCP
- 可靠:通过确认机制、重传机制和流量控制确保数据的可靠传输。
- 适用场景:需要高可靠性的应用(如文件传输、网页浏览)。
(2)UDP
- 不可靠:不保证数据的可靠传输,数据包可能丢失、重复或乱序。
- 适用场景:对实时性要求高的应用(如视频流、在线游戏)。
4. 传输效率
(1)TCP
- 效率较低:由于需要建立连接、确认和重传,传输效率较低。
- 开销较大:每个数据包需要额外的头部信息(如序列号、确认号)。
(2)UDP
- 效率较高:不需要建立连接和确认,传输效率较高。
- 开销较小:数据包头部信息较少,传输开销小。
5. 流量控制
(1)TCP
- 支持流量控制:通过滑动窗口机制控制发送方的发送速率,避免接收方缓冲区溢出。
(2)UDP
- 不支持流量控制:发送方以固定速率发送数据,可能导致接收方缓冲区溢出。
6. 拥塞控制
(1)TCP
- 支持拥塞控制:通过慢启动、拥塞避免和快速重传等机制避免网络拥塞。
(2)UDP
- 不支持拥塞控制:发送方不关心网络拥塞情况,可能导致网络拥塞。
7. 头部大小
(1)TCP
- 头部较大:TCP 头部通常为 20 字节(不含选项字段)。
(2)UDP
- 头部较小:UDP 头部固定为 8 字节。
8. 适用场景
(1)TCP
- 文件传输:如 FTP、HTTP。
- 电子邮件:如 SMTP、POP3。
- 网页浏览:如 HTTPS。
- 远程登录:如 SSH。
(2)UDP
- 实时应用:如视频流、语音通话(VoIP)。
- 在线游戏:如多人在线游戏。
- DNS 查询:如域名解析。
- 广播和多播:如网络广播。
9. 总结对比
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接 | 无连接 |
可靠性 | 可靠传输 | 不可靠传输 |
传输效率 | 较低 | 较高 |
流量控制 | 支持 | 不支持 |
拥塞控制 | 支持 | 不支持 |
头部大小 | 较大(通常 20 字节) | 较小(固定 8 字节) |
适用场景 | 文件传输、网页浏览、电子邮件 | 实时应用、在线游戏、DNS 查询 |
10. 选择建议
选择 TCP:
- 需要高可靠性的应用。
- 数据传输顺序和完整性要求高的场景。
选择 UDP:
- 对实时性要求高的应用。
- 数据传输量小、频率高的场景。
通过理解 TCP 和 UDP 的区别,可以根据实际需求选择合适的传输协议,优化应用程序的性能和可靠性!
为什么tcp可靠
TCP(Transmission Control Protocol,传输控制协议) 是一种可靠的传输层协议,它通过多种机制确保数据在传输过程中的可靠性。以下是 TCP 可靠性的核心机制及其工作原理:
1. 连接管理
(1)三次握手
- 目的:确保客户端和服务器双方都能确认彼此的发送和接收能力。
- 过程:
- 客户端发送
SYN
报文,请求建立连接。 - 服务器回复
SYN+ACK
报文,表示同意建立连接。 - 客户端发送
ACK
报文,确认连接建立。
- 客户端发送
(2)四次挥手
- 目的:确保客户端和服务器双方都能安全地关闭连接,释放资源。
- 过程:
- 客户端发送
FIN
报文,请求关闭连接。 - 服务器回复
ACK
报文,表示同意关闭连接。 - 服务器发送
FIN
报文,请求关闭连接。 - 客户端回复
ACK
报文,确认连接关闭。
- 客户端发送
2. 数据确认与重传
(1)确认机制(ACK)
- 目的:接收方收到数据后,向发送方发送确认(ACK),表示数据已成功接收。
- 工作原理:
- 发送方发送数据后,等待接收方的确认。
- 如果发送方未收到确认,会重传数据。
(2)超时重传
- 目的:如果发送方在指定时间内未收到确认,会重传数据。
- 工作原理:
- 发送方为每个数据包设置一个超时计时器。
- 如果计时器超时,发送方会重传数据。
(3)快速重传
- 目的:在检测到数据包丢失时,立即重传数据,而不等待超时。
- 工作原理:
- 如果接收方收到乱序的数据包,会发送重复的确认(DupACK)。
- 发送方收到多个 DupACK 后,立即重传丢失的数据包。
3. 数据顺序与完整性
(1)序列号(Sequence Number)
- 目的:为每个数据包分配一个唯一的序列号,确保数据按顺序传输。
- 工作原理:
- 发送方为每个数据包分配一个序列号。
- 接收方根据序列号重新组装数据。
(2)确认号(Acknowledgment Number)
- 目的:表示接收方期望接收的下一个数据包的序列号。
- 工作原理:
- 接收方发送确认号,表示已成功接收的数据包。
- 发送方根据确认号发送下一个数据包。
4. 流量控制
(1)滑动窗口(Sliding Window)
- 目的:控制发送方的发送速率,避免接收方缓冲区溢出。
- 工作原理:
- 接收方通过窗口大小告知发送方可接收的数据量。
- 发送方根据窗口大小调整发送速率。
5. 拥塞控制
(1)慢启动(Slow Start)
- 目的:在连接建立初期,逐步增加发送速率,避免网络拥塞。
- 工作原理:
- 发送方从较小的窗口大小开始,逐步增加发送速率。
(2)拥塞避免(Congestion Avoidance)
- 目的:在网络拥塞时,减少发送速率,避免进一步拥塞。
- 工作原理:
- 发送方根据网络状况动态调整窗口大小。
(3)快速恢复(Fast Recovery)
- 目的:在检测到数据包丢失时,快速恢复发送速率。
- 工作原理:
- 发送方在快速重传后,进入快速恢复阶段,逐步增加发送速率。
6. 错误检测与纠正
(1)校验和(Checksum)
- 目的:检测数据在传输过程中是否发生错误。
- 工作原理:
- 发送方计算数据包的校验和,并将其包含在头部。
- 接收方重新计算校验和,与头部中的校验和进行比较。
(2)重传机制
- 目的:在检测到数据包丢失或错误时,重传数据。
- 工作原理:
- 发送方根据确认机制和超时重传机制,重传丢失或错误的数据包。
7. 总结
机制 | 目的 |
---|---|
连接管理 | 确保客户端和服务器双方都能确认彼此的发送和接收能力 |
数据确认与重传 | 确保数据成功传输,并在丢失时重传 |
数据顺序与完整性 | 确保数据按顺序传输,并保持完整性 |
流量控制 | 控制发送方的发送速率,避免接收方缓冲区溢出 |
拥塞控制 | 避免网络拥塞,确保网络稳定性 |
错误检测与纠正 | 检测并纠正数据传输中的错误 |
通过以上机制,TCP 能够确保数据的可靠传输,适用于需要高可靠性的应用场景(如文件传输、网页浏览等)!
从浏览器输入一个url,按下回车到看到界面的详细全过程
从浏览器输入一个 URL 并按下回车,到最终看到页面内容,整个过程涉及多个步骤和技术的协同工作。以下是详细的流程:
1. URL 解析
(1)解析 URL
- 浏览器解析用户输入的 URL,提取协议(如 HTTP、HTTPS)、域名、端口、路径和查询参数等信息。
(2)检查缓存
- 浏览器检查本地缓存(如 DNS 缓存、页面缓存)是否有该 URL 的资源。
- 如果有缓存且未过期,直接使用缓存内容,跳过后续步骤。
2. DNS 解析
(1)查询 DNS 缓存
- 浏览器检查本地 DNS 缓存是否有域名对应的 IP 地址。
- 如果没有,向操作系统或路由器发送 DNS 查询请求。
(2)递归 DNS 查询
- 如果本地 DNS 缓存中没有记录,浏览器会向 DNS 服务器发送递归查询请求。
- DNS 服务器依次查询根域名服务器、顶级域名服务器(如
.com
)、权威域名服务器,最终返回域名对应的 IP 地址。
3. 建立 TCP 连接
(1)三次握手
- 浏览器通过 IP 地址和端口号(默认 HTTP 为 80,HTTPS 为 443)与服务器建立 TCP 连接。
- 通过三次握手确保连接的可靠性:
- 浏览器发送
SYN
报文。 - 服务器回复
SYN+ACK
报文。 - 浏览器发送
ACK
报文。
- 浏览器发送
(2)HTTPS 的 TLS 握手
- 如果使用 HTTPS,浏览器会与服务器进行 TLS 握手,协商加密算法并交换密钥。
- 过程包括:
- 浏览器发送
ClientHello
报文。 - 服务器回复
ServerHello
报文,并发送证书。 - 浏览器验证证书,生成会话密钥并发送给服务器。
- 服务器确认密钥,完成握手。
- 浏览器发送
4. 发送 HTTP 请求
(1)构造 HTTP 请求
- 浏览器根据 URL 构造 HTTP 请求报文,包括请求方法(如 GET、POST)、请求头(如
User-Agent
、Accept
)和请求体(如 POST 数据)。
(2)发送请求
- 浏览器通过 TCP 连接将 HTTP 请求报文发送到服务器。
5. 服务器处理请求
(1)接收请求
- 服务器接收 HTTP 请求报文,解析请求方法、路径、头部和体。
(2)处理请求
- 服务器根据请求路径和参数执行相应的处理逻辑(如查询数据库、调用 API)。
- 如果是静态资源(如 HTML、CSS、JS),直接从文件系统读取。
(3)生成响应
- 服务器生成 HTTP 响应报文,包括状态码(如 200 OK)、响应头(如
Content-Type
、Content-Length
)和响应体(如 HTML 内容)。
6. 接收 HTTP 响应
(1)接收响应
- 浏览器接收服务器返回的 HTTP 响应报文。
(2)解析响应
- 浏览器解析响应报文,根据状态码判断请求是否成功。
- 如果状态码为 200,继续解析响应体。
7. 渲染页面
(1)解析 HTML
- 浏览器解析 HTML 文档,构建 DOM(文档对象模型)树。
(2)加载外部资源
- 浏览器根据 HTML 中的标签(如
<link>
、<script>
、<img>
)加载外部资源(如 CSS、JS、图片)。 - 对于每个资源,重复 DNS 解析、TCP 连接、发送请求和接收响应的过程。
(3)解析 CSS
- 浏览器解析 CSS 文件,构建 CSSOM(CSS 对象模型)树。
(4)构建渲染树
- 浏览器将 DOM 树和 CSSOM 树合并,构建渲染树(Render Tree)。
(5)布局(Layout)
- 浏览器计算渲染树中每个节点的位置和大小,生成布局。
(6)绘制(Paint)
- 浏览器将布局结果绘制到屏幕上,显示页面内容。
8. 执行 JavaScript
(1)解析和执行 JS
- 浏览器解析并执行 JavaScript 代码,动态修改 DOM 和 CSSOM。
- 如果 JS 修改了 DOM 或样式,浏览器会重新构建渲染树、布局和绘制。
(2)事件处理
- 浏览器监听用户交互事件(如点击、滚动),并触发相应的事件处理函数。
9. 总结
步骤 | 描述 |
---|---|
URL 解析 | 解析 URL,检查缓存 |
DNS 解析 | 查询 DNS 缓存,递归 DNS 查询 |
建立 TCP 连接 | 三次握手,TLS 握手(HTTPS) |
发送 HTTP 请求 | 构造并发送 HTTP 请求报文 |
服务器处理请求 | 接收请求,处理逻辑,生成响应 |
接收 HTTP 响应 | 接收并解析响应报文 |
渲染页面 | 解析 HTML,加载资源,构建渲染树,布局,绘制 |
执行 JavaScript | 解析和执行 JS,处理事件 |
通过以上步骤,浏览器能够从输入 URL 到最终显示页面内容,完成一次完整的 Web 请求和渲染过程!
为什么https是安全的?完整流程
HTTPS(HyperText Transfer Protocol Secure) 是 HTTP 的安全版本,通过 TLS/SSL(Transport Layer Security/Secure Sockets Layer) 协议对通信数据进行加密,确保数据传输的安全性。以下是 HTTPS 的安全性原理及其完整流程的详细说明:
1. HTTPS 的安全性原理
(1)加密通信
- HTTPS 使用对称加密和非对称加密相结合的方式,确保数据在传输过程中不被窃听或篡改。
- 对称加密:使用同一个密钥加密和解密数据,效率高。
- 非对称加密:使用公钥和私钥对数据进行加密和解密,安全性高。
(2)身份验证
- HTTPS 通过数字证书验证服务器的身份,防止中间人攻击。
- 数字证书:由受信任的证书颁发机构(CA)签发,包含服务器的公钥和域名信息。
(3)数据完整性
- HTTPS 使用消息摘要算法(如 SHA-256)确保数据在传输过程中未被篡改。
2. HTTPS 的完整流程
(1)客户端发起请求
- 用户在浏览器中输入 HTTPS URL(如
https://example.com
),浏览器向服务器发起连接请求。
(2)服务器返回证书
- 服务器将自己的数字证书发送给客户端。证书包含以下信息:
- 服务器的公钥。
- 证书的有效期。
- 证书的颁发机构(CA)。
- 服务器的域名。
(3)客户端验证证书
- 客户端(浏览器)验证证书的有效性:
- 检查证书是否过期:确保证书在有效期内。
- 检查证书的颁发机构:确保证书由受信任的 CA 签发。
- 检查域名是否匹配:确保证书中的域名与用户访问的域名一致。
- 如果验证失败,浏览器会显示警告信息。
(4)密钥交换
- 客户端生成一个随机的对称密钥(称为会话密钥),并使用服务器的公钥加密后发送给服务器。
- 服务器使用自己的私钥解密,获取会话密钥。
(5)加密通信
- 客户端和服务器使用会话密钥进行对称加密通信,确保数据传输的安全性。
3. TLS/SSL 握手流程
(1)ClientHello
- 客户端向服务器发送
ClientHello
消息,包含以下信息:- 支持的 TLS 版本。
- 支持的加密套件(Cipher Suites)。
- 随机数(Client Random),用于生成会话密钥。
(2)ServerHello
- 服务器向客户端发送
ServerHello
消息,包含以下信息:- 选择的 TLS 版本。
- 选择的加密套件。
- 随机数(Server Random),用于生成会话密钥。
(3)Server Certificate
- 服务器将自己的数字证书发送给客户端。
(4)ServerKeyExchange(可选)
- 如果使用非对称加密算法(如 DHE、ECDHE),服务器会发送密钥交换参数。
(5)ServerHelloDone
- 服务器通知客户端,握手消息发送完毕。
(6)ClientKeyExchange
- 客户端生成会话密钥,并使用服务器的公钥加密后发送给服务器。
(7)ChangeCipherSpec
- 客户端和服务器分别发送
ChangeCipherSpec
消息,通知对方后续通信将使用加密。
(8)Finished
- 客户端和服务器分别发送
Finished
消息,验证握手过程是否成功。
4. HTTPS 的安全性总结
特性 | 描述 |
---|---|
加密通信 | 使用对称加密和非对称加密确保数据传输的安全性 |
身份验证 | 通过数字证书验证服务器的身份,防止中间人攻击 |
数据完整性 | 使用消息摘要算法确保数据在传输过程中未被篡改 |
TLS/SSL 握手 | 通过 TLS/SSL 握手协议协商加密算法和交换密钥 |
5. HTTPS 的优点
(1)数据加密
- 防止数据在传输过程中被窃听或篡改。
(2)身份验证
- 确保用户访问的是真实的服务器,防止中间人攻击。
(3)数据完整性
- 确保数据在传输过程中未被篡改。
(4)SEO 优势
- 搜索引擎(如 Google)优先索引 HTTPS 网站。
6. 总结
HTTPS 通过 TLS/SSL 协议实现了加密通信、身份验证和数据完整性,确保了数据传输的安全性。以下是 HTTPS 的完整流程:
- 客户端发起请求。
- 服务器返回证书。
- 客户端验证证书。
- 密钥交换。
- 加密通信。
通过 HTTPS,用户可以安全地访问网站,防止数据泄露和篡改!
7层,5层,4层协议?每层的常见协议(送分)
计算机网络通常使用 OSI 七层模型 或 TCP/IP 四层模型 来描述网络协议的分层结构。以下是两种模型的分层及其常见协议:
1. OSI 七层模型
OSI(Open Systems Interconnection)模型将网络通信分为七层,每层负责不同的功能。
层级 | 名称 | 功能 | 常见协议 |
---|---|---|---|
第7层 | 应用层(Application) | 提供用户接口和应用程序服务 | HTTP、HTTPS、FTP、SMTP、DNS、Telnet |
第6层 | 表示层(Presentation) | 数据格式转换、加密解密 | SSL/TLS、JPEG、MPEG |
第5层 | 会话层(Session) | 建立、管理和终止会话 | NetBIOS、RPC |
第4层 | 传输层(Transport) | 提供端到端的可靠数据传输 | TCP、UDP |
第3层 | 网络层(Network) | 数据包的路由和转发 | IP、ICMP、ARP、RIP、OSPF |
第2层 | 数据链路层(Data Link) | 提供节点到节点的可靠数据传输 | Ethernet、PPP、MAC、VLAN |
第1层 | 物理层(Physical) | 传输比特流,定义物理介质和电气特性 | RS-232、DSL、光纤、同轴电缆 |
2. TCP/IP 四层模型
TCP/IP 模型是实际应用中更常用的模型,它将网络通信分为四层。
层级 | 名称 | 功能 | 常见协议 |
---|---|---|---|
第4层 | 应用层(Application) | 提供用户接口和应用程序服务 | HTTP、HTTPS、FTP、SMTP、DNS、Telnet |
第3层 | 传输层(Transport) | 提供端到端的可靠数据传输 | TCP、UDP |
第2层 | 网络层(Internet) | 数据包的路由和转发 | IP、ICMP、ARP、RIP、OSPF |
第1层 | 网络接口层(Network Access) | 提供节点到节点的可靠数据传输,定义物理介质和电气特性 | Ethernet、PPP、MAC、VLAN |
3. 五层模型
五层模型是 OSI 和 TCP/IP 模型的结合,常用于教学和实际应用中。
层级 | 名称 | 功能 | 常见协议 |
---|---|---|---|
第5层 | 应用层(Application) | 提供用户接口和应用程序服务 | HTTP、HTTPS、FTP、SMTP、DNS、Telnet |
第4层 | 传输层(Transport) | 提供端到端的可靠数据传输 | TCP、UDP |
第3层 | 网络层(Network) | 数据包的路由和转发 | IP、ICMP、ARP、RIP、OSPF |
第2层 | 数据链路层(Data Link) | 提供节点到节点的可靠数据传输 | Ethernet、PPP、MAC、VLAN |
第1层 | 物理层(Physical) | 传输比特流,定义物理介质和电气特性 | RS-232、DSL、光纤、同轴电缆 |
4. 总结
模型 | 层级 | 常见协议 |
---|---|---|
OSI 七层模型 | 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 | HTTP、SSL/TLS、TCP、IP、Ethernet 等 |
TCP/IP 四层模型 | 应用层、传输层、网络层、网络接口层 | HTTP、TCP、IP、Ethernet 等 |
五层模型 | 应用层、传输层、网络层、数据链路层、物理层 | HTTP、TCP、IP、Ethernet 等 |
通过理解不同模型的分层及其常见协议,可以更好地掌握网络通信的原理和实现!
cookie和session的区别
Cookie 和 Session 是用于在Web应用中维护用户状态的两种机制,主要区别如下:
1. 存储位置
- Cookie:数据存储在客户端(浏览器)。
- Session:数据存储在服务器端,客户端仅保存一个Session ID。
2. 安全性
- Cookie:安全性较低,数据容易被篡改或窃取。
- Session:安全性较高,敏感数据存储在服务器,客户端只保存Session ID。
3. 存储大小
- Cookie:单个Cookie通常不超过4KB,且每个域名下的Cookie数量有限。
- Session:存储大小取决于服务器配置,通常远大于Cookie。
4. 生命周期
- Cookie:可设置过期时间,即使关闭浏览器也能保留。
- Session:生命周期较短,通常在用户关闭浏览器后失效(可通过设置延长)。
5. 性能影响
- Cookie:每次请求都会携带,可能增加网络负担。
- Session:仅需传递Session ID,减少数据传输量,但服务器需要存储和管理Session数据。
6. 使用场景
- Cookie:适合存储不敏感的小数据,如用户偏好。
- Session:适合存储敏感或较大的数据,如用户登录信息。
示例
- Cookie:存储用户语言偏好。
- Session:存储用户登录状态。
总结
- Cookie:客户端存储,适合小数据,安全性较低。
- Session:服务器端存储,适合敏感数据,安全性较高。
根据需求选择合适的机制。
http有几个版本?2和3的区别
HTTP(超文本传输协议)有多个版本,主要包括 HTTP/1.0、HTTP/1.1、HTTP/2 和 HTTP/3。以下是各版本的简要介绍以及 HTTP/2 和 HTTP/3 的主要区别:
HTTP 版本概览
HTTP/1.0(1996年):
- 每个请求需要单独建立TCP连接,效率较低。
- 不支持持久连接(Persistent Connection)。
HTTP/1.1(1997年):
- 引入了持久连接,允许在单个TCP连接上发送多个请求。
- 支持管道化(Pipelining),但存在队头阻塞(Head-of-Line Blocking)问题。
- 增加了缓存控制和分块传输编码等功能。
HTTP/2(2015年):
- 基于二进制帧传输,取代了HTTP/1.x的文本格式。
- 支持多路复用(Multiplexing),解决了队头阻塞问题。
- 支持头部压缩(HPACK)。
- 支持服务器推送(Server Push)。
HTTP/3(2022年正式标准化):
- 基于 QUIC 协议,使用 UDP 而非 TCP。
- 解决了TCP的队头阻塞问题。
- 内置加密(TLS 1.3),安全性更高。
- 连接迁移功能,切换网络时无需重新建立连接。
HTTP/2 和 HTTP/3 的区别
特性 | HTTP/2 | HTTP/3 |
---|---|---|
传输协议 | 基于 TCP | 基于 QUIC(UDP) |
队头阻塞 | 在TCP层仍存在队头阻塞 | 完全解决队头阻塞 |
连接建立速度 | 需要TCP三次握手和TLS握手 | 更快,QUIC整合了TLS 1.3 |
安全性 | 需要额外配置TLS | 内置TLS 1.3,默认加密 |
连接迁移 | 不支持 | 支持,切换网络时无需重新连接 |
错误恢复 | 依赖TCP的重传机制 | QUIC内置错误恢复,更快更可靠 |
部署复杂度 | 相对简单 | 较复杂,需要支持QUIC |
主要改进点
HTTP/2:
- 解决了HTTP/1.x的队头阻塞问题(应用层)。
- 提高了传输效率,支持多路复用和头部压缩。
HTTP/3:
- 解决了TCP层的队头阻塞问题。
- 提升了连接速度和可靠性,特别是在弱网络环境下。
使用场景
- HTTP/2:适合大多数现代Web应用,性能优于HTTP/1.x。
- HTTP/3:适合对延迟敏感的应用(如视频流、在线游戏)以及移动网络环境。
总结
- HTTP/2 是对HTTP/1.x的重大改进,但仍依赖TCP。
- HTTP/3 基于QUIC协议,进一步优化了性能、安全性和可靠性,是未来的发展方向。
HTTP缓存机制
HTTP缓存机制是一种通过存储资源的副本,减少服务器负载并加快客户端访问速度的技术。它通过客户端(浏览器)和服务器之间的协作来实现。以下是HTTP缓存机制的核心概念和工作原理:
1. 缓存的作用
- 减少带宽消耗:缓存可以减少重复资源的传输。
- 降低服务器负载:缓存可以减少对服务器的请求次数。
- 加快页面加载速度:直接从缓存加载资源比从服务器获取更快。
2. 缓存类型
HTTP缓存分为两种:
强缓存:
- 直接从本地缓存读取资源,不向服务器发送请求。
- 通过响应头字段
Cache-Control
和Expires
控制。
协商缓存:
- 向服务器发送请求,由服务器判断资源是否更新。
- 如果资源未更新,服务器返回
304 Not Modified
,客户端使用缓存。 - 通过响应头字段
Last-Modified
和ETag
控制。
3. 缓存相关的HTTP头部字段
(1)强缓存相关字段
**
Cache-Control
**:- 控制缓存行为的核心字段。
- 常见指令:
max-age=<seconds>
:资源缓存的最大时间(秒)。no-cache
:禁用强缓存,需使用协商缓存。no-store
:禁止缓存,每次请求都从服务器获取。public
:资源可以被任何缓存(如CDN)存储。private
:资源只能被客户端缓存。
**
Expires
**:- 指定资源的过期时间(绝对时间)。
- 优先级低于
Cache-Control
。
(2)协商缓存相关字段
**
Last-Modified
**:- 服务器返回的资源最后修改时间。
- 客户端下次请求时通过
If-Modified-Since
字段发送该时间,服务器判断资源是否更新。
**
ETag
**:- 服务器返回的资源唯一标识(通常是哈希值)。
- 客户端下次请求时通过
If-None-Match
字段发送该标识,服务器判断资源是否更新。
4. 缓存工作流程
(1)强缓存流程
- 客户端请求资源。
- 检查本地缓存是否存在且未过期(通过
Cache-Control
或Expires
)。 - 如果缓存有效,直接使用缓存资源,不发送请求。
- 如果缓存失效,向服务器发送请求。
(2)协商缓存流程
- 客户端请求资源。
- 向服务器发送请求,携带
If-Modified-Since
或If-None-Match
。 - 服务器检查资源是否更新:
- 如果未更新,返回
304 Not Modified
,客户端使用缓存。 - 如果已更新,返回新资源并更新缓存。
- 如果未更新,返回
5. 缓存策略示例
静态资源(如图片、CSS、JS):
- 设置较长的
max-age
(如1年),并使用文件哈希或版本号作为文件名,确保更新后客户端获取新资源。 - 示例:
Cache-Control: public, max-age=31536000
- 设置较长的
动态资源(如API响应):
- 使用
no-cache
或较短的max-age
,确保数据及时更新。 - 示例:
Cache-Control: no-cache
- 使用
6. 缓存的最佳实践
- 合理设置缓存时间:静态资源缓存时间较长,动态资源缓存时间较短。
- 使用版本号或哈希值:确保资源更新后客户端能获取最新版本。
- 结合CDN:利用CDN的边缘节点缓存资源,进一步加速访问。
- 避免过度缓存:敏感数据或频繁更新的资源应禁用缓存。
7. 缓存的流程图
1 | 客户端请求资源 |
总结
HTTP缓存机制通过强缓存和协商缓存优化资源加载性能。合理配置缓存策略可以显著提升Web应用的性能和用户体验。
tcp报文的序列号是随机的,为什么
TCP报文的序列号(Sequence Number)并不是完全随机的,而是基于特定的规则生成的。它的主要作用是确保数据的有序性和可靠性。以下是TCP序列号的设计原理和生成规则:
1. 序列号的作用
- 数据排序:接收方根据序列号对数据包进行排序,确保数据按正确顺序重组。
- 可靠性:通过序列号和确认号(Acknowledgment Number),TCP实现可靠传输,确保数据不丢失、不重复。
2. 序列号的生成规则
TCP序列号的初始值(Initial Sequence Number, ISN)并不是完全随机的,而是基于以下规则生成:
基于时钟:
- ISN通常基于一个随时间递增的计数器生成。
- 例如,许多操作系统使用一个每微秒或每毫秒递增的时钟值作为ISN的基础。
- 这样可以确保每次连接的ISN都是唯一的,避免冲突。
随机化偏移:
- 为了防止预测攻击(如TCP序列号预测攻击),ISN会在时钟值的基础上加上一个随机偏移量。
- 这种随机化使得ISN更难被猜测,提高了安全性。
唯一性:
- ISN的设计需要确保在同一时间内,不同连接的ISN不会重复。
- 通过结合时钟值和随机偏移量,可以保证ISN的唯一性。
3. 为什么序列号不能完全随机?
- 有序性要求:TCP需要确保数据包按顺序传输和重组。如果序列号完全随机,接收方无法正确排序数据包。
- 可靠性要求:TCP通过序列号和确认号实现可靠传输。完全随机的序列号会导致确认机制失效。
- 安全性要求:完全随机的序列号可能更容易被预测,增加安全风险。
4. 序列号的初始化过程
在TCP三次握手过程中,序列号的初始化如下:
- 客户端发送SYN报文,携带一个初始序列号(ISN)。
- 服务器回复SYN-ACK报文,携带自己的初始序列号,并确认客户端的序列号。
- 客户端发送ACK报文,确认服务器的序列号。
5. 序列号的增长规则
- 序列号随着发送的数据字节数递增。
- 例如,如果发送了100字节的数据,序列号会增加100。
6. 安全性考虑
- 防止序列号预测攻击:
- 如果序列号完全随机或可预测,攻击者可能伪造TCP报文,实施中间人攻击或会话劫持。
- 通过结合时钟值和随机偏移量,可以降低序列号被预测的风险。
总结
TCP序列号并不是完全随机的,而是基于时钟值和随机偏移量生成的。这种设计既保证了数据的有序性和可靠性,又提高了安全性。序列号的生成规则是TCP协议实现可靠传输和安全通信的重要基础。
如何让udp可靠
UDP(用户数据报协议)本身是一个无连接、不可靠的传输协议,但它具有低延迟和高效率的特点。如果需要在UDP上实现可靠传输,可以通过在应用层添加额外的机制来模拟TCP的可靠性。以下是实现可靠UDP的常见方法:
1. 确认机制(Acknowledgment, ACK)
- 原理:接收方收到数据后,向发送方发送确认消息(ACK)。
- 实现:
- 每个数据包分配一个唯一序列号(Sequence Number)。
- 接收方收到数据后,返回包含序列号的ACK。
- 发送方如果没有收到ACK,则重传数据。
2. 超时重传(Retransmission)
- 原理:发送方在发送数据后启动计时器,如果超时未收到ACK,则重传数据。
- 实现:
- 为每个数据包设置一个超时时间(RTO, Retransmission Timeout)。
- 如果超时未收到ACK,则重传数据包。
3. 序列号(Sequence Number)
- 原理:为每个数据包分配一个序列号,确保数据的有序性和完整性。
- 实现:
- 发送方为每个数据包分配递增的序列号。
- 接收方根据序列号对数据包进行排序和去重。
4. 滑动窗口(Sliding Window)
- 原理:通过滑动窗口机制控制发送方的发送速率,避免接收方缓冲区溢出。
- 实现:
- 发送方维护一个发送窗口,窗口内的数据可以连续发送。
- 接收方维护一个接收窗口,返回ACK时携带窗口大小。
- 发送方根据接收方的窗口大小调整发送速率。
5. 数据校验(Checksum)
- 原理:通过校验和检测数据在传输过程中是否损坏。
- 实现:
- 发送方计算数据包的校验和并附加到报文中。
- 接收方收到数据后重新计算校验和,与报文中的校验和比对。
- 如果校验失败,则丢弃数据包并请求重传。
6. 流量控制(Flow Control)
- 原理:根据接收方的处理能力动态调整发送速率。
- 实现:
- 接收方通过ACK报文反馈当前缓冲区大小。
- 发送方根据反馈调整发送速率。
7. 拥塞控制(Congestion Control)
- 原理:避免网络拥塞,确保公平性和稳定性。
- 实现:
- 使用类似TCP的拥塞控制算法(如慢启动、拥塞避免、快速重传、快速恢复)。
- 根据网络状况动态调整发送速率。
8. 实现示例
以下是一个简单的可靠UDP协议设计:
数据包结构:
- 序列号(4字节)
- 数据长度(2字节)
- 校验和(2字节)
- 数据(可变长度)
发送方逻辑:
- 为每个数据包分配序列号。
- 发送数据包并启动计时器。
- 如果收到ACK,则继续发送下一个数据包。
- 如果超时未收到ACK,则重传数据包。
接收方逻辑:
- 收到数据包后检查校验和。
- 如果校验通过,则返回ACK并存储数据。
- 如果数据包乱序,则缓存并等待缺失的数据包。
9. 现有可靠UDP协议
- QUIC:Google开发的基于UDP的可靠传输协议,用于HTTP/3。
- RUDP:可靠用户数据报协议,提供了确认、重传和流量控制机制。
- UDT:基于UDP的高速数据传输协议,适用于大文件传输。
10. 总结
通过添加确认机制、超时重传、序列号、滑动窗口、数据校验、流量控制和拥塞控制等机制,可以在UDP上实现可靠传输。虽然这些机制会增加一定的复杂性和开销,但它们能够在不牺牲UDP高效性的前提下,提供类似TCP的可靠性。