📝个人主页🌹:Eternity._
⏩收录专栏⏪:Linux " 登神长阶 "
🌹🌹期待您的关注 🌹🌹
❀ HTTP协议
前言:在当今这个数字化迅猛发展的时代,互联网已经成为连接全球信息与服务的桥梁。而在这浩瀚的网络海洋中,HTTP(超文本传输协议)作为互联网上应用最广泛的一种协议,扮演着举足轻重的角色。无论是我们日常浏览的网页、观看的在线视频、还是进行的电子商务交易,背后都离不开HTTP协议的默默支撑。
我们将从HTTP协议的历史沿革讲起,逐步深入到协议的报文结构、状态码含义、请求方法分类,先初步了解HTTP的大概,然后手动封装一个HTTP协议来加深对知识的理解,掌握HTTP协议的基础知识不仅是通往更高层次技术领域的必经之路。
让我们携手启程,探索HTTP协议在Linux网络世界中的无限可能!
📒序列化和反序列化(JSON)
序列化:
JSON序列化是指将数据结构或对象转换为JSON格式字符串的过程。这个字符串可以方便地存储到文件、数据库,或通过网络传输。我们在C++编程中想要使用JSON是需要链接外部库的,我们在编译时,需要加上-ljsoncpp
JSON序列化示例:
cpp
#include <iostream>
#include <jsoncpp/json/json.h> //JSON
int main()
{
// Json::Value --- 万能类型
Json::Value root;
root["k1"] = 100;
root["k2"] = 200;
root["k3"] = 300;
root["k4"] = 400;
root["k5"] = 500;
Json::FastWriter writer;
std::string s = writer.write(root);
std::cout << s << std::endl;
return 0;
}
反序列化:
JSON反序列化是指将JSON格式字符串转换回数据结构或对象的过程。这个过程是序列化的逆过程,它允许从存储或传输的JSON字符串中恢复出原本的数据结构或对象。
JSON反序列化示例:(伪代码)
cpp
#include <iostream>
#include <jsoncpp/json/json.h> //JSON
int main()
{
Json::Value root;
Json::Reader reader;
int x, y, z;
bool res = reader.parse(in, root);
if(res)
{
x = root["k1"].asInt();
y = root["k2"].asInt();
z = root["k3"].asInt();
}
return 0;
}
📜HTTP协议概念
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层协议,用于在Web服务器和客户端之间传输超文本(如HTML文档)和其他内容。它是构成现代Web的核心协议之一,为浏览器和服务器之间的通信提供了一种标准化的方式。
HTTP的基本工作原理:
- HTTP协议基于请求-响应模型工作。当用户在浏览器中输入一个网址或点击一个链接时,浏览器会向服务器发送一个HTTP请求。服务器接收到请求后,处理该请求并返回相应的HTTP响应,其中包含了所需的资源(如HTML文档、图像、视频等)或状态信息。
📝认识URL
URL可以看作是互联网世界中的地址,就像在现实生活中通过门牌号找到房子一样,通过URL,用户可以在互联网上找到特定的网页、文件、图像、视频等各种资源。
URL是互联网上资源位置的重要标识符,它允许用户准确地找到所需的资源,并方便地与他人共享这些资源。
urlencode和urldecode:
UrlEncode(URL编码)和UrlDecode(URL解码)是一对相反的操作,它们主要用于处理URL中的特殊字符。
转义的规则如下:
- 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
"+" 被转义成了 "%2B"
urlencode和urldecode是一对相互配合的操作。urlencode用于编码URL中的特殊字符,而UrlDecodeurldecode用于解码已经被编码的URL。
📚HTTP协议格式
HTTP请求
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度
HTTP响应
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中
🌞HTTP的方法
HTTP(Hypertext Transfer Protocol,超文本传输协议)的方法,也称为"动作"或"命令",是客户端(如浏览器)向服务器发送请求以执行特定操作的方式。以下是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 |
UNLINK | 断开连接关系 | 1.0 |
虽然关于HTTP的方法有这么多种,但是我们最最常用的方法还是GET和POST方法,这两种方法足够我们使用了,它们不仅获取服务器上的资源,还可以将自己的资源传输到服务器
GET
用于请求指定的页面信息,并返回实体主体。
通常用于请求数据,而不是提交数据。请求的数据会附加在URL之后(即查询字符串)。
cpp
<form action="/dira/dirb/pxt.html" method="get">
当我们使用GET方法时,当我们输入账号和密码请求内容时,我们的网址会加上参数,从而传给服务器,带参的GET方法通过URL将参数传递给服务器,会将参数回显出来
cpp
http://121.37.255.241:8888/dira/dirb/pxt.html?myname=aaaa&mypasswd=123456
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据包含在请求体中。
POST请求可能会导致新的资源的创建或现有资源的修改。
cpp
<form action="/dira/dirb/pxt.html" method="post">
当我们使用POST方法时,我们在上传数据时,我们需要使用到参数,但是参数并不会直接通过url直接回显出来,而是存放在了请求行中
cpp
http://121.37.255.241:8888/dira/dirb/pxt.html
注意:
- GET方法: 通过url传参,会回显私密信息,不够私密
- POST方法: 通过正文提交参数,不会回显私密信息,比较私密
- 这里的私密并不决定安全性,真正决定安全性是要通过加密保障
🌙HTTP的状态码
- | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器无法处理出错 |
最常见的状态码:
200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
⭐HTTP常见Header
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
- User-Agent: 声明用户的操作系统和浏览器版本信息
- referer: 当前页面是从哪个页面跳转过来的
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
Cookie:
Cookie指的是一种存储在客户端浏览器中的小型文本文件,这个文件包含了用户的个人信息、偏好、登录状态等数据
不知道大家有没有注意过,我们在使用CSDN,除了第一次要登陆账号以外,后面每一次,都是自动登录账号,有这一层便利,还得多亏了Cookie,当我们在第一次登陆账号后,Cookie中就会保存我们的账号信息,然后当我们再次登录时,他会直接读取保存好的账号的信息,完成自动登录
Cookie的类型:
- 会话Cookie: 仅在用户浏览网站期间存在,关闭浏览器后即会自动删除。
- 持续性Cookie: 会在用户设备上存储一定期限,即使关闭浏览器也不会删除,除非用户手动清除。
Session:
Session对象存储特定用户会话所需的属性及配置信息。它允许服务器跟踪用户的状态,如登录信息、用户偏好设置等,以提供连贯的用户体验。
工作原理:
- 当客户端(如浏览器)首次请求服务器时,服务器会创建一个Session,并生成一个唯一的Session ID
- 服务器将这个Session ID发送给客户端,通常是以Cookie的形式。客户端将这个Session ID存储在本地,以便后续请求时携带
- 之后,每当客户端与服务器进行交互时,都会将这个Session ID包含在请求中。服务器通过Session ID找到对应的Session,从而识别出请求来自哪个客户端
这里我们简单了解个大概就可以了,感兴趣的童鞋可以去深入了解一下,我这里就不过多展开了,最后我简单的实现了一下HTTP的封装,感兴趣的童鞋也可以去Gitee上面查看
📖总结
在探索Linux网络基础与HTTP协议的旅途中,我们不仅解锁了互联网通信的密钥,还深刻理解了这一技术基石如何支撑起现代数字世界的万维网,学习的每一步都揭示出网络通讯的复杂性与优雅。
正如HTTP协议本身,它虽简单却强大,能够适应并驱动着互联网的不断变革。在这个快速变化的时代,持续学习、勇于探索未知,是我们作为技术人的不变使命。让我们带着这份对技术的热爱与敬畏,继续在Linux网络世界的广阔天地中遨游,用代码编织更加智能、安全的网络未来。
希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!