【计算机网络】应用层HTTP协议

我们已经实现过应用层协议,但也要看一看成熟的应用层协议

目录

  • 1 HTTP协议
    • 1·1 URL
    • 1·2 urlencode 和 urldecode
    • 1·3 HTTP 协议请求与响应格式
      • 请求格式
      • 响应格式
    • 1·4 界面的基本处理
      • 显示基本主页
      • 显示图片
      • 页面跳转
    • 1·5 常见header
    • 1·6 状态码
      • 1·6·1 404举例
      • 1·6·2 关于3开头的状态码
    • 1·7 请求方法
      • 1·7·1 PostMan

接下来我们自己编写一个tcp服务端并将会以此代码为蓝本进行演示。
具体的代码请看: HTTP极简

1 HTTP协议

虽然说应用层协议是程序员自己定的,就像我们已经写过的tcp、udp、网络版本计算器,都是自己定的协议。

但是应用层也有大佬们已经定制好的协议:HTTP(超文本传输协议)就是其中之一。
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。

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

这里理解一下无连接无状态:

  • HTTP协议被设计为无连接的,这意味着HTTP客户端(通常是浏览器)和HTTP服务器之间的每一次请求和响应都是独立的。即使HTTP通常运行在TCP/IP协议之上,而TCP是一个面向连接的协议,HTTP本身并不维护任何连接状态。
  • HTTP协议被设计为无状态的,意味着服务器不会保存有关客户端的任何上下文信息。每个请求都是独立的,并且包含了所有必要的信息来完成该请求。服务器不会自动保留任何关于先前请求的信息。

1·1 URL

平时我们俗称的 “网址” 其实就是说的 URL。
我们先随便点找一个网页来看看:

https://news.cctv.com/2024/08/23/ARTIENSZojGK092VY8UxceVT240823.shtml

https代表协议头,我们暂时认为http = https,在十几年前http还是很多的,不过https更安全,多了一层安全层,因此现在都是用https了。


:// 代表分割符,是网址要求的特殊字符


news.cctv.com 是域名,但是可以通过DNS协议转为ip。
注意:
但是我们知道 ip+ port 才能准确的定位到服务进程,
可是我们发现网址中并没有体现出端口号的信息。
原因在于https是知名端口,他对应80端口。
就像我们平时说打110,和打报警电话是一样的,我们一说报警就能想到110,一说到110就能想到报警。
所以事实是发起请求时任然会使用ip + port,只是没有在网址中体现,但会发送请求时会自动拼接。


com后的部分
首先我们的http是超文本协议,超文本也就是超越文本,是网页、图片、视频、音频…这些资源化都在服务器上,我们没访问服务器时资源也是在服务器的。
在这里插入图片描述
而我们对于服务器一般都是进行读或写操作。
在这里插入图片描述

再者服务器一般都是linux系统的,linux下一切皆文件–>资源也是文件—>
因此对资源进行读或写就需要路径–>因此com后边的这部分理所当然的是路径。
而恰好路径就对应着资源。

那么/2024/08/23/ARTIENSZojGK092VY8UxceVT240823.shtml中的第一个/岂不是就意味着是Linux的根目录?其实不然,这个叫做web根目录,可以是任意一个linux下的目录。

因此:域名(ip标识唯一一台主机) + 路径 = 互联网中的唯一一份资源。

因此URL也叫做统一资源定位符。

我们再来看一下完整版的URL在这里插入图片描述
user:pass就是登录信息,我们不管。
可以看到我们在域名后确实看到了端口号。
那么一份资源路径后的是什么?
我们打开百度试验一下

https://www.baidu.com/s?wd=hello&rsv_spt=1&rsv_iqid=0xd8f11d5d0005ed5b&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=10&rsv_sug1=10&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&inputT=2757&rsv_sug4=13469

在这里插入图片描述
在这里插入图片描述

可以看到,这就是代表你要搜索的资源的参数

最后的#ch的意思下图可以很好的反应,就是图片的那个啥、在这里插入图片描述

1·2 urlencode 和 urldecode

像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了.
因此这些字符不能随意出现.
比如,某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.否则则会干扰正常格式。

转义的规则如下:将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上%,编码成%XY 格式
例如:在这里插入图片描述
“+” 被转义成了 “%2B”
urldecode 就是 urlencode 的逆过程;

1·3 HTTP 协议请求与响应格式

请求格式

注意:我们在自己编写时的是将报头与正文部分分开进行的,而http请求是全部放入一个结构体中统一处理的,我们在自己编写应用层时也可以选择适合的协议方法来处理。
在这里插入图片描述
我们看一看利用浏览器得到的最原始请求是什么样子
在这里插入图片描述
是一行一行的,也不出我们所料,因为每一行都有/r/b,所以自然而然打印出来就是一行行的,方便我们查看。

响应格式

在这里插入图片描述
我们可以通过telnet命令,或费德勒等软件进行观察返回的响应

在这里插入图片描述
发现body就是html代码

1·4 界面的基本处理

几乎都是修改一下前端代码即可

注意:由于响应添加了正文部分,所以content-length报头一定要添加,否则就很难分清每一个响应。

显示基本主页

我们先构建一下最基本的主页
index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>我的网页</title>
</head>
<body><h1>欢迎来到我的网站</h1><p>这是我的网页,我是内容!</p>
</body><a href="register.html">注册</a>// 这个地方也可以写成"/register.html",多一个带/的,若是不带,默认会带上/,而这个/就是web根目录
<div><img src="Photos/Screenshot_2024-08-21_210803.png" alt="Big Boat">
</div>
</html>

利用浏览器访问进行查看现象
在这里插入图片描述

显示图片

我们在index.html中添加即可
在这里插入图片描述
现象:果然出现了图片,但是有一个问题,我们明明申请时只请求了首页,并没有请求图片,为什么仍然会显示图片?
在这里插入图片描述

原因:在这里插入图片描述
虽然我们只访问了主页,但是浏览器却仍然发起两次请求,我将请求行进行了截取
在这里插入图片描述
同样,我们也会发现还有另一个请求,favicon?这其实就是我们网页的小图标,因为我们没搞,所以他就生成了默认的丑丑图标。在这里插入图片描述在这里插入图片描述

页面跳转

我们依旧更改一下html即可,也要添加一下你要舔转的html

index.html
在这里插入图片描述
register.html
在这里插入图片描述

现象:
在这里插入图片描述
在这里插入图片描述

1·5 常见header

Content-Type: 数据类型(text/html 等)
由于现在的浏览器都做的太牛了,虽然传过去的都是二进制,但二进制有可能是音频,视频等格式,就算没有加Content-Type报头也有可能直接解析,但是我们仍然需要加,保证鲁棒性!

至于如何填参对应就需要依靠一下type对照表了

Content-Length: Body 的长度
这个没什么好说的,只要有正文,不论是请求还是响应报文都需要带

Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
就像浏览器发送请求,fiddler进行截取了,因为截取了所以还要重新发送,所以就必须包含HOST报头,否则fiddler就无法知道目的地进而发送了。

User-Agent: 声明用户的操作系统和浏览器版本信息;
我们发现每次进行下载时,都会提示出你要下载的正确版本,就像你是安卓手机,你搜索微信,那么跳出来的就是安卓版本。这就是由于User-Agent存在的原因,他会将你的浏览器地址,设备版本等信息作为报头发送,

referer: 当前页面是从哪个页面跳转过来的;
我们进行网页跳转测试时就会发现请求报头中有这个东西,反而第一次进入初始页面是没有出现。
在这里插入图片描述

那么他的意义是什么?
比如:进行统计喜欢从那个页面到哪个页面;
如果跳转网页时可以进制从一个跳到另一个…


Location 与 Cookie会在稍后进行解释
前者在状态码3时会讲到,cookie会在讲到方法时会讲到。


connection

首先我们当前服务器就是短连接,在以前网页没有那么花哨时,实用的就是短连接,每次请求都需要重新accept与connect,所以当一个网页中需要请求的资源很多时就造成了浪费。

那如何改成长连接?
我们在网络版本计算其中已经进行设计过了!


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 连接。

keep-alive代表这一种协商,表示客户端支持长连接,如果server也支持,那么就使用长连接。

1·6 状态码

在这里插入图片描述

状态码含义应用样例
100Continue上传大文件时,服务器告诉客户端可以继续上传
200OK访问网站首页,服务器返回网页内容
201Created发布新文章,服务器返回文章创建成功的信息
204No Content删除文章后,服务器返回“无内容”表示操作成功
301Moved Permanently网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用
302Found 或 See Other用户登录成功后,重定向到用户首页
304Not Modified浏览器缓存机制,对未修改的资源返回
400Bad Request填写表单时,格式不正确导致提交失败
401Unauthorized访问需要登录的页面时,未登录或认证失败
403Forbidden尝试访问你没有权限查看的页面
404Not Found访问不存在的网页链接
500Internal Server Error服务器崩溃或数据库错误导致页面无法加载
502Bad Gateway使用代理服务器时,代理服务器无法从上游服务器获取有效响应
503Service Unavailable服务器维护或过载,暂时无法处理请求

1·6·1 404举例

这里就拿最常见的404状态码进行举例,相信各位小伙伴们也都遇到过。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>404 - 页面未找到</title><style>body {font-family: 'Arial', sans-serif;background-color: #100e0e;color: #333;margin: 0;padding: 0;}.container {max-width: 800px;margin: 0 auto;text-align: center;padding: 50px 0;}h1 {font-size: 36px;color: #333;margin-bottom: 20px;}p {font-size: 18px;line-height: 1.6;margin-bottom: 20px;}.return-home {display: inline-block;background-color: #007BFF;color: #c50e0e;text-decoration: none;padding: 10px 20px;border-radius: 5px;transition: background-color 0.3s ease;}.return-home:hover {background-color: #0056b3;}</style>
</head>
<body><div class="container"><h1>404 - 页面未找到</h1><p>很抱歉,您访问的页面不存在。</p></div>
</body>
</html>

在进行取出指定路径内容时如果没有该文件那就构建404的响应即可。
在这里插入图片描述

1·6·2 关于3开头的状态码

我们在来详细的看一下3××状态码

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

首先location与3开头的状态码就是相互配合的使用的。
然后重定向分为临时与永久,我们分别理解一下。

我们先来看看重定向是什么意思
在这里插入图片描述
我们在来两个例子解释临时与永久的区别
临时:
在这里插入图片描述
学校的学生想去吃饺子,但是饺子换由于修路临时搬到到西门,因此要贴一个告示,然后学生转而就去西门去了,时隔两月这个学生又想吃饺子,但这个学生还是会去老店,因为是临时的搬走。

永久:若是永久的搬走,那么时隔两个月后学生就会直接去西门了。

他们两的区别就在这临时的不会影响未来的你,永久的会影响。


那我们映射到应用场景中
临时:就像我们看vip视频超过时限时会自动跳转到付费界面。

永久:假设我们更换了域名
在这里插入图片描述
我们这里在更改代码时以提供重定向到新地址时就要意识到,这其实本质就是一个服务了,而不是一个简单的html界面。

只需添加如下的一个报头即可。
在这里插入图片描述注意:Location报头中包含的url必须是一个完整的!

1·7 请求方法

在这里插入图片描述

给大家一个量化的概念,虽然请求方法很多,但是GET与POST可以占据99,而GET又占据这99中的70。

所以我们只介绍GET与POST
我们总归还是要构建一下对应的场景

注意:关于GET上图写的并不完整,他也同样可以传输实体主体。

传输实体主体包括:登录,注册…

注意:
浏览器默认是通过GET方法进行访问的,那么如何修改?

1·7·1 PostMan

我们可以利用postman构建需要的请求
持续更新~~~~~~~~~~~~~~~~~~~~~~~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yd云手机登录算法分析

yd云手机登录算法分析 yd云手机登录算法分析第一步&#xff1a;抓包-登录第二步&#xff1a;定位加密入口第三步&#xff1a;分析加密算法第四步&#xff1a;算法实现 yd云手机登录算法分析 在这篇文章中&#xff0c;我们将详细解析yd云手机的登录算法&#xff0c;涵盖从抓包到…

96.SAP MII功能详解(09)Workbench-Transaction Debugging

目录 1.About Transaction Debugging Use Features Activities 2.How to Debug Start Debugging Create Breakpoint Watch Variables Debugging logs 1.About Transaction Debugging Use You use this function to monitor and manipulate a transaction while it …

微深节能 堆取料机回转俯仰角度检测系统 格雷母线定位系统

微深节能在堆取料机回转俯仰角度检测系统中引入的格雷母线定位系统&#xff0c;是一项重要的技术创新&#xff0c;显著提升了堆取料作业的自动化水平和精确性。以下是对该系统的详细介绍&#xff1a; 一、系统概述 格雷母线定位系统作为高精度、无磨损的非接触式位置检测系统&a…

07 - procfs

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. procfs 快速入门2. procfs 文件创建的回调机制3. 在 proc 目录下创建子目录4. 通过 proc 接口修改内核变量5. 通过 proc 接口访问数组6. 序列文件&#xff1a;seq_file 编程接口7. seq_f…

OpenCV绘图函数(1)绘制带箭头的直线函数arrowedLine()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个从第一个点指向第二个点的箭头线段。 cv::arrowedLine 函数在图像中绘制一个从 pt1 到 pt2 的箭头。另见 line 函数。 函数原型 void c…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心&#xff0c;其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先&#xff0c;系统可以通过按键输入模块设置当前的时间和报警值&#xff1b;使用检测模块检测当前…

在Ubuntu 部署 Grafana且监控MySQL数据

一、安装 打开终端按顺序执行以下命令 1.添加 Grafana 的 APT 仓库&#xff1a; sudo apt-get install -y software-properties-common sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main" 2.导入Grafana GPG key&#xff1a; wge…

吴光明铸就鱼跃辉煌,科技创新开辟医疗新篇章

在鱼跃集团的发展历程中&#xff0c;创始人吴光明为其树立了最鲜明的品牌标签——创新。吴光明始终坚信&#xff0c;“研发实力代表一个医疗器械企业的核心竞争力”。他很早就认识到&#xff0c;只有从用户需求出发进行创新&#xff0c;才能提升医疗产品的使用体验&#xff0c;…

软件设计原则之接口隔离原则

接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它属于SOLID原则之一。这个原则强调客户端&#xff08;即接口的调用者&#xff09;不应该被迫依赖于它们不使用的方法。换句话说&#xff0c;一个类对另一…

SOA通信中间件介绍(一)

一、通信中间件 在软件定义汽车中&#xff0c;应用程序之间的跨进程或跨核通信是一个需要解决的问题。模块化架构为开发人员提供了便利&#xff0c;但也引入了对通信中间件的需求。 在没有使用通信中间件的情况下&#xff0c;开发人员需要自己定义数据的格式、发送方和接收方…

趣味呈现高效农业管理:智慧农场可视化

运用图扑自主研发的 HT 产品&#xff0c;全程零代码搭建 3D 轻量化 Low Poly 风格的智慧农场可视化&#xff0c;通过生动有趣的图形展示农场运作细节&#xff0c;使农业管理更直观易懂&#xff0c;提升管理效率和用户体验。

C++ 基础学习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {cout<<"请输入字符串:";string str;getline(cin,str);int num0;int alp0;int spa0;int other0;int …

网络安全面试经验分享:蘑菇街/网络安全

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 蘑菇街 介绍…

【STM32】MDK安装

1 MDK 历史背景 Keil公司是一家业界领先的微控制器&#xff08;MCU&#xff09;软件开发工具的独立供应商。Keil公司由两家私人公司联合运营&#xff0c;分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公司制造和销售种类广泛的开发工具&am…

自动化脚本到LabVIEW转换

工业自动化领域中的专用脚本语言转换为LabVIEW时需要注意的问题 语法差异&#xff1a; 脚本语言特点&#xff1a; 工业自动化脚本语言通常具有特定的语法和结构&#xff0c;例如条件判断、循环控制、硬件指令等。这些语言直接面向硬件操作&#xff0c;语法简洁&#xff0c;适用…

element-plus 新增一行合计。除了用summary-method还可以用append的插槽

:summary-method"getSummaries" <el-table:data"reformtableData"style"width: 100%"show-summary:summary-method"getSummaries"ref"reformtableRef" > <el-table-column label"序号" type"index…

MyBatis查询 ▎修改 ▎删除

前言: 在现代应用开发中&#xff0c;数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架&#xff0c;提供了直接编写 SQL 语句的能力&#xff0c;避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅…

go 使用 gitlab 搭建私有化模块系统

背景 本教程旨在教大家使用私有化部署的 gitlab 作为 go 的代码共享库&#xff0c;帮助团队分离代码模块&#xff0c;加强质量管控。go 官方在实现过程中就高度结合 VCS 系统&#xff0c; 可以仅通过配置相关的环境变量就实现私有库在 VCS 上的搭建。 代码分离样例 这里直接…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写&#xff0c;仅引用 优化后&#xff1a; 把增加生命&#xff0c;减少生命&#xff0c;也可以用在体力里&#xff0c;更改如下 限制浮点&#xff0c;如果血量或体力按10来扣&#xff0c;如果你的血量降低到5&#xff0c;那么就会以5的数值来扣&#xff0c;而不会扣成-5…

JVM极简教程

基础概念 1.1. Java 虚拟机 是运行 Java字节码的虚拟机 1.2. JVM跨平台原理 JVM在不同的系统&#xff08;Linux、Windows、MacOS&#xff09;上有不同的实现&#xff0c;目的是在使用相同的字节码&#xff0c;它们都会给出相同的结果 JVM跨平台本质&#xff1a;不同操作系统…