【计算机网络五】HTTP协议!网站运行的奥秘!

devtools/2024/11/15 1:23:19/

目录

HTTP协议

1.HTTP是什么?

2.Fiddler抓包查看HTTP协议格式

3.HTTP请求

4.HTTP响应


HTTP协议

1.HTTP是什么?

HTTP ( 全称为 " 超文本传输协议 ")   诞生与 1991 . 目前已经发展为最主流使用的一种应用层协议 .
HTTP 的前几个版本均基于传输层的 TCP 协议实现 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 TCP, HTTP3 基于 UDP实现)。目前市面上主要使用的是HTTP1.1和HTTP2.0,最新的HTTP3.0正在完善中,Google/Meta等公司的产品已经开始支持了。
  • 当我们在浏览器中输入一个 搜狗搜索的 "网址" (URL) , 浏览器就给搜狗的服务器发送了一个 HTTP 请求, 搜狗的服务器返回了一个 HTTP 响应.
  • 这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字体等信息).
  • 所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据

 https://i-blog.csdnimg.cn/direct/c968a29e494948478a94bd7bbda18434.png" width="572" />

       前面我已经分享过TCP/IP协议的运行机制,主要是通过IP+Port(地址+端口号)来解决数据在客户端和服务器之间传输路径选择的问题,当我们把数据从A点传输到B点,还需要保证A,B双方都能对数据准确解读,以保证双方对数据的正常使用,这时我们就需要应用层协议了,这也是HTTP协议主要做的事。

2.Fiddler抓包查看HTTP协议格式

Fidder是开发者常用的抓包工具,用来获取HTTP请求和响应。

Fiddler 相当于一个 "代理". 浏览器访问 sogou.com , 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器. 当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器. 因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的.

 https://i-blog.csdnimg.cn/direct/74dc463a72d049ed856e9d09ea18f2dd.png" width="570" />

 下图所示便是Fiddler的主页面:

https://i-blog.csdnimg.cn/direct/356483ee69324fd086a5f1e837043429.png" width="1200" />

 我们能清楚的看到HTTP请求和响应的格式

请求格式:

  • 首行: [方法] + [url] + [版本]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;

响应格式:

  • 首行: [版本号] + [状态码] + [状态码解释]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.

 https://i-blog.csdnimg.cn/direct/5be51007488a44c78022cb029045e7a3.png" width="575" />

 http协议中的空行用来表示请求报头的结束标记。相当于报头和正文的分隔符。

3.HTTP请求

请求方法(Method) 

https://i-blog.csdnimg.cn/direct/5b19f03958044073ad2cc04b5a42983b.png" width="582" />

  • GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。
  • POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面)。
  • PUT POST 相似,只是具有幂等特性,一般用于更新。
  • DELETE 删除服务器指定资源。
  • OPTIONS 返回服务器所支持的请求方法。
  • HEAD 类似于GET,只不过响应体不返回,只返回响应头。
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个。
  • CONNECT 预留,暂无使用。

 

URL的基本格式

URL 的详细规则由因特网标准RFC1738进行了约定,如下所示:

https://i-blog.csdnimg.cn/direct/b206d97fead94a4394d4ffef42e17dd4.png" width="577" />

但是实际上具体的URL网址对有些信息进行了省略。 

https://v.baidu.com/personInf/student?userId=10000&classId=100

 上面是一个具体的URL网址信息。

  • https: 协议方案名. 常见的有 http https, 也有其他的类型. (例如访问 mysql 时用的 jdbc:mysql )。
  • user:pass: 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略。
  • v.baidudu.com: 服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址
  • 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口。
  • /personInf/student: 带层次的文件路径。
  • userId=10000&classId=100: 查询字符串(query string). 本质是一个键值对结构. 键值对之间使 & 分隔. 键和值之间使用 = 分隔.
  • 片段标识: URL 中省略了片段标识. 片段标识主要用于页面内跳转。

在URL中像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

转义的规则如下 : 将需要转码的字符转为 16 进制,然后从右到左,取 4 ( 不足 4 位直接处理 ) ,每 2 位做一位,前面加上% ,编码成 %XY 格式。即URLencode。

 

请求报头(header)

header 的整体的格式也是 " 键值对 " 结构 . 每个键值对占一行. 键和值之间使用分号分割。

下面介绍一些常见的报头种类和含义:

  • Host:表示服务器主机的地址和端口。
  • Content-Length:表示 body 中的数据长度。
  • Content-Type:表示请求的 body 中的数据格式。
  • User-Agent (简称 UA):表示浏览器/操作系统的属性。
  • Referer:表示这个页面是从哪个页面跳转过来的。
  • Cookie:Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)。

4.HTTP响应

响应状态码

HTTP状态码表示访问一个页面的结果 . ( 是访问成功 , 还是失败 , 还是其他的一些情况 ...)。
想必大家肯定遇到访问一个网页结果返回结果是404的情况吧。

 

https://i-blog.csdnimg.cn/direct/85810bd68c394d33b95c0d6fcbd50140.png" width="586" />
  • 200 OK: 这是一个最常见的状态码, 表示访问成功.
  • 404 Not Found:没有找到资源.
  • 403 Forbidden:表示访问被拒绝. 有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易见到 403.
  • 405 Method Not Allowed:前面我们已经学习了 HTTP 中所支持的方法, GET, POST, PUT, DELETE . 但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法).
  • 500 Internal Server Error服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码.
  • 504 Gateway Timeout :当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况.
  • 302 Move temporarily :临时重定向. 在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面.
  • 301 Moved Permanently :永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.301 也是通过 Location 字段来表示要重定向到的新地址.

在网上看到过一幅很形象概括HTTP状态码的图:

 https://i-blog.csdnimg.cn/direct/4d6a4163555f43ff8416c6fd0f47af97.png" width="501" />

响应报头(header)

响应报头的基本格式和请求报头的格式基本一致。
类似于 Content - Type , Content - Length 等属性的含义也和请求中的含义一致。
响应中的 Content-Type 常见取值有以下几种 :
  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

http://www.ppmy.cn/devtools/134047.html

相关文章

NoETL

目录 什么是NoETL NoETL 构建的方法 Data Fabric 的核心理念认为,将所有数据完全集中存储既不现实也不经济,应该通过虚拟化和其他技术手段实现逻辑上的集中管理。这个理念承认了数据分散的现状,提出用新的思路来解决问题,并将其转…

基于微信小程序的校园失物招领系统的设计与实现,LW+源码+讲解

摘 要 校园失物招领系统使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理校园失物招领系统信息,查看校园失物招领系统信息,管理校园失物招领系统。 总之,校园…

UNIX 域套接字

UNIX 域套接字(UNIX Domain Socket,简称 UDS)是一种在同一台机器上的进程间通信(IPC,Inter-Process Communication)机制,允许不同的进程通过文件系统中的特殊文件进行数据交换,而不需…

PCL 点云拟合 基于角度约束的Ransac拟合直线

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 加载点云数据 2.1.2 设置 RANSAC 算法参数 2.1.3 拟合直线模型 2.1.4 提取拟合直线内点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与…

我自己nodejs练手时常用的一些库基础用法

我自己在使用nodejs以及前端实战练习时常用的一些库的基本使用 1.bcrypt //注册账号时,给密码加密 password是前端传过来的密码,hashPassword是存到数据库中的密码 const bcrypt require(bcrypt) const hashPassword bcrypt.hash(password,10) //登…

349. 两个数组的交集

目录 题目解法 题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 解法 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>…

高级java每日一道面试题-2024年11月01日-Redis篇-Redis支持的数据类型有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: Redis支持的数据类型有哪些? 我回答: 在 Java 高级面试中&#xff0c;Redis 的数据类型是一个常见的考点。Redis 是一个高性能的键值存储系统&#xff0c;支持多种数据类型&#xff0c;每种数据类型都有其特定的用途和操作方法。以…

渗透利器-kali工具 (第三章-5) sqlmap之sql注入一、二

一&#xff1a;常见的注入方式 1.sqlmap用于Access数据库注入 2.sqlmap用于Cookie注入  --cookie 3.sqlmap用于Post注入  --froms 、--data、抓包 4.sqlmap用于mysql注入 绕过waf脚本测试&#xff1a;--tamper "space2morehash.py" 常见sqlmap使用方法&#xff1…