HTTP 协议详解

news/2024/6/18 21:13:13 标签: http, 网络, 服务器
http://www.w3.org/2000/svg" style="display: none;">

HTTP 协议全称为 Hypertext Transfer Protocol,即超文本传输协议,是互联网上应用最为广泛的一种网络传输协议。HTTP 协议定义了客户端(Browser)与服务器之间的通信规范,以实现对各种资源(如 HTML 页面、图像、音频、视频等)的传输和访问。本文将全面详细的描述 HTTP 协议的相关内容,包括协议的基本概念、请求响应流程、报文结构、状态码、安全性等方面。

一、HTTP 协议基本概念

HTTP 协议是一个无状态的应用层协议,即不会保存客户端与服务器之间的历史记录,每个请求都是独立的。其主要特点如下:

1.1 基于请求响应模式

HTTP 协议采用客户端-服务器架构模式,客户端向服务器发送请求,服务器返回相应的响应。这种模式可以有效分离应用逻辑,提高系统的可维护性和扩展性。

1.2 基于文本传输

HTTP 协议使用 ASCII 码作为通信协议,每个请求和响应都是一条文本消息。这种方式可以使通信协议更加简单、直观、易于处理。

1.3 支持多媒体传输

HTTP 协议可以传输多种类型的数据,如 HTML、XML、JSON、图片、音频、视频等。这使得 HTTP 协议成为一种通用的网络传输协议,适用于各种不同类型的应用场景。

1.4 无连接

HTTP 协议是一个无连接协议,每个请求都是独立的,服务器处理请求后立即关闭连接。这样可以节省资源,但也带来了一些缺点,如需要重新建立连接、重复发送相同的头部信息等。

二、HTTP 请求响应流程

HTTP 协议的请求响应流程如下图所示:

https://img-blog.csdnimg.cn/b1cc1a3ac26344e39219a27a61827cbd.webp" alt="在这里插入图片描述" />

2.1 客户端向服务器发送请求

当我们在浏览器地址栏中输入网址时,浏览器会向服务器发送 HTTP 请求,请求文本格式如下:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

其中,第一行请求行包括请求方法、请求 URL 和 HTTP 协议版本信息;第二行起的若干行为请求头(Header),用于告知服务器一些额外的信息,如客户端类型、支持的内容格式、是否支持压缩等。如上面的例子中,请求方法为 GET,请求 URL 为 /index.html,HTTP 版本为 1.1。

2.2 服务器处理请求

服务器接收到客户端请求后,会按照一定的算法进行处理,生成请求的资源,并将其封装在一个 HTTP 响应报文中返回给客户端。响应报文分为首部和主体两部分,其中首部用于描述响应的各种属性信息,包括响应码、内容类型、过期时间、缓存控制等信息;主体则是响应的实体内容。响应文本格式如下所示:

HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 1234 (Number of bytes in the response body)
Connection: close   // 表示连接关闭

<!DOCTYPE html>
<html>
<head>
    <title>Example Website</title>
</head>
<body>
    <h1>Welcome to Example Website!</h1>
    <p>This is an example website created for demonstration purposes.</p>
</body>
</html>

其中,第一行为状态行,指定了 HTTP 响应状态码(200 表示成功)和对应的状态信息(OK);第二行起的若干行为响应头,包括内容类型、内容编码、长度和连接方式等;最后是响应主体,即服务器返回的实体内容。

三、HTTP 报文结构

HTTP 报文分为请求报文和响应报文两种类型,它们的格式如下所示:

3.1 请求报文格式

Request-Line
(headers)
CRLF
[message-body]

其中,Request-Line 包括请求方法、请求 URL 和 HTTP 协议版本;headers 为若干个头部信息;CRLF 表示换行符;message-body 为可选项,用于存放请求主体内容。

例如,以下是一个请求报文示例:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

name=John&age=30

3.2 响应报文格式

Status-Line
(headers)
CRLF
[message-body]

其中,Status-Line 包括 HTTP 状态码和状态信息;headers 为若干个头部信息;CRLF 表示换行符;message-body 为可选项,用于存放响应主体内容。

例如,以下是一个响应报文示例:

HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 1234 (Number of bytes in the response body)
Connection: close   // 表示连接关闭

<!DOCTYPE html>
<html>
<head>
    <title>Example Website</title>
</head>
<body>
    <h1>Welcome to Example Website!</h1>
    <p>This is an example website created for demonstration purposes.</p>
</body>
</html>

四、HTTP 状态码

HTTP协议定义了多种不同的状态码,每个状态码都表示服务器对请求的响应状态。以下是HTTP协议常见的状态码:

  1. 1xx(信息性状态码):表示请求已经被接收,继续处理。
  2. 2xx(成功状态码):表示请求已经被成功接收、理解和处理。
  3. 3xx(重定向状态码):表示需要进行额外操作才能完成请求。
  4. 4xx(客户端错误状态码):表示客户端发送的请求有误,服务器无法处理。
  5. 5xx(服务器错误状态码):表示服务器在处理请求时发生了错误。

例如,200状态码表示请求成功,404状态码表示请求的资源不存在,500状态码表示服务器内部错误。

HTTP协议的持久连接

在HTTP/1.0中,每个请求都需要建立一个新的TCP连接。这样做会使得每个请求都需要经过三次握手和四次挥手的过程,增加了网络通信的开销。

为了减少网络通信的开销,HTTP/1.1引入了持久连接(Persistent Connections)。使用持久连接,在同一个TCP连接上可以发送多个请求和响应,避免了频繁建立和关闭连接的开销。

当客户端发送一个请求时,服务器会在响应头中添加Connection: keep-alive字段,表示该连接是一个持久连接。客户端收到响应后会将该连接保持打开状态,直到收到服务器返回Connection: close字段或者发生超时等异常情况才会关闭连接。

当客户端发送下一个请求时,可以继续使用之前的TCP连接,避免了重新建立连接的开销。此外,持久连接还支持管道化(Pipeline)技术,即在同一个TCP连接上可以同时发送多个请求而不需要等待前面的响应返回,从而进一步提高了网络传输效率。

HTTP协议的安全性

HTTP协议是明文传输的,即所有的请求和响应都是以明文形式传输的。这意味着在传输过程中可能会被窃听、篡改或者伪造。

为了解决HTTP协议的安全问题,HTTPS协议应运而生。HTTPS协议是在HTTP协议的基础上添加了SSL/TLS协议,通过加密和认证技术来保证数据的安全性。

使用HTTPS协议时,客户端和服务器之间的所有通信都是经过加密的,第三方无法窃听或篡改。此外,HTTPS还支持证书认证,可以验证服务器的身份,防止伪造和中间人攻击。

HTTP协议的缺陷

虽然HTTP协议在Web通信中扮演着重要的角色,但它也存在一些缺陷:

  1. HTTP协议是明文传输的,容易被窃听、篡改或者伪造。

  2. HTTP协议的请求/响应模型中,每个请求都需要建立一个新的TCP连接,增加了网络通信的开销。

  3. HTTP协议只能进行简单的身份认证,如基本认证和摘要认证等。这种认证方式容易受到攻击,无法提供足够的安全保障。

  4. HTTP协议缺乏对请求和响应的完整性校验,使得无法保证数据的完整性,容易受到篡改。

  5. HTTP协议对于大数据传输的支持不够友好,容易导致网络拥塞和传输效率低下。

针对上述问题,HTTP/2协议做了很多优化。HTTP/2协议使用二进制格式代替文本格式,支持服务器推送、头部压缩、流控等功能,从而提高了网络传输效率和安全性。


http://www.niftyadmin.cn/n/304274.html

相关文章

看板项目管理:如何可视化工作以提高生产力?

如果你一直关心优化工作流程&#xff0c;提高你或团队的生产力&#xff0c;你肯定听说过看板这个词。 看板是一种工作管理方法&#xff0c;可以将整个工作流程以及构成工作流程的每个单独活动可视化&#xff0c;从而可以识别瓶颈和优化整体流程。 在这方面&#xff0c;看板的…

车联网强势发展下,有什么隐患?

通过新一代信息通信技术&#xff0c;车联网实现了汽车与云平台&#xff0c;车辆和汽车&#xff0c;道路&#xff0c;汽车和人以及内部的全方位网络链接。车联网使用传感器技术感知车辆的状态信息&#xff0c;并利用无线通信网络和现代智能信息处理技术的帮助实现交通智能化管理…

【Linux】Keepalived+Haproxy实现数据库集群负载均衡

1、简介&#xff1a; 本文章的负载均衡和高可用是体现在两个从服务器上的。一般来说高可用是用在主服务器中的&#xff0c;例如双主多从的结构&#xff0c;双主做keepalived的高可用&#xff08;当然也可以加上haproxy做负载均衡&#xff09;&#xff0c;多从做haproxy的负载均…

MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》 学完了记录结构&#xff0c;我们该学数据页的结构&#xff0c;前边我们简单的提了一下页的概念&#xff…

C语言头文件

头文件是C程序中用于包含函数、变量、类和其他程序元素的文件。以下是一些常见的头文件及其用途&#xff1a; 1. iostream&#xff1a;用于输入输出流操作&#xff0c;如cin和cout。 2. cmath&#xff1a;用于数学计算&#xff0c;如sin、cos、sqrt等。 3. cstdlib&#xff…

【细读Spring Boot源码】@ComponentScan是如何生效的?

前言 在使用SpringBoot使用过程中 RestController、Service、Repository这几个注解类上都标有Component注解 启动类上标有的SpringBootApplication注解类上有个ComponentScan注解。那么ComponentScan如何把相关的对象注册到BeanFactory的&#xff1f; 找到处理ComponentScan注…

【Java校招面试】基础知识(八)——Linux服务器

目录 前言一、基础概念二、常用命令后记 前言 本篇主要介绍Linux服务器的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第八篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xff0c;返回…

RabbitMQ启动失败的一系列尝试

一. 背景 在三台 CentOS 7.x上部署了RabbitMQ集群&#xff0c;如下&#xff1a; 服务器IPhostname节点说明端口管控台地址192.168.31.101masterrabbitmq master5672http://192.168.11.71:15672192.168.31.102slave1rabbitmq slave5672http://192.168.11.72:15672192.168.31.10…