HTTP 1.0 ~ 3.0 有什么区别?
- HTTP 1.1
持久连接: 引入了Keep-Alive机制,多个请求可以复用同一个TCP连接,减少了建立连接的开销。
管道化: 允许在同一个TCP连接上同时发送多个请求,提高了并发效率。
Host字段: 可以在同一个IP地址上运行多个虚拟主机。
断点续传: 支持文件传输中断后从断点处继续传输。
- HTTP 2.0
二进制分帧: 将HTTP报文分割为更小的二进制帧,提高了传输效率,并支持多路复用。
头部压缩: 减少了HTTP头部的大小,降低了网络开销。
服务器推送: 服务器可以主动向客户端推送资源,减少了客户端的请求次数。
多路复用: 在一个TCP连接上可以同时发送多个请求和响应,解决了HTTP 1.1的队头阻塞问题。
- HTTP 3.0
基于QUIC协议: 使用UDP协议,相较于TCP的可靠性,QUIC通过自身实现可靠传输,减少了RTT。
多路复用: 在一个QUIC连接上可以同时传输多个请求和响应,并支持流优先级。
更快的连接建立: 减少了TCP的三次握手和TLS的握手时间。
更低的延迟: 由于QUIC协议的特性,HTTP 3.0具有更低的延迟。
HTTP 和 HTTPS 有什么区别?
HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是两种用于网络通信的协议,它们的主要区别在于安全性和加密机制。以下是它们的详细对比:
- 安全性
HTTP
不加密:HTTP 是一种明文传输协议,数据在传输过程中以明文形式发送。
HTTPS
加密传输:HTTPS 是在 HTTP 基础上通过 SSL/TLS(安全套接层/传输层安全)协议进行加密的协议。加密过程包括对称加密和非对称加密,确保数据在传输过程中不被泄露或篡改。
- 协议结构
HTTP
基于 TCP:HTTP 是一个应用层协议,基于 TCP 进行数据传输。端口 80。
HTTPS
基于 SSL/TLS + TCP:HTTPS 也是应用层协议,但它在 HTTP 的基础上增加了 SSL/TLS 层。端口 443。
- 性能
HTTP
性能较高:由于 HTTP 是明文传输,没有加密和解密的开销,因此在某些情况下性能可能略高于 HTTPS。
HTTPS
性能稍低:HTTPS 的加密和解密过程会增加一定的计算开销,可能导致性能略低于 HTTP。
HTTP 中 GET 和 POST 的区别是什么?
- 用途
GET
获取资源:GET请求主要用于从服务器获取数据,而不对服务器上的数据进行修改或添加。例如,访问一个网页、获取图片或文档等。
幂等性:GET请求是幂等的,即多次发送相同的GET请求,其结果与发送一次请求相同,不会对服务器产生副作用。
POST
提交数据:POST请求主要用于向服务器提交数据,以创建或更新资源。例如,提交表单数据、上传文件、创建新记录等。
非幂等性:POST请求是非幂等的,多次发送相同的POST请求可能会导致不同的结果,例如多次提交表单可能会创建多个记录
- 数据传输方式
GET
通过URL传输:GET请求将数据附加在URL的查询字符串中,例如http://example.com/page?param1=value1¶m2=value2
。数据暴露在URL中,容易被记录和查看。因此数据量通常受到URL长度的限制。
POST
通过请求体传输:POST请求将数据放在请求体(body)中,数据不会出现在URL中。例如,表单数据通常以application/x-www-form-urlencoded
、multipart/form-data
或application/json
等格式发送。因此适合传输较大的数据,如文件上传。
- 缓存机制
GET
可缓存:GET请求的结果通常可以被浏览器缓存。例如,当用户再次访问相同的URL时,浏览器可以直接从缓存中加载内容,而无需再次向服务器发送请求。
POST
不可缓存:POST请求通常不会被浏览器缓存,因为POST请求的结果可能会因每次提交的数据不同而变化。
如果需要获取数据且数据量较小、安全性要求不高,可以选择GET;如果需要提交数据、安全性要求高或数据量较大,应选择POST。
WebSocket 与 HTTP 有什么区别?
- 通信模式
HTTP
- 请求 - 响应模式:HTTP 是一种请求 - 响应协议,客户端发起请求,服务器返回响应,每次交互都是独立的。例如,客户端向服务器请求一个网页,服务器返回网页内容后,连接关闭。
WebSocket
- 全双工通信模式:WebSocket 是一种全双工通信协议,一旦建立连接,客户端和服务器可以随时发送和接收消息,无需每次都建立新的连接。例如,服务器可以主动向客户端推送消息,而无需客户端发起请求。
- 连接方式
HTTP
- 短连接:HTTP 默认使用短连接,每次请求和响应完成后,连接立即关闭。虽然 HTTP/1.1 引入了持久连接(keep - alive),但连接仍然会在一定时间后关闭。
WebSocket
- 长连接:WebSocket 使用长连接,一旦建立连接,客户端和服务器可以持续通信,直到连接被显式关闭。
- 数据传输方式
HTTP
- 明文传输:HTTP 以明文形式传输数据,数据在传输过程中容易被窃听和篡改(HTTP/2 引入了二进制帧传输,但仍然是明文传输)。
WebSocket
- 二进制帧传输:WebSocket 使用二进制帧传输数据,支持文本和二进制数据。数据传输效率更高,适合实时通信。
TCP 连接相关知识
-
TCP连接的定义
TCP连接是指在两个网络终端(通常是客户端和服务器)之间建立的一种可靠的、有序的、无重复的数据传输通道。它通过TCP协议来管理数据的发送和接收,确保数据的完整性、顺序性和可靠性。
-
TCP连接的特点
-
面向连接:TCP连接在数据传输之前需要先建立连接,类似于打电话之前需要先拨号建立通话。一旦连接建立,数据就可以在两个终端之间可靠地传输。
-
可靠传输:TCP通过一系列机制(如序列号、确认应答、超时重传等)确保数据能够可靠地传输。如果数据在传输过程中丢失或损坏,TCP会自动重传数据,直到数据正确到达接收方。
-
基于字节流:TCP将数据视为一个连续的字节流,而不是像UDP那样以数据报的形式传输。这意味着TCP不保证数据的边界,接收方需要根据应用层协议来解析数据。
-
全双工通信:TCP连接支持全双工通信,即客户端和服务器可以同时发送和接收数据,而不会相互干扰。
-
拥塞控制:TCP通过拥塞控制算法(如慢启动、拥塞避免等)动态调整发送速率,避免网络拥塞。
-
TCP连接的建立过程(三次握手)
TCP连接的建立需要经过三次握手的过程,具体步骤如下:
-
客户端发起连接请求:
-
客户端向服务器发送一个SYN(同步)报文,表示请求建立连接。
-
报文中的序列号(Sequence Number)字段被设置为一个随机值
x
。
-
-
服务器响应连接请求:
-
服务器收到SYN报文后,发送一个SYN-ACK(同步-确认)报文作为响应。
-
报文中的确认号(Acknowledgment Number)字段被设置为
x + 1
,表示对客户端SYN报文的确认。 -
同时,服务器的序列号字段被设置为一个随机值
y
。
-
-
客户端确认连接:
-
客户端收到SYN-ACK报文后,发送一个ACK(确认)报文。
-
报文中的确认号字段被设置为
y + 1
,表示对服务器SYN报文的确认。 -
一旦服务器收到ACK报文,TCP连接就建立成功,双方可以开始数据传输
-
-
TCP连接的关闭过程(四次挥手)
TCP连接的关闭需要经过四次挥手的过程,具体步骤如下:
-
客户端发起关闭请求:(客户端说我发完了)
- 客户端向服务器发送一个FIN(结束)报文,表示客户端已经完成数据发送,请求关闭连接。
-
服务器响应关闭请求:(服务端说我知道了)
-
服务器收到FIN报文后,发送一个ACK(确认)报文,确认收到客户端的关闭请求。
-
此时,服务器可能还有数据未发送完毕,因此不会立即关闭连接。
-
-
服务器发起关闭请求:(服务端说我发完了)
- 服务器完成数据发送后,向客户端发送一个FIN报文,表示服务器也已经完成数据发送,请求关闭连接。
-
客户端响应关闭请求:(客户端说我知道了)
-
客户端收到服务器的FIN报文后,发送一个ACK报文,确认收到服务器的关闭请求。
-
之后,客户端进入TIME_WAIT状态,等待一段时间(通常是2倍的报文最大生存时间)以确保服务器收到ACK报文。
-
一旦等待时间结束,TCP连接正式关闭。
-
-
TCP连接的可靠性机制
-
序列号和确认号:TCP为每个发送的数据包分配一个序列号,接收方通过确认号告知发送方已成功接收的数据包,从而确保数据的顺序和完整性。
-
超时重传:如果发送方在规定时间内未收到接收方的确认应答,会自动重传数据包,确保数据不会丢失。
-
滑动窗口协议:TCP通过滑动窗口机制动态调整发送方的发送窗口大小,从而控制数据的发送速率,避免发送方发送过多数据导致接收方缓冲区溢出或网络拥塞。
-
校验和:TCP在每个数据包中包含一个校验和字段,用于检测数据在传输过程中是否被损坏。如果校验和检测到错误,数据包将被丢弃并重传。
-
TCP连接的优缺点
-
优点:
-
可靠性高:通过序列号、确认应答、超时重传等机制,确保数据的完整性和顺序性。
-
支持全双工通信:客户端和服务器可以同时发送和接收数据,提高通信效率。
-
拥塞控制:通过动态调整发送速率,避免网络拥塞。
-
-
缺点:
-
连接开销大:建立和关闭连接需要经过多次握手和挥手过程,增加了通信开销。
-
性能较低:由于需要进行可靠性检查和拥塞控制,TCP的传输速度可能低于UDP。
-
不适合实时性要求极高的应用:由于TCP的可靠性机制,可能会导致数据传输延迟增加,不适合实时性要求极高的场景(如实时游戏、视频直播等)。
-
TCP 的粘包和拆包?
1. 什么是粘包和拆包?
-
粘包:发送方将多个小数据包合并成一个大数据包发送,接收方收到后无法区分每个数据包的边界。例如,发送方分别发送了“Hello”和“World”,接收方收到的却是“HelloWorld”,无法区分这两个独立的消息。
-
拆包:发送方将一个大数据包拆分成多个小数据包发送,接收方需要将这些小数据包重新组装才能获取完整消息。例如,发送方发送了一个很长的字符串,接收方可能分多次收到。
2. 为什么会出现粘包和拆包?
-
TCP的流式特性:TCP是面向流的协议,数据被视为字节流,不保证明确的边界。TCP不会保留应用层消息的边界,因此多个消息可能会被合并发送,或者一个大消息可能会被拆分发送。
-
缓冲区大小限制:发送方或接收方的缓冲区大小可能限制了数据的发送或接收,导致数据被拆分或合并。
3. 如何解决粘包和拆包问题?
-
固定数据包长度
- 发送方将每个数据包的长度固定,接收方按固定长度接收数据。
-
添加特殊分隔符
- 在每个数据包的末尾添加特殊字符(如
\r\n
)作为分隔符,接收方根据分隔符拆分数据。
- 在每个数据包的末尾添加特殊字符(如
-
使用长度字段
- 在每个数据包的头部添加一个长度字段,指示数据包的长度,接收方根据长度字段读取完整数据。
-
自定义协议
- 设计自定义协议,明确数据包的格式和边界。
TCP 拥塞控制的步骤?
-
慢启动:在连接建立初期,快速增加拥塞窗口,探测网络拥塞情况。
-
拥塞避免:当拥塞窗口达到慢启动阈值后,按线性增长拥塞窗口,避免快速增加发送窗口导致网络拥塞。
-
快速重传:在检测到数据丢失时,快速重传丢失的数据段,而不是等待超时。
-
快速恢复:在快速重传后,调整拥塞窗口大小,恢复数据传输。
-
拥塞发生:当检测到网络拥塞时,调整拥塞窗口大小,减少发送速率。
-
动态调整:根据网络的动态情况,不断调整拥塞窗口大小,优化性能。
Cookie、Session、Token 之间有什么区别?
td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}特性 | Cookie | Session | Token |
存储位置 | 客户端浏览器 | 服务器端 | 客户端(localStorage/sessionStorage) |
用途 | 存储用户偏好设置、会话信息 | 管理会话数据、用户登录状态 | 身份验证、授权 |
安全性 | 明文存储,易被窃取 | 存储在服务器端,相对安全 | 无状态,签名验证 |
限制 | 每个域名20个,每个4KB | 占用服务器资源,会话过期或重启丢失 | Token较大,需设置有效期和刷新机制 |
状态管理 | 有状态,依赖Cookie | 有状态,依赖Session ID | 无状态,不依赖服务器存储 |
跨域支持 | 不支持跨域 | 不支持跨域 | 支持跨域 |
示例代码 | document.cookie | session_start() | localStorage.setItem() |
JWT Token(JSON Web Token)详解
- 定义
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用之间安全地传递信息。它是一种紧凑且自包含的JSON对象,能够被验证和信任,因为它是经过数字签名的。
- JWT的结构
JWT由三部分组成,以点(.
)分隔:
-
Header(头部):包含令牌类型(
typ
)和使用的签名算法(alg
),例如:{"alg": "HS256","typ": "JWT" }
-
Payload(负载):包含声明(claims),即实际传递的数据。声明分为三种类型:
-
注册声明:预定义的声明,如
iss
(发行者)、exp
(过期时间)、sub
(主题)等。 -
公共声明:可以由使用JWT的各方自定义。
-
私有声明:用于在使用JWT的各方之间共享信息的自定义声明。
例如:
{"sub": "1234567890","name": "John Doe","iat": 1516239022,"exp": 1516242622 }
-
-
Signature(签名):用于验证消息的完整性和来源。签名的计算方式如下:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret )
其中
secret
是一个私钥,只有服务器知道。 -
JWT的工作原理
-
生成Token:
-
用户通过用户名和密码向服务器发送身份验证请求。
-
服务器验证用户的凭据,生成JWT,并将其返回给用户。
-
-
存储Token:
- 客户端接收到JWT后,通常将其存储在本地(如LocalStorage或SessionStorage)。
-
发送Token:
- 客户端在后续请求中将JWT放在HTTP请求头的
Authorization
字段中,格式为Bearer <token>
。
- 客户端在后续请求中将JWT放在HTTP请求头的
-
验证Token:
-
服务器接收到请求后,提取JWT并验证其签名的完整性。
-
检查负载中的声明,确保令牌未过期、发行者可信等。
-
-
-
JWT的应用场景
JWT最典型的应用场景是登录认证:
-
用户登录:用户通过用户名和密码请求登录。
-
服务器验证:服务器验证用户凭证,如果有效,生成JWT。
-
客户端存储:客户端接收到JWT后,存储在本地。
-
后续请求:客户端在每个请求中携带JWT,服务器验证JWT的有效性后处理请求。
此外,JWT还适用于信息传递,例如在分布式系统和微服务架构中,JWT可以作为用户身份认证的核心机制。
- JWT的优点与缺点
-
优点:
-
无状态:服务器不需要存储会话信息,降低了服务器的负载。
-
跨域支持:可以在不同域的系统之间轻松传递。
-
自包含:包含了所有必要的用户信息,减少了数据库查询。
-
安全性:签名确保了信息不被篡改。
-
-
缺点:
-
令牌大小:JWT可能包含大量信息,导致令牌体积增大。
-
无法撤销:一旦签发,在过期前无法轻易撤销。
-
安全存储:客户端存储令牌的安全性问题。
-
-
最佳实践
-
合理设置过期时间:短期令牌用于正常访问,长期刷新令牌用于获取新的访问令牌。
-
实现令牌刷新机制:通过刷新令牌获取新的访问令牌。
-
使用HTTPS:始终通过HTTPS传输JWT,防止令牌被窃取。
-
最小权限原则:JWT中仅包含必要的信息,避免敏感数据。
-
JWT作为一种高效、安全的身份验证和信息传递机制,在现代Web开发中得到了广泛应用。