f 物联网-【盘算机网络】应用层HTTP协议 - Powered by qidao123.com技术社区

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

打印 上一主题 下一主题

主题 1956|帖子 1956|积分 5868

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

  
接下来我们本身编写一个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。
我们先任意点找一个网页来看看:
  1. 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就是登录信息,我们不管。
可以看到我们在域名后确实看到了端口号。
那么一份资源路径后的?是什么?
我们打开百度试验一下
  1. 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
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>我的网页</title>
  6. </head>
  7. <body>
  8.     <h1>欢迎来到我的网站</h1>
  9.     <p>这是我的网页,我是内容!</p>
  10. </body>
  11.     <a href="register.html">注册</a>
  12.     // 这个地方也可以写成"/register.html",多一个带/的,若是不带,默认会带上/,而这个/就是web根目录
  13. <div>
  14.     <img src="Photos/Screenshot_2024-08-21_210803.png" alt="Big Boat">
  15. </div>
  16. </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状态码进行举例,相信各位小伙伴们也都遇到过。
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>404 - 页面未找到</title>
  7.     <style>
  8.         body {
  9.             font-family: 'Arial', sans-serif;
  10.             background-color: #100e0e;
  11.             color: #333;
  12.             margin: 0;
  13.             padding: 0;
  14.         }
  15.         
  16.         .container {
  17.             max-width: 800px;
  18.             margin: 0 auto;
  19.             text-align: center;
  20.             padding: 50px 0;
  21.         }
  22.         
  23.         h1 {
  24.             font-size: 36px;
  25.             color: #333;
  26.             margin-bottom: 20px;
  27.         }
  28.         
  29.         p {
  30.             font-size: 18px;
  31.             line-height: 1.6;
  32.             margin-bottom: 20px;
  33.         }
  34.         
  35.         .return-home {
  36.             display: inline-block;
  37.             background-color: #007BFF;
  38.             color: #c50e0e;
  39.             text-decoration: none;
  40.             padding: 10px 20px;
  41.             border-radius: 5px;
  42.             transition: background-color 0.3s ease;
  43.         }
  44.         
  45.         .return-home:hover {
  46.             background-color: #0056b3;
  47.         }
  48.     </style>
  49. </head>
  50. <body>
  51.     <div class="container">
  52.         <h1>404 - 页面未找到</h1>
  53.         <p>很抱歉,您访问的页面不存在。</p>
  54.     </div>
  55. </body>
  56. </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构建需要的哀求
连续更新~~~~~~~~~~~~~~~~~~~~~~~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表