应用层协议 HTTP 讲解&实战:从0实现HTTP 服务器

目录
一:🔥 HTTP 协议
🦋 认识 URL
🦋 urlencode 和 urldecode
二:🔥 HTTP 协议请求与响应格式
🦋 HTTP 请求
🦋 HTTP 响应
🦋 HTTP 的方法
🦋 HTTP 的状态码
🦋 HTTP 常见 Header
🦋 关于 connection 报头
三:🔥 实现 HTTP 服务器
🦋 完整代码移步我的Gitee仓库
四:🔥 附录
🦋 HTTP 历史及版本核心技术与时代背景
🦋 HTTP/0.9
🦋 HTTP/1.0
🦋 HTTP/1.1
🦋 HTTP/2.0
🦋 HTTP/3.0
五:🔥 共勉
一:🔥 HTTP 协议
🧑‍💻 虽然我们说, 应用层协议是我们程序猿自己定的,但实际上, 已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用. HTTP(超文本传输协议) 就是其中之一。

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

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

🦋 认识 URL
📚 平时我们俗称的 “网址” 其实就是说的 URL

🦋 urlencode 和 urldecode
📚 像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现.

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

📚 转义的规则如下:

将需要转码的字符转为 16 进制, 然后从右到左, 取 4 位(不足 4 位直接处理), 每 2 位做一位, 前面加上%, 编码成 %XY 格式
📚 例如:

🧑‍💻 “+” 被转义成了 “%2B” urldecode 就是 urlencode 的逆过程;
urlencode 工具

二:🔥 HTTP 协议请求与响应格式
🦋 HTTP 请求


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

🦋 HTTP 响应


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

🦋 HTTP 的方法

📚 其中最常用的就是 GET 方法和 POST 方法.

GET 方法(重点)
用途: 用于请求 URL 指定的资源。
示例: GET /index.html HTTP/1.1
特性: 指定资源经服务器端解析后返回响应内容。
form 表单: https://www.runoob.com/html/html-forms.html
POST 方法(重点)
用途: 用于传输实体的主体, 通常用于提交表单数据。
示例: POST /submit.cgi HTTP/1.1
特性: 可以发送大量的数据给服务器, 并且数据包含在请求体中。
form 表单: https://www.runoob.com/html/html-forms.htm
PUT 方法(不常用)
用途: 用于传输文件, 将请求报文主体中的文件保存到请求 URL 指定的位置。
示例: PUT /example.html HTTP/1.1
特性: 不太常用, 但在某些情况下, 如 RESTful API 中, 用于更新资源。
HEAD 方法
用途: 与 GET 方法类似, 但不返回报文主体部分, 仅返回响应头。
示例: HEAD /index.html HTTP/1.1
特性: 用于确认 URL 的有效性及资源更新的日期时间等。
DELETE 方法(不常用)
用途: 用于删除文件, 是 PUT 的相反方法。
示例: DELETE /example.html HTTP/1.1
特性: 按请求 URL 删除指定的资源。
OPTIONS 方法
用途: 用于查询针对请求 URL 指定的资源支持的方法。
示例: OPTIONS * HTTP/1.1
特性: 返回允许的方法, 如 GET、 POST 等。
🦋 HTTP 的状态码

📚 最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)

状态码    含义    应用样例
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    服务器维护或过载, 暂时无法处理请求
📚 以下是仅包含重定向相关状态码的表格

状态码    含义    是否为临时重定向    应用样例
301    Moved Permanently    否(永久重定向)    网站换域名后, 自动跳转到新域名;搜索引擎更新网站链接时使用
302    Found 或 See Other    是(临时重定向)    用户登录成功后,重定向到用户首页
307    Temporary Redirect    是(临时重定向)    临时重定向资源到新的位置(较少使用)
308    Permanent Redirect    否(永久重定向)    永久重定向资源到新的位置(较少使用)
关于重定向的验证, 以 301 为代表:

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

HTTP 状态码 301(永久重定向) :

当服务器返回 HTTP 301 状态码时, 表示请求的资源已经被永久移动到新的位置。
在这种情况下, 服务器会在响应中添加一个 Location 头部, 用于指定资源的新位置。 这个 Location 头部包含了新的 URL 地址࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值