Linux_应用层协议Http
✨✨ 欢迎大家来到小伞的大讲堂✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:LInux
小伞的主页:xiaosan_bloggitee:许星让 (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工具
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命令来获取
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&tpl=mn&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>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <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 等)
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 连接。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐




所有评论(0)