HTTP协议揭秘:探寻互联网的背后密码、探秘数据传输的奥秘

news2024/11/18 11:43:05

HTTP(超文本传输协议:Hypertext Transfer Protocol)是一种用于在Web上传输数据的协议,它是互联网上最重要的应用层协议之一。从诞生至今,HTTP一直扮演着连接世界的通信桥梁的角色,在互联网的发展和普及中发挥着重要作用。本文将带您深入了解HTTP协议的起源、工作原理、常见特点以及它对现代Web的影响。

一、起源与发展

HTTP协议最早由蒂姆·伯纳斯-李(Tim Berners-Lee)在1989年创建,作为连接万维网(World Wide Web)上文档的一种通信协议。起初,HTTP的目标是在客户端和服务器之间传输超文本文档(HTML)和超链接(Hyperlink)。随着互联网的蓬勃发展,HTTP也在不断演进和完善。

在1991年,HTTP的第一个正式版本HTTP/0.9问世,其功能非常简单,只能传输纯文本的HTML文档。而后,在1996年,HTTP/1.0发布,引入了更多功能,支持传输多种格式的资源,如图片、样式表和脚本文件。然而,随着Web应用和互联网的规模不断扩大,HTTP/1.0的性能表现出现了瓶颈。为了解决HTTP/1.0的性能问题HTTP/1.1在1997年发布,引入了持久连接、管道化请求、Host头字段等特性,显著提升了网页加载速度和用户体验。

时至今日,HTTP协议持续发展,最新的版本是HTTP/2(2015年发布)和HTTP/3(2022年发布),它们进一步优化了性能、安全性和并行处理能力,逐渐成为主流的HTTP协议版本。

二、工作原理

HTTP是一种无状态的协议,每个请求都是独立的,服务器不保留与之前请求的状态信息。HTTP使用客户端-服务器模式,客户端发送请求,服务器处理请求并返回响应。

HTTP通信过程遵循以下步骤:

  1. 建立连接: 客户端(通常是Web浏览器)向服务器发起TCP连接,并建立起双向通信通道。
  2. 发送请求: 客户端发送HTTP请求到服务器,请求包含请求行(请求方法、URL和HTTP版本)、请求头和请求体(对于POST等有内容的请求)。
  3. 处理请求: 服务器接收并解析请求,根据请求的内容执行相应的操作,可能包括读取数据库、处理业务逻辑等。
  4. 发送响应: 服务器将处理结果封装为HTTP响应,响应包含响应行(状态码、状态文本和HTTP版本)、响应头和响应体。
  5. 关闭连接: 服务器发送完响应后,关闭TCP连接,请求-响应过程完成。

三、特点与影响

HTTP协议具有以下特点,这些特点对现代Web应用和互联网产生了深远的影响:

  1. 无连接和无状态: HTTP是无连接的,每个请求和响应都是独立的。它也是无状态的,服务器不保存客户端的状态信息,每次请求都是无关的,这有利于实现可伸缩性和灵活性。
  2. 灵活性: HTTP的灵活性使得它可以传输各种类型的资源,如文本、图片、视频等,使Web应用呈现丰富多样的内容。
  3. 基于请求-响应模型: HTTP的请求-响应模型使得客户端可以向服务器请求数据或操作,并获取服务器的响应。这种模型促进了客户端与服务器之间的交互和通信。
  4. 分层架构: HTTP的分层架构允许通过代理服务器和缓存来优化网络传输,提高性能和响应速度。
  5. 状态码: HTTP的状态码提供了对请求处理结果的说明,例如200表示成功,404表示未找到,500表示服务器错误等。这些状态码对于诊断和调试Web应用非常有用。

四、协议组成

HTTP协议是一种规范,其样本通常以请求和响应的形式呈现。下面是HTTP协议的一个样本,分别展示了HTTP请求和HTTP响应的格式。

HTTP请求样本:

GET /hanko HTTP/1.1
Host: www.hanko.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
  • 第一行是请求行,包含请求方法(GET)、请求的资源路径(/hanko)和HTTP协议版本(HTTP/1.1)。
  • 接下来是请求头,包含了请求的一些附加信息,如Host(请求的目标主机)、User-Agent(客户端的浏览器信息)、Accept(客户端接受的响应内容类型)等。
当年阿里面试问到了http头connection为keep-alive是什么意思?
当HTTP请求头中的Connection字段设置为keep-alive时,它表示客户端希望与服务器建立持久连接。持久连接允许在同一个TCP连接上发送多个HTTP请求和响应,而不是每个请求都建立一个新的TCP连接,从而减少了连接的建立和关闭开销,提高了性能和效率。
除了keep-alive之外,HTTP请求头中的Connection字段还可以包含其他值,用途如下:
  • close: 当Connection设置为close时,表示客户端或服务器希望在发送完当前的请求和响应后关闭TCP连接,即不使用持久连接。
  • Upgrade: 用于HTTP升级。当Connection设置为Upgrade时,表示客户端希望升级到其他协议,如WebSocket。
  • Connection-Token: 自定义的Connection标记,可以用于传递额外的信息或指示特定的处理方式。

虽然名为"keep-alive",但HTTP的持久连接(keep-alive)并不是真正意义上的一直保持连接。实际上,HTTP的持久连接是一种在单个TCP连接上可以发送多个HTTP请求和响应的机制,从而避免了每次请求都重新建立新的TCP连接,从而减少了连接的建立和关闭的开销。

HTTP响应样本:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: Apache/2.4.41 (Ubuntu)
Date: Wed, 20 Jul 2023 12:34:56 GMT

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is an example page.</p>
</body>
</html>
  • 第一行是响应行,包含HTTP协议版本(HTTP/1.1)、状态码(200)和状态文本(OK)。
  • 接下来是响应头,包含了响应的一些附加信息,如Content-Type(响应内容类型)、Content-Length(响应内容长度)、Server(服务器信息)等。
  • 响应头与响应体之间有一个空行,表示响应头结束,接下来是响应体,即实际返回给客户端的内容。在本例中,响应体是一个简单的HTML页面。

1、请求头

常见的请求头:

  • Host: 指定请求的目标主机名和端口号。
  • User-Agent: 指定发送请求的用户代理,通常是浏览器标识。
  • Accept: 指定客户端可以接受的响应内容类型,如文本、图片、JSON等。
  • Accept-Language: 指定客户端可以接受的自然语言,用于国际化。
  • Authorization: 用于身份验证,包含认证信息。
  • Cookie: 用于在客户端和服务器之间传递会话信息。

2、响应头

常见的响应头:

  • Content-Type: 指定响应内容的类型,如text/html、application/json等。
  • Content-Length: 指定响应内容的长度,单位为字节。
  • Location: 用于重定向,指定新的URL地址。
  • Set-Cookie: 用于在客户端设置Cookie,用于维持会话状态。
  • Cache-Control: 指定响应的缓存策略,如no-cache、max-age等。

3、状态码

HTTP状态码是HTTP协议中用于表示服务器对请求的处理结果的数字代码。状态码由三位数字组成,每个状态码表示不同的处理结果。HTTP状态码主要分为五类,分别以不同的数字开头,每类状态码具有特定的含义。以下是常见的HTTP状态码及其含义:

1xx(Informational): 表示请求已被接收,继续处理。

  • 100 Continue:服务器已接收到请求的头部,并且客户端应继续发送请求的其余部分。

2xx(Successful): 表示请求已成功被服务器接收、理解和处理。

  • 200 OK:请求成功,服务器已成功处理请求。
  • 201 Created:请求成功,并在服务器上创建了新的资源。
  • 204 No Content:请求成功,但响应不包含实体主体内容,用于成功的DELETE请求等。

3xx(Redirection): 表示需要进一步的操作以完成请求。

  • 301 Moved Permanently:请求的资源已永久移动到新的URL,客户端应该使用新URL重新请求。
  • 302 Found:请求的资源已临时移动到新的URL,客户端应继续使用原始URL。
  • 304 Not Modified:客户端通过条件式请求的资源未修改,可直接使用缓存的版本。

4xx(Client Error): 表示客户端发生错误,无法完成请求。

  • 400 Bad Request:请求错误,服务器无法理解请求。
  • 401 Unauthorized:请求需要身份验证,客户端需要提供有效的认证信息。
  • 403 Forbidden:服务器理解请求,但拒绝执行请求。
  • 404 Not Found:请求的资源不存在,服务器未找到请求的URL。

5xx(Server Error): 表示服务器发生错误,无法完成请求。

  • 500 Internal Server Error:服务器内部错误,无法完成请求。
  • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
  • 503 Service Unavailable:服务器暂时不可用,通常由于过载或维护。

4、请求方法

  • GET:用于请求获取指定资源。
  • POST:用于提交数据给服务器,如提交表单数据。
  • PUT:用于更新指定资源的内容。
  • DELETE:用于删除指定资源。
  • HEAD:类似于GET请求,但只获取响应头信息,不获取响应体。
  • OPTIONS:用于获取目标资源支持的通信选项。
  • PATCH:用于对资源进行局部更新。

5、Http版本

HTTP(Hypertext Transfer Protocol)协议经过多次版本的演进和改进,目前主要有以下几个主要版本:

  1. HTTP/0.9: HTTP的最早版本,于1991年发布。它是一个非常简单的协议,仅支持传输HTML文本,没有请求头和响应头,也没有状态码。它主要用于传输超文本文档(HTML)和超链接(Hyperlink)。
  2. HTTP/1.0: 于1996年发布,相比HTTP/0.9,HTTP/1.0引入了请求头和响应头的概念,允许传输多种类型的资源,如图片、样式表和脚本文件。HTTP/1.0的特点是每个请求都需要单独建立连接,导致效率较低。
  3. HTTP/1.1: 于1997年发布,是HTTP协议的一个重要版本。HTTP/1.1引入了持久连接、管道化请求、Host头字段等特性,显著提升了网页加载速度和用户体验。持久连接允许在同一个连接上发送多个请求和响应,避免了每次请求都需要重新建立连接的开销。
  4. HTTP/2: 于2015年发布,是HTTP协议的最新主要版本。HTTP/2进一步优化了性能、安全性和并行处理能力。它引入了二进制协议,允许多个请求和响应同时在同一个连接上传输,消除了请求阻塞的问题。HTTP/2还支持头部压缩和服务器推送等特性,进一步减少了数据传输的开销。
  5. HTTP/3: 最新版本,于2022年6月6日标准化为RFC9114。会抛弃使用TCP,通过UDP上使用QUIC来承载应用层数据。

6、Cookie

HTTP Cookie(简称Cookie)是HTTP协议中的一种机制,用于在客户端(通常是Web浏览器)和服务器之间传递会话信息和状态数据。Cookie主要用于记录用户的一些状态信息,以便服务器在后续请求中识别用户或维持用户的会话状态。

工作原理:

1.服务器设置Cookie: 服务器在HTTP响应中的Set-Cookie头部中设置Cookie信息,并将Cookie发送给客户端。例如:

Set-Cookie: session_id=1234567890; path=/; domain=example.com; expires=Sun, 20-Jul-2025 12:00:00 GMT; secure; HttpOnly

2.客户端保存Cookie: 客户端(Web浏览器)收到服务器设置的Cookie后,会将Cookie保存在本地。在以后的请求中,客户端会在请求头的Cookie字段中携带该Cookie信息。

3.客户端发送Cookie: 客户端在发送HTTP请求时,会将保存的Cookie信息包含在请求头的Cookie字段中,发送给服务器。

4.服务器读取Cookie: 服务器收到请求后,可以从请求头的Cookie字段中读取客户端发送的Cookie信息,并根据其中的数据来识别用户或维持会话状态。

Cookie属性:

Cookie可以包含多个属性,用于指定其行为和有效期。常见的Cookie属性包括:

  • Name和Value: 表示Cookie的名称和对应的值。
  • Domain: 指定Cookie的作用域,指定了哪些域名可以访问该Cookie。
  • Path: 指定Cookie的作用路径,指定了哪些URL路径可以访问该Cookie。
  • Expires和Max-Age: 指定Cookie的有效期,Expires指定一个具体的过期时间,Max-Age指定从当前时间开始的有效期秒数。
  • Secure: 表示Cookie只能通过HTTPS连接传输,用于保证Cookie的安全性。
  • HttpOnly: 表示Cookie仅限于通过HTTP或HTTPS传输,不能被JavaScript等脚本访问,用于防止XSS攻击。

用途:

Cookie在Web应用中有许多用途,其中一些常见的包括:

  • 记录用户的登录状态,实现用户认证和会话管理。
  • 存储用户的个性化设置和偏好。
  • 跟踪用户的浏览行为,用于分析用户行为和推荐相关内容。
  • 在购物网站中,用于保存购物车信息和交易状态。

7、URL长度

URL长度的限制由浏览器规定的,而不是HTTP协议。以下是一些浏览器对http中url长度的限制大小。

当然大家会说我是搞开发的,我不用浏览器那么长度限制吗?比如用apache-httpclient,我试httpclient也同样是有长度限制的,过长就返回400错误了。


如果文章对你有帮助,欢迎关注+点赞,必回关!

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

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

相关文章

数组练习题,数组的动态初始化

数组的遍历 定义一个数组&#xff0c;求和 int[] arr {1,2,3,4,5,6,7};int sum 0;for (int i 0; i <arr.length ; i) {sum sum arr[i];}System.out.println(sum);定义一个数组&#xff0c;统计数组里面一共有多少能够被3 整除的数字&#xff1a; int[] arr1 {4,62,8…

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

JavaScript快速入门&#xff1a;ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中&#xff0c;处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK&#xff0c;开发人员可以利用它创建 PDF 查看器和编辑器&…

了解Unity编辑器之组件篇Playables和Rendering(十)

Playables 一、Playable Director&#xff1a;是一种用于控制和管理剧情、动画和音频的工具。它作为一个中央控制器&#xff0c;可以管理播放动画剧情、视频剧情和音频剧情&#xff0c;以及它们之间的时间、顺序和交互。 Playable Director组件具有以下作用&#xff1a; 剧情控…

数据结构初阶--栈和队列

目录 一.栈 1.栈的定义 2.顺序栈的功能实现 2.1.顺序栈的定义 2.2.顺序栈的初始化 2.3.顺序栈的判空 2.4.顺序栈的入栈 2.5.顺序栈的出栈 2.6.顺序栈的取栈顶元素 2.7.顺序栈的求栈的大小 2.8.顺序栈的销毁 2.9.完整程序 Stack.h Stack.c test.c 二.队列 1.队…

S475支持 ModbusRTU 转 MQTT协议采集网关

6路模拟量输入和2路RS485串口是一种功能强大的通信接口&#xff0c;可以接入多种设备和系统&#xff0c;支持4-20mA输出的传感器以及开关量输入输出。本文将详细介绍6路模拟量输入和2路RS485串口的应用场景和功能&#xff0c;重点介绍其在SCADA、HMI、远程数据监控以及采集控制…

机器学习——样本不均衡学习

1、样本不均衡定义 一般在分类机器学习中&#xff0c;每种类别的样本是均衡的&#xff0c;也就是不同目标值的样本总量是接近的&#xff0c;但是在很多场景下的样本没有办法做到理想情况&#xff0c;甚至部分情况本身就是不均衡情况&#xff1a; &#xff08;1&#xff09;很多…

[洛谷]P2052 [NOI2011] 道路修建(dfs)

在递归过程中也把子节点的贡献&#xff08;以及左右国家数记录下来了&#xff09;。 void dfs(int u,int fa) {d[u]1;//当前节点也算一个 for(int ih[u]; i; ine[i]) {int toe[i];//子节点if(tofa) continue;//防止重复搜索&#xff0c;即防止从下往上搜dfs(to,u);//子节点 //…

基于SSM+JSP+LayUI的宿舍管理系统

修正初始账号密码 默认账号&#xff1a;admin&#xff0c;默认密码&#xff1a;123456修复后台管理头像消失功能相对简单些&#xff0c;可能需要添加一些功能&#xff0c;需要源码免费提供需要运行服务、添加功能等联系我

springboot开放实验室管理系统【纯干货分享,免费领源码03361】

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是使用动态网页开发技术java作为系统的开发语言&#xff0c;M…

如何挑选滚珠螺杆的润滑油脂?

滚珠螺杆在日常使用中&#xff0c;出现卡顿或者噪音等问题&#xff0c;不用担心&#xff0c;不是你的滚珠螺杆出了问题&#xff0c;而是润滑系统出了问题&#xff0c;提醒你应该更换润滑油了。那么&#xff0c;我们应该怎样挑选滚珠螺杆的润滑油呢&#xff1f; 一般建议用轴承润…

hive整合es,详细过程。

参考官网 Apache Hive integration | Elasticsearch for Apache Hadoop [7.17] | Elastic 官网的介绍很简单&#xff0c;我看了很多博客&#xff0c;写的也很简单&#xff0c;但是我搞了半天才勉强成功&#xff0c;分享下&#xff0c;免得各位多走弯路。 环境准备 官网也很…

K8S暴露pod内多个端口

K8S暴露pod内多个端口 一、背景 公司统一用的某个底包跑jar服务&#xff0c;只暴露了8080端口 二、需求 由于有些服务在启动jar服务后&#xff0c;会启动多个端口&#xff0c;除了8080端口&#xff0c;还有别的端口需要暴露&#xff0c;我这里就还需要暴露9999端口。 注&a…

mysql常用时间相关函数

在我们平常开发的工作中&#xff0c;我们在数据库中经常会用到时间相关的函数&#xff0c;比如格式化当前时间&#xff0c;求当前时间或者计算某个特定间隔后的时间&#xff0c;那么我们主要会用到哪些函数呢&#xff1f; 1&#xff1a;求当前时间&#xff1a; select now();…

Gradle build 失败后提示.lock文件,解决办法

在Gradle build失败之后时&#xff0c;有时候强制关闭AndroidStudio&#xff0c;再次打开build时&#xff0c;会提示各种.lock 文件问题&#xff0c;删除了一个还有下一个&#xff0c;而且路径不一样。 一般情况下是这两个文件夹下的lockfile影响继续build %GRADLE_HOME%/ca…

YoLoV7做图像分类/目标检测过程(附代码+详细操作说明)

一、准备数据 图像在my_1imgs中&#xff0c;一个是原图jpg&#xff0c;一个是用labelimg画的标签xml文件。&#xff08;这个画的是一个矩形框&#xff09; 把自己的数据集&#xff08;原图和标签准备好后&#xff09;&#xff0c;这两个文件复制到VOCdevkit中,ImageSets为空。 …

EtherNet/IP转CAN网关can协议标准

生产管理设备中&#xff0c;会有设备与其他设备的协议不同&#xff0c;数据无法互通&#xff0c;让你的工作陷入困境。这时&#xff0c;一款神奇的产品出现了——远创智控YC-EIP-CAN通讯网关&#xff01; 1, 这款通讯网关采用ETHERNET/IP从站功能&#xff0c;可以将各种CAN总线…

vue-simple-uploader的fileAdded方法不支持异步的解决办法,autoStart 设置

每日鸡汤&#xff1a;悲观者可能正确&#xff0c;但是乐观者往往成功 假设有一个需求&#xff0c;上传的pdf文档不得大于10M 使用 vue-simple-uploader 这个插件&#xff0c;我们需要在 fileAdded 事件里面进行校验&#xff0c;在1.0.0版本以后&#xff0c;如果想停止上传&…

如何快速用Python获取短信验证码

在Python中获取短信验证码需要通过调用短信服务接口或者使用短信网关来实现。具体实现方式取决于你使用的短信服务提供商或者短信网关的API。 一般来说&#xff0c;你需要以下步骤来获取短信验证码&#xff1a; 选择短信服务提供商或者短信网关 你需要选择一个合适的短信服务…

vue利用echarts简单实现具有中心节点的知识图谱

效果展示 边缘节点可拖动&#xff0c;其大小可以根据传入的值而变化&#xff08;比如我更喜欢芒果&#xff0c;所以给了芒果更大的权值&#xff0c;在显示的时候芒果所在的节点显示的比例更大&#xff09; 代码下载 https://download.csdn.net/download/David_house/881151…

汉明距离,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

题记&#xff1a; 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0…