【HTTP 和 HTTPS详解】1
目录
HTTP 和 HTTPS
HTTP(超文本传输协议)
HTTPS(安全 HTTP)
浏览器通信:通过 TCP 连接
TCP 在 HTTP/HTTPS 中的作用
面向非连接的UDP协议
HTTP 方法:GET、POST 及其他
GET 方法
POST 方法
其他 HTTP 方法
PUT
DELETE
PATCH
在 Node.js 中实现 HTTP 方法
URL 结构和组件
HTTP 和 HTTPS
HTTP(超文本传输协议)
HTTP 是网络的命脉,它支持获取和发布 HTML 页面、图像和其他重要资源。
它遵循清晰的结构:
起始行:描述请求类型、目标资源和 HTTP 版本。
标题:提供有关请求或响应的重要元数据。
可选主体:包含使用 POST 或 PUT 等方法发送的数据。
HTTP 请求示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Connection: keep-alive
POST /submit-data HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Content-Type: application/json
Content-Length: [length]
Connection: keep-alive
{
"name": "John Doe",
"email": "john.doe@example.com",
"message": "Hello, world!"
}
HTTPS(安全 HTTP)
HTTPS 在传统的 HTTP 基础上增加了一层 TLS(传输层安全性),通过加密传输数据来增强安全性。它遵循与 HTTP 相同的结构规则,但确保所有传输的数据保持机密性和防篡改性。
HTTPS 请求示例:
GET /securedata.html HTTP/1.1
Host: www.secureexample.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
Accept: application/json, text/javascript, */*; q=0.01
Cookie: sessionId=789xyz
Connection: keep-alive
浏览器通信:通过 TCP 连接
TCP 在 HTTP/HTTPS 中的作用
当浏览器需要获取网页或向服务器发送数据时,它会使用 TCP。TCP 确保所有数据包都按正确的顺序到达且不会丢失,这对于成功呈现网页至关重要。
沟通时间表
- TCP 连接建立(三次握手)
- SYN:客户端向服务器发送同步(SYN)数据包以发起连接。
- SYN-ACK:服务器以同步确认(SYN-ACK)进行响应。
- ACK : 客户端发送确认(ACK),连接建立。
数据传输
- 握手后,客户端通过建立的TCP连接发送HTTP/HTTPS请求。
- 服务器处理请求并发回 HTTP/HTTPS 响应,由 TCP 进行分段和管理。
连接终止
- 会话完成后,任何一方都可以发起连接终止。
- 这涉及另一次握手,使用 FIN(完成)和 ACK 数据包来正常关闭连接。
面向非连接的UDP协议
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
为什么不使用 UDP? UDP 以其在直播或游戏等场景中的速度而闻名,但它缺乏 TCP 固有的可靠性机制。“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
HTTP 方法:GET、POST 及其他
HTTP 方法是 Web 操作结构的重要组成部分,用于定义要对给定资源执行的操作。每种方法都有特定的用例,并且对数据安全性和幂等性有影响。让我们深入了解这些方法的细节,特别是 GET 和 POST,然后扩展到涵盖 PUT、DELETE 和 PATCH 等其他方法。
GET 方法
目的: GET 方法用于使用给定的 URI 从指定服务器检索信息。使用 GET 的请求应仅检索数据,并且不应对数据产生其他影响。
GET /index.html HTTP/1.1
Host: www.example.com
要点:
- 幂等且安全: GET 请求既是幂等的又是安全的,这意味着多次发出相同的 GET 请求将始终产生相同的结果,并且它们不会修改资源。
- URL 中的数据:所有必需的数据都在 URL 中发送,包括查询参数,这使得其长度受到限制并且安全性较低。
- 缓存: GET 请求是可缓存的,这意味着它们可以存储在缓存中以加快对同一资源的重复请求。
POST 方法
用途: POST 方法用于向服务器提交数据,例如客户信息、文件上传或消息。通常在需要创建或更新资源时使用。
POST /submit-data HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
username=example&password=1234
要点:
- 非幂等: POST 请求不是幂等的,这意味着多次提交相同的 POST 请求可能会导致不同的结果或副作用。
- 无数据限制:与 GET 不同,POST 没有大小限制,并且可以在请求正文中包含数据,这使得敏感数据更加安全。
- 缓存性较差: POST 响应通常默认不可缓存,除非响应标头明确允许。
其他 HTTP 方法
PUT
此方法用于更新或替换整个资源。它是幂等的,这意味着多个相同的 PUT 请求应该与单个请求具有相同的效果。
PUT /user/12345 HTTP/1.1
Host: www.example.com
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe"
}
DELETE
DELETE 方法删除指定的资源。它也是幂等的,确保无论执行多少次删除资源的结果都是相同的。
DELETE /user/12345 HTTP/1.1 Host: www.example.com
PATCH
用于对资源进行部分更改。PATCH 既不安全也不幂等,但比 PUT 更高效,因为它只发送更改的更新,而不是整个资源的更新。
PATCH /user/12345 HTTP/1.1
Host: www.example.com
Content-Type: application/json
{
"lastName": "Smith"
}
在 Node.js 中实现 HTTP 方法
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.send('GET request received');
});
app.post('/', (req, res) => {
res.send(`POST request with data: ${req.body.username}`);
});
app.put('/user/:id', (req, res) => {
res.send(`PUT request to update user ${req.params.id}`);
});
app.delete('/user/:id', (req, res) => {
res.send(`DELETE request for user ${req.params.id}`);
});
app.patch('/user/:id', (req, res) => {
res.send(`PATCH request for user ${req.params.id}`);
});
app.listen(3000, () => console.log('Server is running on port 3000'));
URL 结构和组件
URL(统一资源定位器)是对 Web 资源的引用。让我们分解一下它的结构:
https://www.example.com:8080/path/to/resource?query=param#fragment
- 方案:https- 指示协议(HTTP 或 HTTPS)。
- 主机:www.example.com- 服务器的域名或 IP 地址。
- 端口:-(8080可选)指定端口号。
- 路径:/path/to/resource-指定特定的资源或端点。
- 查询:-(query=param可选)提供附加参数。
- 片段:-(#fragment可选)指向资源的特定部分。