【Linux网络】网络基础:HTTP协议

📝个人主页🌹: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上面查看

Gitee:HTTP封装


📖总结


在探索Linux网络基础与HTTP协议的旅途中,我们不仅解锁了互联网通信的密钥,还深刻理解了这一技术基石如何支撑起现代数字世界的万维网,学习的每一步都揭示出网络通讯的复杂性与优雅。

正如HTTP协议本身,它虽简单却强大,能够适应并驱动着互联网的不断变革。在这个快速变化的时代,持续学习、勇于探索未知,是我们作为技术人的不变使命。让我们带着这份对技术的热爱与敬畏,继续在Linux网络世界的广阔天地中遨游,用代码编织更加智能、安全的网络未来。

希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

相关推荐
gywl5 分钟前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
青木沐6 分钟前
Jenkins介绍
运维·jenkins
量子-Alex8 分钟前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
吉大一菜鸡13 分钟前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
WTT001141 分钟前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
某柚啊1 小时前
Windows开启IIS后依然出现http error 503.the service is unavailable
windows·http
_oP_i1 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
杨德杰1 小时前
QT网络(一):主机信息查询
网络·qt
日记跟新中1 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器