Linux --应用层协议HTTP

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中有些字符具有特殊含义,比如 /、?、: 等。如果某个参数中需要包含这些特殊字符,就必须先进行转义。

转义规则:

  1. 将需要转码的字符转为16进制。

  2. 从右到左取4位(不足4位直接处理),每2位做一位。

  3. 前面加上 %,编码成 %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 控制。

相关推荐
紫神1 小时前
DDS 通信技术说明
网络·云原生·容器·k8s·dds·弱网
洋不写bug1 小时前
网络编程(二)TCP回显服务器与客户端通信详解
服务器·网络·tcp/ip·tcp·网络通信·javaee·回显服务器
K成长日志2 小时前
BLE Host层L2CAP--数据包格式
网络·物联网·无线通信·蓝牙·iot·ble
liangshanbo12152 小时前
主系统登录后,子系统怎么实现自动登录?
java·网络·数据库
谢亮_vipxieliang2 小时前
Go 并发安全性保障
服务器·网络·golang
袁章根3 小时前
基于瑞昱RTL8367S交换机电路设计(一)
网络·嵌入式硬件·硬件架构·硬件工程
洋不写bug3 小时前
网络原理(一)应用层协议、传输层UDP/TCP报文格式解析
网络·tcp/ip·udp·tcp·应用层·javaee·传输层
时间的拾荒人4 小时前
Qt 网络编程与音视频开发实战:从 UDP/TCP 到 HTTP 与多媒体
网络·qt·音视频
网络小江13 小时前
组网第十课:编码、速率与排障——从比特到信号的最后一公里
网络协议