应用层协议 --- HTTP

news2024/9/26 1:05:58

序言

 在上一篇文章中,我们在应用层实现了一个非常简单的自定义协议,我们在我们报文的首部添加了报文的长度并且使用特定的符号分割。但是想做一个成熟,完善的协议是不简单的,今天我们就一起看看我们每天都会用到的 HTTP协议


URL

1.再识 URL

 刚接触电脑时我们肯定就会了解到 URL,我们一般称他为 网址,我们利用网址来定位网络上的特定资源。但是现在我们开始接触计网了,还应该认识他的本质了。
 在之前的内容中我们知道,所谓网络通信不过就是 物理距离增加后的 进程间通信。想要和网络上的某个设备的进程进行通信,我们需要知道该设备的 IP 地址和端口号IP地址 用于将数据发送到该设备上,端口号 用于将数据发送到指定进程。
 所以我们可以合理的推测 URL 的背后运行逻辑也是这样,但是我们一般的网址都是:

https://www.baidu.com/

没有你说的 IP,端口 呀?这是因为我们还需要 DNS,网址中的域名部分通过 DNS 系统被解析成 IP 地址。DNS 是一个分布式数据库,负责将人类可读的域名转换成机器可读的 IP 地址。
 这样做的原因是 网址提供了一种更加用户友好的方式来定位和访问这些资源。通过域名系统和默认的端口号约定,用户可以在不知道具体IP地址和端口号的情况下,轻松地访问他们想要的网络资源。

2. URL 的组成

 现在我使用百度的搜索引擎输出一个 你好URL 生成如下:
在这里插入图片描述
输出一个简单的 你好 竟然这么长,我们来层次的划分理解一下:

  • 协议部分指定了用于访问资源的应用层协议,如 HTTP、HTTPS、FTP
  • 域名部分代表了资源所在的主机或服务器的名称
  • 路径部分指定了服务器上资源的具体位置,帮助服务器定位到用户请求的具体资源
  • 参数部分用于向服务器传递额外的信息,以便服务器根据信息返回更精确的结果

在这里重点介绍一下 路径部分,当我们只是输入一个域名时我们可以在后面加上具体要访问的资源的路径,但是如果我们没有加上的话,他会自动跟一个 \。咦?这不是根目录吗?不是的,服务端接收后会处理你的路径,方法各有不同,但是常见的是将 \ 替换为他首页的页面路径,就拿百度举例:
在这里插入图片描述


HTTP 协议

1. 什么是 HTTP

 在互联网世界中,HTTP(HyperTextTransferProtocol,超文本传输协议)是一个至关重要的协议。它定义了 客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。经过前面的的铺垫学习,我们知道了只要是协议,双方就达成了一定的约定!
 在这里还需要注意重要的一点是,HTTP 的底层是基于 TCP 进行数据传输的!

2. HTTP 的请求与响应

2.1 请求报头

 现在我们做一个简单的试验,我们在云服务器上运行我们的服务端程序,并在本地的浏览器上使用 IP + 端口号 的形式访问,可以看到服务端输出:
在这里插入图片描述
很奇怪,我们并没有发送任何的内容,这是哪里来的呀?大家别忘了,浏览器在应用层,发送信息是会对报文增添报头,即使报文为空!这里输出的内容,就是 HTTP 协议约定好的报头!!!

 现在我们来看一下标准格式的请求头:
在这里插入图片描述

我们来了解一下请求行的作用:

  • 请求方法
    GET: 请求指定的资源,我们用的最多的方式
    POST:向服务器提交数据,比如登陆账号信息,会将具体的信息放在正文中
  • URL:这指定了请求的资源的路径,前面介绍过
  • HTTP版本:指定了客户端使用的 HTTP 协议版本,告诉服务器客户端能够理解的协议特性

请求报头数量是非常多的,并且很多都是需要特定的使用场景,我们只是介绍常用的报头:

  • Host: 指定请求的服务器的域名和端口号
  • User-Agent: 包含了发出请求的用户代理软件信息,通常是浏览器
  • Accept: 告诉服务器可以发送哪些媒体类型的内容
  • Content-Length: 请求体的长度
  • Cookie:缓存部分用户信息

 在这里可能需要阐明一点,如果你的请求方式为 GET,也是可以传递数据的。咦?不应该使用 POST吗?两个都行!比如搜索引擎,我们需要向输入框内输入搜索查询内容吧,我们的输入的内容就会以参数的格式加在 URL 后面。所以只是两者的方式不同,前者是将传递数据放在正文中,后者是放在 URL 中。
Cookie 非常重要,在后面会专门写一篇文章来进行说明,今天重要的是大体介绍 HTTP 的内容。

2.2 响应报头

 有了请求报文,现在我们再获取一下响应报文(在这里并没有找到一个很好抓包的方法,使用 AI 生成了一个效果一样的,嘻嘻):
在这里插入图片描述

响应报文的标准格式如下:
在这里插入图片描述
HTTP版本 就不多阐述了,我们重点其他内容,首先是状态码和状态码阐述:
在这里插入图片描述
一共包含 5 类,每一类的作用都大不相同,我们介绍最常见的状态码:

  • 200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回
  • 404 Not Found:服务器无法找到请求的资源。在浏览器中,这意味着 URL 输入错误或请求的页面已经被移除或不存在
  • 403 Forbidden:服务器理解请求,但拒绝执行它,通常都是权限不够
  • 302 Found (Redirect):请求的资源临时移动到了另一个 URI。客户端应该使用 GET 方法访问新的 URI ,原始请求的方法可能不再适用
  • 504 Gateway Timeout:作为网关或代理的服务器在等待上游服务器的响应时超时

原来这就是当我们搜索出错时弹出来的状态码的意义呀!最后便是我们的报头数据了:

  • Content-Type:指示响应主体的数据类型
  • Content-Length:指示响应主体的长度,以字节为单位
  • Date:指示响应生成的日期和时间

实现 HTTP 响应

 首先我们来分析一下在应用层数据需要怎么处理:
在这里插入图片描述

  1. 首先,本地将请求序列化发送给服务端特定端口
  2. 服务端接收请求数据并反序列化,处理后得到相应的响应数据
  3. 服务端将响应数据序列化发送给客户端特定端口
  4. 客户端接受响应数据并反序列化,得到结果

结果分析,看起来我们需要完成请求数据的序列化和反序列化,响应数据的序列化和反序列化。但是其实 请求数据的序列化和响应数据反序列化 浏览器已经帮我们做了!当你访问一个 URL 时其实已经将请求数据序列化并发送了!根据你的搜索呈现相应的结果不就是响应数据的反序列化吗?

 明白了这些,咋们直接开敲,首先肯定是构建 TCP注意:HTTP协议的底层使用的是 TCP 协议,如果你使用 UDP 是不能正常沟通的!!!) 的创建套接字文件:

// 创建套接字文件
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
    perror("socket:");
    exit(1);
}
std::cout << "Successful create sockfd..." << std::endl;

 之后便是绑定:

 // 绑定
 struct sockaddr_in Address;
 Address.sin_family = AF_INET;
 Address.sin_addr.s_addr = INADDR_ANY;
 Address.sin_port = htons(PORT);
 int n = bind(sockfd, (struct sockaddr*)&Address, sizeof(Address));
 if(n < 0)
 {
     perror("bind::");
     exit(1);
 }
 std::cout << "Successful bind..." << std::endl;

再者就是监听和接受连接:

// 监听
n = listen(sockfd, 3);
if(n < 0)
{
    perror("listen:");
    exit(1);
}
std::cout << "Successful listening..." << std::endl;

// 等待接收连接
struct sockaddr_in ClientAddress;
socklen_t len = sizeof(ClientAddress);
int newfd = accept(sockfd,  (struct sockaddr*)&ClientAddress, &len);
if(newfd < 0)
{
    perror("accept:");
    exit(1);
}
std::cout << "Successful accept..." << std::endl;

这都是几乎比较固定的步骤!咋们对特定的业务只需要对数据处理模块进行特定的设计,现在我想要返回一个类似于网页的界面,就简单一下让人工智能帮咋们设计一下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>你好</title>
<style>
  @keyframes bounce {
    0%, 20%, 50%, 80%, 100% {
      transform: translateY(0);
    }
    40% {
      transform: translateY(-30px);
    }
    60% {
      transform: translateY(-15px);
    }
  }

  .bounce-text {
    font-size: 24px;
    animation: bounce 2s infinite;
  }
</style>
</head>
<body>

<div class="bounce-text">你好</div>

</body>
</html>

 现在当我们和客户端顺利连接时,咋们就按照协议的要求发送该内容:

std::string Content = GetIndex();
while(true)
{
    std::string response;
    response += "HTTP/1.0 200 OK\n";
    response += "Content-Length:" + std::to_string(Content.size()) + '\n';
    response += '\n'+ Content;

    send(newfd, response.c_str(), response.size(), 0);
}

我们简单的添加了状态行和响应报头最后是我们的上述 html 的内容,最后看一下效果:
在这里插入图片描述
成功啦,也不难是吧!


总结

 在这篇文章中我们简单认识了 HTTP 协议的组成,并且已经简单的实现了浏览器访问云服务器,返回相应数据的功能,希望大家有所收获!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手 近日&#xff0c;华语乐坛传来一则令人振奋的消息&#xff0c;11 岁的双胞胎姐妹花陈千言和陈万语荣获 2024 华语童声最受媒体欢迎女歌手和第 15 届华语金曲奖优秀童星两项大奖&#xff01; 陈千言和陈万语…

前缀和(2)_【模板】二维前缀和_模板

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(2)_【模板】二维前缀和_模板 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷&#xff08;PV&#xff09; 3.创…

单词搜索问题(涉及递归等)

目录 一题目&#xff1a; 二思路解释&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; newcode题目链接&#xff1a; 单词搜索_牛客题霸_牛客网 二思路解释&#xff1a; 思路&#xff1a;个人理解是找到word中的第一个元素&#xff0c;然后去递归的上下左右查找&am…

python实现财会人工智能分享课件

前言&#xff1a; 一、财会与人工智能之间的联系 人工智能是计算机科学的一个分支&#xff0c;旨在模拟人类智能。自20世纪50年代起&#xff0c;AI经历了多个发展阶段&#xff0c;从规则基础系统到现在的深度学习技术&#xff0c;已经在医疗、制造、金融等多个行业得到广泛应用…

Volume数据管理

Volume 容器销毁时&#xff0c;保存在容器内部文件系统中的数据都会被清除&#xff0c;为了持久化保存容器的数据&#xff0c;可以使用kubernetes Volumevolume的生命周期独立于容器&#xff0c;Pod中的容器可能被销毁和重建&#xff0c;但Volume会被保留本质上&#xff0c;Kub…

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo&#xff0c; 是一个庞大的案例库&#xff0c; 可以提供直观的参考&#xff0c; 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

Vue3:作用域插槽

目录 一.性质 1.数据传递性 2.自定义显示方式 3.复用性 4.解耦性 二.作用 1.提高灵活性 2.增强可维护性 3.简化数据流 4.提升用户体验 三.使用 1.父组件 2.子组件 四.代码 1.父组件代码 2.子组件代码 五.效果 作用域插槽&#xff08;Scoped Slots&#xff09;…

一个很小的系统为什么负载那么高?

最近帮朋友优化一个系统&#xff0c;基本的情况如下&#xff1a;虚拟机&#xff0c;centos7.9&#xff0c;oracle 11.2.0.4&#xff0c;MES系统&#xff0c;数据量<50GB,日常session数不足100&#xff1b;按说这应该是一个负载很低的系统&#xff0c;但是用户却反映系统CPU经…

jQuery——jQuery的基本使用

1、使用 jQuery 核心函数&#xff1a;$ / jQuery 2、使用 jQuery 核心对象&#xff1a;执行 $&#xff08;&#xff09;返回的对象 3、引入 jQuery 函数库&#xff1a;可以本地引入&#xff08;不用联网&#xff09;&#xff0c;也可以远程引入&#xff08;需联网&#xff09…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

分享课程:VUE数据可视化教程

在当今这个数据驱动的世界中&#xff0c;数据可视化已经成为了一种至关重要的工具&#xff0c;它帮助我们理解复杂的数据集&#xff0c;发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表&#xff0c;它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化&#xf…

2021世界人工智能大会召开 百度展示量子技术影响力

姓 名&#xff1a;王芷若 学 号&#xff1a;19020100180 学 院&#xff1a;电子工程学院 转载自&#xff1a;钥成网 原文链接&#xff1a; https://baijiahao.baidu.com/s?id1704906954970597725&wfrspider&forpc&searchword2021%E4%B8%9…

Windows (rust) vulkan 画一个三角形: 窗口创建与渲染初始化

在每个平台, 每前进一步, 都会出现许多预料之外的困难 (大坑). 本文介绍在 Windows 操作系统之中, 使用 win32 API 创建窗口, 并使用 vulkano (rust) 初始化 vulkan, 绘制一个三角形. 这里是 穷人小水滴, 专注于 穷人友好型 低成本技术. (本文为 63 号作品. ) 相关文章: 《r…

企业微信聊天记录怎么查看,会话存档的妙用!

在企业微信中&#xff0c;老板是否可以任意查看任何人的聊天记录取决于是否开通了会话存档功能以及你是否在存档的成员范围内。以下是详细解释&#xff1a; 如果企业开通了会话存档功能&#xff0c;并且在存档的成员范围内&#xff0c;老板可以看到该成员的聊天记录。 存档的…

点餐小程序实战教程11数据源设计

目录 1 设计图2 创建数据源2.1 菜品分类2.2 菜品表 3 创建管理应用4 设置上架下架功能总结 我们用了10篇讲解了一下用户管理及权限设计&#xff0c;有了用户和权限相当于有了骨架&#xff0c;但是我们还需要有良好的设计来确保我们的小程序的开发顺利进行。 在数据源的设计中&a…

光伏开发:一分钟生成光伏项目报告

传统光伏项目报告的编制往往需要收集大量数据、进行复杂计算与分析&#xff0c;耗时长且易受人为因素影响。自动生成光伏项目报告&#xff0c;依托大数据、云计算、人工智能等先进信息技术&#xff0c;实现了对光伏项目关键参数的快速分析、评估与预测。 一、核心功能与流程 1…

Python学习笔记--BeeWare跨平台打包方案2

文章目录 1. 多文件开发支持 首先贴上官方的地址&#xff1a; BeeWare 教程 其中的安装和初始化过程在上一片有描述&#xff0c;这张介绍一些基础使用&#xff1a; 1. 多文件开发支持 通常一个工程下我们通常会分为多个 app进行开发&#xff0c;例如如下目录&#xff1a; 如…

vue3/Element-Plus/路由的使用

我们来实现一个简单的二级路由 1.准备主页和要配置的组件 主页面 <template><!-- 加载配置路由 --><RouterView></RouterView> </template><style scoped></style>组件1 <template><div>考试组件</div> </t…