【Linux】应用层协议HTTP

1. HTTP协议

HTTP(超文本传输协议)是现成一些好用协议其中之一。在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。 它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如HTML文档)

HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息

2. URL

统一资源定位器,俗称的"网址"

  • 像 / ? : 等这样的字符,已经被 url 当做特殊意义理解了。因此这些字符不能随意出现。如某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义(urlencode)。转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
  • urldecode就是urlencode的逆过程

3. 请求与响应格式

3.1 HTTP请求

  • 首行:[方法] + [url] + [版本]
  • Header:请求的属性,冒号分割的键值对。每组属性之间使用 \r\n 分隔
  • 遇到空行表示Header 部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串
  • 如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度

HTTP 请求的本质(静态资源场景),就是在目录中的特定路径,即uri中的路径,请求特定的资源

如把服务器的 Web 根目录设为**./wwwroot,** 浏览器访问http://127.0.0.1:8080/index.html ,服务器就会去读**./wwwroot/index.html**

3.2 HTTP响应

  • 首行:[版本号] + [状态码] + [状态码解释]
  • Header:请求的属性,冒号分割的键值对。每组属性之间使用 \r\n分隔
  • 遇到空行表示Header部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串
  • 如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度,表明正文大小
  • 如果服务器返回了一个html页面,那么html页面内容就是在body中

4. HTTP的方法

其中最常用的就是GET和POST

4.1 GET 方法(重点)

用途:用于请求URL指定的静态网页或者资源

示例: GET /index.html HTTP/1.1

特性:

  • GET通过 URI 指定资源地址,服务器解析该 URI 后,直接返回对应响应内容
  • GET 提交参数,就是直接拼在 URI 里提交给服务器,所以这个参数有长度限制
  • 参数是明文、不安全

4.2 POST 方法(重点)

用途:用于传输实体的主体,通常用于提交表单数据

示例: POST /submit.cgi HTTP/1.1

特性:

  • 可以发送大量的数据给服务器,并且请求参数包含在请求正文中
  • 参数不会回显,更加私密

其实,GET和POST都不安全,都可以被抓取获得 (一个工具:fiddler)。如何做到真正安全?用https协议进行加密!

4.3 PUT 方法(不常用)

用途:用于传输文件,将请求报文主体中的文件保存到请求URL指定的位置

示例: PUT /example.html HTTP/1.1 特性:不太常用,但在某些情况下,如RESTful API中,用于更新资源

4.4 HEAD方法

用途:与GET方法类似,但不返回报文主体部分,仅返回响应头

示例: HEAD /index.html HTTP/1.1

特性:确认URL的有效性及资源更新的日期时间等

4.5 DELETE方法(不常用)

用途:用于删除文件,是PUT的相反方法

示例: DELETE /example.html HTTP/1.1

特性:按请求URL删除指定的资源

4.6 OPTIONS方法

用途:用于查询针对请求URL指定的资源支持的方法

示例: OPTIONS * HTTP/1.1

特性:返回允许的方法,如GET、POST等

5. HTTP的状态码

HTTP 状态码就是服务器响应返回给客户端时用的,告诉浏览器 / 接口调用方这次请求成功、失败、跳转、权限不足还是服务器报错

常用状态码

200,404,403,302,504

状态码 英文释义 实际应用场景
100 Continue 上传大文件时,服务器告知客户端可以继续上传
200 OK 访问网站首页,服务器返回网页内容
201 Created 发布新文章,服务器返回文章创建成功的信息
204 No Content 删除文章后,服务器返回 "无内容" 表示操作成功
301 Moved Permanently 网站换域名后自动跳转到新域名;搜索引擎更新网站链接使用
302 Found / See Other 用户登录成功后,重定向到用户首页
304 Not Modified 浏览器缓存机制,资源未修改时返回该状态码
400 Bad Request 表单提交时数据格式错误,请求参数不合法
401 Unauthorized 访问需登录页面,未登录或身份认证失败
403 Forbidden 访问自身无权限查看的页面资源
404 Not Found 访问不存在的网页链接、接口地址
500 Internal Server Error 服务器代码异常、数据库错误导致页面无法加载
502 Bad Gateway 代理服务器无法从上游服务器获取有效响应
503 Service Unavailable 服务器维护、负载过高,暂时无法处理请求
504 Gateway Timeout 网关超时,代理 / 网关服务器等不到上游服务器响应,超时断开

重定向

状态码 含义 是否为临时重定向 应用样例 Location 作用
301 Moved Permanently 否(永久重定向) 网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用 浏览器缓存跳转地址,搜索引擎收录新地
302 Found / See Other 是(临时重定向) 用户登录成功后,重定向到用户首页 浏览器缓存跳转地址,搜索引擎收录新地
307 Temporary Redirect 是(临时重定向) 临时重定向资源到新的位置,保留请求方法和 Body 保留 POST / 原请求方式,按 Location 地址跳转址跳转
308 Permanent Redirect 否(永久重定向) 永久重定向资源到新的位置,保留请求方法和 Body 永久保留原请求方式,按 Location 地址跳转

HTTP状态码301(永久重定向)和302(临时重定向)都依赖Location选项。以下是关于两者依赖 Location选项的详细说明:

301

  • 当服务器返回HTTP 301状态码时,表示请求的资源已经被永久移动到新的位置

  • 在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置。这个Location 头部包含了新的URL地址,浏览器会自动重定向到该地址

  • 例如,在HTTP响应中,可能会看到类似于以下的头部信息:

    bash 复制代码
    HTTP/1.1 301 Moved Permanently\r\n
    Location: https://www.new-url.com\r\n

302

  • 当服务器返回HTTP 302状态码时,表示请求的资源临时被移动到新的位置

  • 服务器会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使用新的URL进行后续的请求,但不会缓存这个重定向

  • 例如,在HTTP响应中,可能会看到类似于以下的头部信息

    bash 复制代码
    HTTP/1.1 302 Found\r\n
    Location: https://www.new-url.com\r\n

6. HTTP常见头部字段 Header

请求头

  1. Content-Type:请求体数据类型(text/html等)
  2. Content-Length:请求体Body的字节长度
  3. Host:告知服务器请求的主机名 + 端口
  4. User-Agent:标识客户端操作系统、浏览器、设备版本信息
  5. Referer:记录当前请求从哪个页面跳转过来

响应头

  1. Location:配合3xx 重定向状态码,告诉客户端跳转的目标 URL
  2. Cookie(请求 / 响应都可):客户端存储少量文本信息,常用于会话保持、身份识别、登录状态

connection报头:长连接

HTTP中的 Connection 字段是HTTP报文头的一部分,控制HTTP 连接是否复用**,**决定请求完后要不要断开 TCP 连接

  1. Connection: close
  • 短连接
  • 一次 HTTP 请求响应完毕,立刻断开 TCP 连接
  • HTTP/1.0 默认就是短连接

2.Connection: keep-alive

  • 长连接(持久连接)
  • 一次通信完不断开 TCP,后续请求可以复用同一个 TCP 通道
  • HTTP/1.1 默认启用长连接,不用手动写这个头

7. 实现一个简单的HTTP服务

思路:

简易HTTP实现https://gitee.com/dwaekkiyo/my_linux_code/tree/master/260426

相关推荐
Harvy_没救了1 小时前
【网络运维】从开发到上线全流程简化方案
运维·网络
苍煜1 小时前
K8s 网络与存储(容器网络互通与数据持久化)
网络·容器·kubernetes
精益数智工坊1 小时前
拆解设备维护管理系统的工单功能,解决设备维护管理派单慢难题
大数据·运维·网络·人工智能·精益工程
汽车仪器仪表相关领域2 小时前
Kvaser USBcan Pro 2xHS v2:双通道高速 CAN/FD 专业级 USB 接口,汽车与工业总线深度开发与诊断的核心工具
网络·人工智能·功能测试·fpga开发·汽车·可用性测试
AC赳赳老秦2 小时前
数据安全合规:OpenClaw 敏感信息脱敏、操作日志审计、权限精细化管控方案,符合等保要求
网络·数据库·python·安全·web安全·oracle·openclaw
TEC_INO2 小时前
Linux_55:RV1126的VENC模块讲解
linux·网络·人工智能
加号32 小时前
【C#】 HTTP 请求通讯实现指南
开发语言·http·c#
happyh h h h p p p p2 小时前
企业冗余网络拓扑配置
网络