HTTP协议是什么?
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网世界中客户端(如浏览器)与服务器之间通信的基础协议。它定义了双方如何交换或传输超文本(如HTML文档)。
核心特点:
-
无连接:每次请求都需要建立新的连接(HTTP/1.0的默认行为,HTTP/1.1引入了持久连接来改善这一点)。
-
无状态:服务器不会保存客户端的状态信息。每次请求都是独立的,服务器"记不住"你上一次做了什么。
-
应用层协议:虽然应用层协议是程序员自己定的,但HTTP是已经定义好的、非常好用的现成协议,供我们直接参考使用。
通俗理解:HTTP就像你和餐厅服务员之间的点餐规则。你说"我要一份宫保鸡丁"(请求),服务员去厨房下单,然后把菜端回来(响应)。每次点餐都是独立的,服务员不会因为你昨天来过就记住你的口味。
认识URL
平时我们俗称的"网址"其实就是URL(统一资源定位符)。一个完整的URL包含以下部分:
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1
| 组成部分 | 说明 |
|---|---|
| 协议方案名 | http:// 或 https:// |
| 登录信息(认证) | user:pass@,可选,用于身份验证 |
| 服务器地址 | www.example.jp,可以是域名或IP |
| 服务器端口号 | :80,HTTP默认端口是80,HTTPS默认是443 |
| 带层次的文件路径 | /dir/index.htm |
| 查询字符串 | ?uid=1,用于传递参数 |
| 片段标识符 | #ch1,用于定位页面内的某个位置 |
urlencode和urldecode
URL中有些字符具有特殊含义,比如 /、?、: 等。如果某个参数中需要包含这些特殊字符,就必须先进行转义。
转义规则:
-
将需要转码的字符转为16进制。
-
从右到左取4位(不足4位直接处理),每2位做一位。
-
前面加上
%,编码成%XY格式。
示例:
-
+被转义成%2B -
空格被转义成
%20
urldecode 就是 urlencode 的逆过程,将 %XY 格式还原为原始字符。
通俗理解:就像寄快递时,有些物品不能直接寄,需要特殊包装。URL编码就是给特殊字符"打包",让它们能安全地在网络上传输。
HTTP请求与响应格式
HTTP请求格式
一个HTTP请求由四部分组成:
POST http://job.xjtu.edu.cn/companyLogin.do HTTP/1.1
Host: job.xjtu.edu.cn
Connection: keep-alive
Content-Length: 36
Cache-Control: max-age=0
Origin: http://job.xjtu.edu.cn
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) ...
Accept: text/html,application/xhtml+xml,...
Referer: http://job.xjtu.edu.cn/companyLogin.do
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=D628A75845A74D29D991DB47A461E4FC; ...
username=hgttz2222&password=222222222
结构说明:
| 部分 | 说明 |
|---|---|
| 请求行 | 请求方法 + 空格 + URI + 空格 + HTTP版本 + 换行符 |
| 请求报头 | Key: Value 格式,每组之间用 \r\n 分隔 |
| 空行 | 表示Header部分结束 |
| 请求正文 | Body,允许为空。如果存在,Header中会有 Content-Length 标识长度 |
HTTP响应格式
一个HTTP响应也由四部分组成:
HTTP/1.1 200 OK
Server: YxlinkWAF
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Transfer-Encoding: chunked
Date: Fri, 29 Sep 2017 05:10:13 GMT
<!DOCTYPE html>
<html>
<head>
<title>西安交通大学就业网</title>
...
</head>
结构说明:
| 部分 | 说明 |
|---|---|
| 状态行 | HTTP版本 + 空格 + 状态码 + 空格 + 状态码解释 + 换行符 |
| 响应报头 | Key: Value 格式,每组之间用 \r\n 分隔 |
| 空行 | 表示Header部分结束 |
| 响应正文 | Body,允许为空。如果存在,Header中会有 Content-Length 标识长度 |
HTTP的方法
| 方法 | 说明 | 支持的HTTP协议版本 |
|---|---|---|
| GET | 获取资源 | 1.0、1.1 |
| POST | 传输实体主体 | 1.0、1.1 |
| PUT | 传输文件 | 1.0、1.1 |
| HEAD | 获得报文首部 | 1.0、1.1 |
| DELETE | 删除文件 | 1.0、1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径 | 1.1 |
| CONNECT | 要求用隧道协议连接代理 | 1.1 |
| LINK | 建立和资源之间的联系 | 1.0 |
| UNLINE | 断开连接关系 | 1.0 |
最常用的就是GET和POST方法。
GET方法(重点)
-
用途:请求URL指定的资源。
-
示例 :
GET /index.html HTTP/1.1 -
特性:指定资源经服务器端解析后返回响应内容。
-
Form表单 :GET请求的参数会附加在URL后面,如
?username=abc&password=123。
POST方法(重点)
-
用途:传输实体的主体,通常用于提交表单数据。
-
示例 :
POST /submit.cgi HTTP/1.1 -
特性:可以发送大量的数据给服务器,数据包含在请求体中。
-
Form表单:POST请求的参数放在请求体(Body)中,不会显示在URL上。
PUT方法(不常用)
-
用途:传输文件,将请求报文主体中的文件保存到请求URL指定的位置。
-
示例 :
PUT /example.html HTTP/1.1 -
特性:不太常用,但在RESTful API中用于更新资源。
HEAD方法
-
用途:与GET方法类似,但不返回报文主体部分,仅返回响应头。
-
特性:用于确认URL的有效性及资源更新的日期时间等。
-
示例 :
curl --head www.baidu.com只会返回响应头。
DELETE方法(不常用)
-
用途:删除文件,是PUT的相反方法。
-
示例 :
DELETE /example.html HTTP/1.1 -
特性:按请求URL删除指定的资源。
OPTIONS方法
-
用途:查询针对请求URL指定的资源支持的方法。
-
示例 :
OPTIONS * HTTP/1.1 -
特性:返回允许的方法,如GET、POST等。
HTTP的状态码
状态码表示服务器对请求的处理结果,分为五大类:
| 类别 | 原因短语 | 说明 |
|---|---|---|
| 1XX | Informational(信息性状态码) | 接收的请求正在处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
最常见的状态码:
| 状态码 | 含义 | 应用样例 |
|---|---|---|
| 100 | Continue | 上传大文件时,服务器告诉客户端可以继续上传 |
| 200 | OK | 访问网站首页,服务器返回网页内容 |
| 201 | Created | 发布新文章,服务器返回文章创建成功的信息 |
| 204 | No Content | 删除文章后,服务器返回"无内容"表示操作成功 |
| 301 | Moved Permanently | 网站换域名后,自动跳转到新域名 |
| 302 | Found / See Other | 用户登录成功后,重定向到用户首页 |
| 304 | Not Modified | 浏览器缓存机制,对未修改的资源返回304 |
| 400 | Bad Request | 填写表单时,格式不正确导致提交失败 |
| 401 | Unauthorized | 访问需要登录的页面时,未登录或认证失败 |
| 403 | Forbidden | 尝试访问你没有权限查看的页面 |
| 404 | Not Found | 访问不存在的网页链接 |
| 500 | Internal Server Error | 服务器崩溃或数据库错误导致页面无法加载 |
| 502 | Bad Gateway | 代理服务器无法从上游服务器获取有效响应 |
| 503 | Service Unavailable | 服务器维护或过载,暂时无法处理请求 |
| 504 | Bad Gateway | 网关超时 |
重定向状态码详解
| 状态码 | 含义 | 是否为临时重定向 | 应用样例 |
|---|---|---|---|
| 301 | Moved Permanently | 否(永久重定向) | 网站换域名后自动跳转 |
| 302 | Found / See Other | 是(临时重定向) | 用户登录成功后重定向到首页 |
| 307 | Temporary Redirect | 是(临时重定向) | 临时重定向资源到新位置(较少使用) |
| 308 | Permanent Redirect | 否(永久重定向) | 永久重定向资源到新位置(较少使用) |
301和302都依赖Location选项:
HTTP/1.1 301 Moved Permanently
Location: https://www.new-url.com
HTTP/1.1 302 Found
Location: https://www.new-url.com
通俗理解:301就像你搬家了,告诉邮局"我永久搬到新地址了";302就像你临时出差,告诉邮局"我这几天在酒店,先寄到那里"。
HTTP常见Header
| 字段名 | 含义 | 样例 |
|---|---|---|
| Content-Type | 数据类型 | text/html、application/json |
| Content-Length | Body的长度 | Content-Length: 150 |
| Host | 客户端告知服务器,所请求的资源是在哪个主机的哪个端口上 | Host: www.example.com:8080 |
| User-Agent | 声明用户的操作系统和浏览器版本信息 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... |
| Referer | 当前页面是从哪个页面跳转过来的 | http://www.example.com/previous_page.html |
| Location | 搭配3xx状态码使用,告诉客户端接下来要去哪里访问 | Location: https://www.new-url.com |
| Cookie | 用于在客户端存储少量信息,通常用于实现会话功能 | session_id=abcdefg12345; user_id=123 |
| Accept | 客户端可接受的响应内容类型 | text/html,application/xhtml+xml,... |
| Accept-Encoding | 客户端支持的数据压缩格式 | gzip, deflate, br |
| Accept-Language | 客户端可接受的语言类型 | zh-CN,zh;q=0.9,en;q=0.8 |
| Authorization | 认证信息,如用户名和密码 | Basic QwxhZGpjbjpcGVuIHNlc2FtZQ== |
| Cache-Control | 缓存控制指令 | no-cache、max-age=3600 |
关于Connection报头
Connection字段用于控制和管理客户端与服务器之间的连接状态。
核心作用:
- 管理持久连接:允许客户端和服务器在请求/响应完成后不立即关闭TCP连接,以便在同一个连接上发送多个请求和接收多个响应。
持久连接(长连接):
-
HTTP/1.1:默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态。
-
HTTP/1.0 :默认连接是非持久的。如果希望实现持久连接,需要在请求头中显式设置
Connection: keep-alive。
语法格式:
-
Connection: keep-alive:表示希望保持连接以复用TCP连接。 -
Connection: close:表示请求/响应完成后,应该关闭TCP连接。
GET和POST的区别
| 特性 | GET | POST |
|---|---|---|
| 参数位置 | URL中 | 请求体中 |
| 安全性 | 参数暴露在URL,不安全 | 参数在请求体,相对安全 |
| 数据长度 | 受URL长度限制 | 理论上无限制 |
| 幂等性 | 幂等(多次请求结果相同) | 非幂等 |
| 缓存 | 可被缓存 | 默认不缓存 |
| 用途 | 获取资源 | 提交数据 |
HTTP和HTTPS的区别
-
HTTP:明文传输,默认端口80,不安全。
-
HTTPS:HTTP + SSL/TLS,加密传输,默认端口443,安全。
-
HTTPS需要CA证书,握手过程更复杂,但能防止窃听和篡改。
Cookie和Session的区别
-
Cookie:存储在客户端,大小有限(约4KB),可被用户禁用。
-
Session:存储在服务器端,通过Session ID(通常存在Cookie中)来识别用户。
-
Session更安全,但服务器需要维护状态,有性能开销。
长连接和短连接
-
短连接:每次请求/响应后关闭TCP连接,HTTP/1.0默认。
-
长连接 :请求/响应后保持TCP连接,HTTP/1.1默认,通过
Connection: keep-alive控制。