18fde01fee5e4278981004762ce48cc4.png

✨✨ 欢迎大家来到小伞的大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:LInux
小伞的主页:xiaosan_blog

gitee:许星让 (xu-xingrang) - Gitee.com

制作不易!点个赞吧!!谢谢喵!!

Http协议

在互联网世界中, HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一个至关重要的协议。 它定义了客户端(如浏览器) 与服务器之间如何通信, 以交换或传输超文本(如 HTML 文档) 。
HTTP 协议是客户端与服务器之间通信的基础。 客户端通过 HTTP 协议向服务器发送请求, 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、 无状态的协议 即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息。(当我们更改文本时,页面并不会立刻产生更改,而是等建立新连接,把文件传输一次)

1. URL

"网址" 其实就是说的 URL

1.1 urlencode 和 urldecode

我们为什么需要编码呢

在标准的URL规范中,某些字符是不允许直接出现在URL中的,例如空格、#、%等。这些字符需要进行URL编码,以避免在传输过程中出现问题。例如,空格可以编码为%20或+,而其他特殊字符则会被转换为相应的百分号编码形式。

1.1.2 编码原理

URL编码的基本原理是将需要转码的字符转换为16进制然后在每个字节前加上百分号。例如,空格的ASCII码是32,对应的16进制是20,那么URL编码结果是%20。对于中文字符,例如“中”的ASCII码是-10544,对应的16进制是D6D0,那么URL编码结果是%D6%D0。

"+" 被转义成了 "%2B"

urldecode 就是 urlencode 的逆过程(解码);

1.1.3 编码工具
1.通过ASCII码值手动编码

ASCII码值对照表

二进制 八进制 十进制 十六进制 字符/缩写 解释
00000000 000 0 00 NUL (NULL) 空字符
00000001 001 1 01 SOH (Start Of Headling) 标题开始
00000010 002 2 02 STX (Start Of Text) 正文开始
00000011 003 3 03 ETX (End Of Text) 正文结束
00000100 004 4 04 EOT (End Of Transmission) 传输结束
00000101 005 5 05 ENQ (Enquiry) 请求
00000110 006 6 06 ACK (Acknowledge) 回应/响应/收到通知
00000111 007 7 07 BEL (Bell) 响铃
00001000 010 8 08 BS (Backspace) 退格
00001001 011 9 09 HT (Horizontal Tab) 水平制表符
00001010 012 10 0A LF/NL(Line Feed/New Line) 换行键
00001011 013 11 0B VT (Vertical Tab) 垂直制表符
00001100 014 12 0C FF/NP (Form Feed/New Page) 换页键
00001101 015 13 0D CR (Carriage Return) 回车键
00001110 016 14 0E SO (Shift Out) 不用切换
00001111 017 15 0F SI (Shift In) 启用切换
00010000 020 16 10 DLE (Data Link Escape) 数据链路转义
00010001 021 17 11 DC1/XON
(Device Control 1/Transmission On)
设备控制1/传输开始
00010010 022 18 12 DC2 (Device Control 2) 设备控制2
00010011 023 19 13 DC3/XOFF
(Device Control 3/Transmission Off)
设备控制3/传输中断
00010100 024 20 14 DC4 (Device Control 4) 设备控制4
00010101 025 21 15 NAK (Negative Acknowledge) 无响应/非正常响应/拒绝接收
00010110 026 22 16 SYN (Synchronous Idle) 同步空闲
00010111 027 23 17 ETB (End of Transmission Block) 传输块结束/块传输终止
00011000 030 24 18 CAN (Cancel) 取消
00011001 031 25 19 EM (End of Medium) 已到介质末端/介质存储已满/介质中断
00011010 032 26 1A SUB (Substitute) 替补/替换
00011011 033 27 1B ESC (Escape) 逃离/取消
00011100 034 28 1C FS (File Separator) 文件分割符
00011101 035 29 1D GS (Group Separator) 组分隔符/分组符
00011110 036 30 1E RS (Record Separator) 记录分离符
00011111 037 31 1F US (Unit Separator) 单元分隔符
00100000 040 32 20 (Space) 空格
00100001 041 33 21 !
00100010 042 34 22 "
00100011 043 35 23 #
00100100 044 36 24 $
00100101 045 37 25 %
00100110 046 38 26 &
00100111 047 39 27 '
00101000 050 40 28 (
00101001 051 41 29 )
00101010 052 42 2A *
00101011 053 43 2B +
00101100 054 44 2C ,
00101101 055 45 2D -
00101110 056 46 2E .
00101111 057 47 2F /
00110000 060 48 30 0
00110001 061 49 31 1
00110010 062 50 32 2
00110011 063 51 33 3
00110100 064 52 34 4
00110101 065 53 35 5
00110110 066 54 36 6
00110111 067 55 37 7
00111000 070 56 38 8
00111001 071 57 39 9
00111010 072 58 3A :
00111011 073 59 3B ;
00111100 074 60 3C <
00111101 075 61 3D =
00111110 076 62 3E >
00111111 077 63 3F ?
01000000 100 64 40 @
01000001 101 65 41 A
01000010 102 66 42 B
01000011 103 67 43 C
01000100 104 68 44 D
01000101 105 69 45 E
01000110 106 70 46 F
01000111 107 71 47 G
01001000 110 72 48 H
01001001 111 73 49 I
01001010 112 74 4A J
01001011 113 75 4B K
01001100 114 76 4C L
01001101 115 77 4D M
01001110 116 78 4E N
01001111 117 79 4F O
01010000 120 80 50 P
01010001 121 81 51 Q
01010010 122 82 52 R
01010011 123 83 53 S
01010100 124 84 54 T
01010101 125 85 55 U
01010110 126 86 56 V
01010111 127 87 57 W
01011000 130 88 58 X
01011001 131 89 59 Y
01011010 132 90 5A Z
01011011 133 91 5B [
01011100 134 92 5C \
01011101 135 93 5D ]
01011110 136 94 5E ^
01011111 137 95 5F _
01100000 140 96 60 `
01100001 141 97 61 a
01100010 142 98 62 b
01100011 143 99 63 c
01100100 144 100 64 d
01100101 145 101 65 e
01100110 146 102 66 f
01100111 147 103 67 g
01101000 150 104 68 h
01101001 151 105 69 i
01101010 152 106 6A j
01101011 153 107 6B k
01101100 154 108 6C l
01101101 155 109 6D m
01101110 156 110 6E n
01101111 157 111 6F o
01110000 160 112 70 p
01110001 161 113 71 q
01110010 162 114 72 r
01110011 163 115 73 s
01110100 164 116 74 t
01110101 165 117 75 u
01110110 166 118 76 v
01110111 167 119 77 w
01111000 170 120 78 x
01111001 171 121 79 y
01111010 172 122 7A z
01111011 173 123 7B {
01111100 174 124 7C |
01111101 175 125 7D }
01111110 176 126 7E ~
01111111 177 127 7F DEL (Delete) 删除
2.通过urlencode工具

UrlEncode编码/UrlDecode解码

2.Http协议请求与响应格式

2.1 Http请求

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

2.2Http响应

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

基本的应答格式

2.3 Http方法

接下来我们来看看这些方法

我们常用的为GET、POST、PUT、DELETE

2.3.1 GET方法

用途: 用于请求 URL 指定的资源

示例: GET /index.html HTTP/1.1

特性: 指定资源经服务器端解析后返回响应内容

form表单:HTML 表单(html格式)

2.3.2 POST方法

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

示例: POST /submit.cgi HTTP/1.1

特性: 可以发送大量的数据给服务器, 并且数据包含在请求体中

form 表单:HTML 表单

2.3.3 PUT方法

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

示例: PUT /example.html HTTP/1.1

2.3.4 HEAD方法

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

示例: HEAD /index.html HTTP/1.1

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

我们可以使用curl --head www.baidu.com命令来获取

Linux curl 命令

curl --head www.baidu.com
HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 0
Content-Type: text/html
Pragma: no-cache
Server: bfe
Date: Tue, 05 May 2026 01:47:40 GMT

curl -i www.baidu.com
HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 2381
Content-Type: text/html
Pragma: no-cache
Server: bfe
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
Date: Tue, 05 May 2026 01:47:56 GMT

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
2.3.5 DELETE 方法

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

示例: DELETE /example.html HTTP/1.1

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

2.3.6 OPTIONS 方法

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

示例: OPTIONS * HTTP/1.1

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

2.4 Http状态码

状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed(预期失败) 服务器无法满足请求头中 Expect 字段指定的预期行为。
418 I'm a teapot 状态码 418 实际上是一个愚人节玩笑。它在 RFC 2324 中定义,该 RFC 是一个关于超文本咖啡壶控制协议(HTCPCP)的笑话文件。在这个笑话中,418 状态码是作为一个玩笑加入到 HTTP 协议中的。
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
重定向:
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
SEO搜索引擎优化

SEO 是指搜索引擎优化(Search EngineOptimization),是一种通过优化网站内容和结构,提高网站在搜索引擎中的排名,从而吸引更多访问者的技术和方法。简单来说,SEO 就是让搜索引擎更好地理解和展示你的网站,提高网站在搜索引擎中的曝光度和点击率。

作者:Dummer
链接:https://www.zhihu.com/question/601158045/answer/3030110370
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

临时重定向

临时重定向表示资源暂时被移动到了一个新的 URL,但仍有可能返回原始 URL。搜索引擎会继续抓取和索引原始 URL,因为它们认为这是临时的变动。

Http响应中的头部信息

HTTP/1.1 302 Found\r\n

Location: https://www.new-url.com\r\n

永久重定向

永久重定向表示资源已经永久地移动到了一个新的 URL。与临时重定向不同,搜索引擎会更新它们的索引,将原始 URL 替换为新的 URL。这对于 SEO(搜索引擎优化)非常重要,因为它可以保留原始页面的权重和排名。

HTTP/1.1 301 Moved Permanently\r\n

Location: https://www.new-url.com\r\n

2.5 HTTP 常见 Header

Content-Type: 数据类型(text/html 等)

HTTP content-type

Content-Length: Body 的长度

Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;

User-Agent: 声明用户的操作系统和浏览器版本信息;

referer: 当前页面是从哪个页面跳转过来的;

Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;

Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

2.6 关于 connection 报头

HTTP 中的 Connection 字段是 HTTP 报文头的一部分, 它主要用于控制和管理客户端与服务器之间的连接状态

管理持久连接: Connection 字段还用于管理持久连接(也称为长连接)持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接, 以便在同一个连接上发送多个请求和接收多个响应。

  • HTTP/1.1: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接
  • HTTP/1.0: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。

语法格式

Connection: keep-alive: 表示希望保持连接以复用 TCP 连接。

Connection: close: 表示请求/响应完成后, 应该关闭 TCP 连接。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐