【计算机网络】HTTP 协议-1

简介: 【计算机网络】HTTP 协议-1

c83ac8893d9e41c485ed512786d1a27c.gif

前言

前面我们介绍了网络 TCP/IP 五层模型中的各个层,在这五层中,应用层是和我们程序员息息相关的,需要我们程序员写出代码来实现,前面我们只是简单讲了应用层中的自定义协议,虽然自定义协议显得很灵活可以根据需求随时更改,但是在实际生活中自定义的协议使用的还是少数。在应用层中常见的协议就是 HTTP 协议,今天我将为大家分享关于 HTTP 协议相关的知识。

什么是 HTTP

HTTP,全称为超文本传输协议(Hypertext Transfer Protocol),是一种应用层协议,用于在网络中传输超文本(如 HTML)。它是在互联网上应用最为广泛的一种网络协议,所有的www文件都必须遵守这个标准。HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,HTTP客户端通过发送请求获取服务器上的文本信息。HTTP协议工作于TCP/IP协议栈的的应用层,用于从网站的服务器中检索信息,请求被(今后称为被HTTP客户)发送到服务器。

HTTP 诞生于 1991 年,目前已经发展成为最主流的一种应用层协议。从开始的 HTTP 0.9 用于个人/机构主页开始,经过 HTTP 1.0 门户网站和 HTTP 1.1版本用于搜索引擎和社交网络到 HTTP 2.0 ,再到今天的 HTTP 3,HTTP 经过了很多版本的迭代,其中 HTTP 1.1 是我们目前最主要使用的,所以本篇博客我也将以 HTTP 1.1 为例为大家分享关于 HTTP 相关的知识。

HTTP 往往是基于传输层的 TCP 协议实现的(HTTP 1.0、HTTP 1.1、 HTTP 2.0 均为 TCP,HTTP 3基于 UDP 实现)。

我们在平时生活中访问网站就是通过 HTTP 协议来进行数据的传输的。



209c00bdaee3479e8f26fa125fafa5c0.png

当我们在浏览器输入一个百度网址(URL)的时候,浏览器会向百度的服务器发送一个 HTTP 服务器请求,然后百度服务器会返回一个 HTTP 响应。浏览器会将这个响应进行解析,然后就以上面的方式呈现在我们眼前。(这个响应里面包含了 HTML、CSS、JavaScript、图片、文字等信息)

理解 HTTP 请求和响应格式

跟前面的 TCP/IP 协议不同,HTTP 的报文格式需要划分为 请求报文和响应报文 来分析,因为 HTTP 的请求和响应的报文格式是不相同的。

要想学习 HTTP 的请求和响应格式,就需要首先得到 HTTP 的请求和响应数据包,通过前面为大家分享的 HTTP 抓包工具 Fiddler 这个代理工具来抓取到 HTTP 的请求和响应数据包。

HTTP 的请求格式

HTTP 的请求格式大致分为四个部分:首行、请求头(header)、空行、正文(body)

1. 首行

HTTP 的首行分为三个部分,每个部分用空格分隔开。

第一个部分 GET 叫做请求的“方法”(method),方法不止有 GET 还有像 POST 等的方法这里我们先简单知道,后面再为大家详细分享。

第二个部分就是 URL(唯一资源定位符),用来描述一个资源在网络上的位置。URL 不只是在 HTTP 中会使用,URL 在其他很地方也都会用到。

  • 协议方案:这部分定义了网页使用的网络服务类型,例如http或https。
  • 登录信息:用户输入的用户名和密码。现在一般用不到这个了。
  • 服务器地址:这部分定义了网站的域名,例如www.aspxfans.com。在URL中,也可以使用IP地址作为域名。
  • 服务器端口号:这部分定义了主机上的端口号。端口不是URL必须的部分,如果省略端口部分,将采用默认端口。对于 HTTP 请求,端口号默认是 80 端口;对于 HTTPS 协议,端口号默认是 443 端口。
  • 虚拟目录部分:这部分从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。
  • 虽然这里的写法是目录的形式,但是在服务器是不一定是以目录的方式存储资源的。数据可能是硬盘资源,也可能是内存的数据,也可能是通过网路访问其他服务器拿到的数据,还可能是 CPU 计算出来的数据。
  • 查询字符串:这部分包含了一些参数,这些参数可以用来传递一些额外的信息。
  • 查询字符串是以 ?开始的键值对结构的数据,键和值之间用 = 连接,可以有多个键值对,不同的键值对之间使用 & 连接。这个 query string 是程序员自定义的用来补充相关的查询请求,并且这个 query string 也会通过 urlencode 转码。举个例子:我搜索c++,搜索栏中的首行 query string 部分的%2B%2B就是++的转码,因为这些特殊符号可能会与其他标识符产生歧义,经过转码的字符就是用%来标识的。
  • 片段标识符:这部分定义了一个链接到网页的特定部分,通常用于指向页面的特定内容或导航点。

首行中的第三个部分就是 HTTP 的版本号。

2. 请求头

HTTP 请求头是一个键值对结构的数据,里面含有很多的键值对,每个键值对独占一行,键和值之间通过冒号加空格: 连接,并且这些键值对都是属于“标准规定”的,要求我们这样写。这些键值对具体的含义,后面为大家详细介绍。

3. 空行

这里空行是请求头的结束标记。

这里我们看到在抓取到的百度请求数据包的末尾是有一个空行的。这就是请求头的结束标志。

4. 正文(body)

HTTP数据包中的正文(Body)通常指的是请求或响应的消息体,它包含了实际传输的数据内容。在HTTP请求中,正文通常包含了客户端要发送给服务器的数据,例如表单数据、JSON数据等。在HTTP响应中,正文通常包含了服务器返回给客户端的数据,例如HTML页面、JSON数据等。

HTTP正文是由一些字节组成的,可以是任何类型的数据,包括文本、二进制数据等。在HTTP协议中,正文使用Content-Type头部来指定其数据的类型和编码方式。常见的Content-Type类型包括text/html、application/json等。

需要注意的是,HTTP请求和响应的正文是可选的,它们不是每个HTTP数据包都必须包含的部分。如果正文不存在,则请求或响应的消息体将为空。

这里我们抓取到的 HTTP 请求数据包中就没有正文部分。

HTTP 的响应格式

HTTP 的响应数据包也是分为四个部分:首行、响应头(header)、空行、正文(body)。

1. 首行

HTTP 响应报文的首行也是分为三个部分:HTTP 版本号、状态码、状态码描述。

  • HTTP 版本号:描述了该 HTTP 响应报文用的是哪个 HTTP 版本。
  • 状态码:描述了服务器对客户端请求的处理结果。状态码分为5类,每一类有不同的意义。


  • 状态码描述:状态信息是对应状态码的简单文字描述,它向客户端提供了可以理解的、对应状态码的文字描述。例如,“OK”对应状态码200,“Not Found”对应状态码404,“Internal Server Error”对应状态码500等。

2. 响应头

这里的响应头也是一些键值对,键和值之间通过冒号和空格: 连接,每个键值对独占一行,并且这些键值对也是“标准规定”的。

3. 空行

这里的空行也是响应头的结束标志。

4. 正文(body)

这里的正文和 HTTP 请求报文的正文是类似的。

首行

首行中的 method 方法有很多种。

虽然请求中的方法有很多,但是 GET 和 POST 这两个方法的使用占了日常使用的八成,所以这篇文章我们主要学习 GET 和 POST 这两种方法。

GET 和 POST 方法有什么区别

GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求。另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求。GET 请求会将要传给服务器的数据加到 URL 的 query string 中。POST 方法多用于提交用户输入的数据给服务器(例如登陆页面)。

POST 方法则会将要传给服务器的数据放入到正文(body)中。

但是不一定 GET 方法要传给服务器的数据就一定放在 query string 中不能放在 正文(body)中,GET 方法的传输给服务器的数据也是可以放在 正文(body)中的,只要客户端和服务端都遵守相同的规则就可以了,虽然 GET 方法的传给服务器的数据可以放在正文(body)中,但还是建议大家放在query string 中。

这里我在导航栏输入 www.baidu.com 的时候,其实就是发送的 GET 方法的请求。

而我登录 gitee 的时候就是 HTTP 发送的 POST 方法的请求数据包。

但是有时候也会出现 Fiddler 没有抓取到 HTTP 数据包的情况,就是当我多次访问一个网站的时候,可能就不会抓取到这个 HTTP 请求数据包,这是为什么呢?这是因为刚刚的这个访问网站的请求命中了浏览器的缓冲,当发生这种情况的时候,其实浏览器不会向服务器发送 HTTP 请求。

浏览器显示的网页其实都是从服务器这里下载的 HTML,因为 HTML 的内容可能会很多,体积比较大,通过网络加载的话,消耗的时间就会很多,所以为了加快访问速度,浏览器会有自己的缓存,将之前加载过的页面,保存在本地硬盘中,当下次访问这个网站的时候就可以直接从本地磁盘读取数据,所以也就会导致本次访问不会向服务器发送 HTTP 请求数据包。

假设我要上传一个文件的时候,那么此时就会向服务器发送一个 POST 方法的请求数据包,并且这个数据包的正文部分是这样的。

这种就是,图片本来是二进制数据,当把图片这个二进制数据放入 HTTP 请求的时候,往往需要进行 base64 转码,base64 转码就是针对二进制数据进行重新编码,确保编码之后的数据就是纯文本的数据。

这些 HTTP 请求的初心就是为了表示不同的“语义”,但是在实际的使用过程中,这出初心已经渐渐被遗忘了,这些方法的使用更加随意了,所以就导致现在的 GET 和 POST 方法实际上是没有任何区别的。

【计算机网络】HTTP 协议-2:https://developer.aliyun.com/article/1430648


相关文章
|
10天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
37 1
|
3天前
|
存储 网络协议 Linux
|
3天前
|
安全 SDN 数据中心
|
4天前
|
网络协议 安全 网络性能优化
|
10天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
29 1
|
14天前
|
缓存 网络协议 数据库连接
【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点
【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点
8 0
|
17天前
|
运维 监控 算法
slb监听协议http
SLB的HTTP监听器用于处理HTTP请求,配置时选择协议类型为HTTP和前端端口(如80)。SLB根据负载算法将请求转发至健康后端服务器,并支持会话保持。通过`X-Forwarded-For`和`X-Forwarded-Proto`头处理请求信息。由于不涉及SSL/TLS,数据传输不安全,推荐升级至HTTPS以加密通信。SLB提供性能监控和故障排查工具,帮助运维管理。
18 5
|
20天前
|
程序员
深入理解HTTP协议本质与应用
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。简单来说,如果你不懂HTTP协议,那就相当于是个只有“半桶水”的程序员。在这个课程中,带你一起花最少的时间,用最少的精力,掌握最多、最全面、最系统的HTTP相关知识
13 3
深入理解HTTP协议本质与应用
|
21天前
|
Shell Linux 网络安全
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
28 0
|
21天前
|
Shell Linux Apache
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
154 1