HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网数据通信的基础。
HTTP定义了客户端和服务器之间如何交换数据,如何表示请求和响应,如何处理错误等。
HTTP的主要特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议在网络中传送数据主要有两个版本,即HTTP1.1和HTTP2.0,其中HTTP2.0是最新的版本,它在性能上有了很大的提升,如支持服务器推送、头信息压缩等。
HTTP是互联网的多媒体信使
上面说了HTTP协议定义了客户端和服务器之间如何交换数据的规则。当在浏览器中输入一个URL并按下回车键时,浏览器(作为客户端)会向服务器发送一个HTTP请求。服务器接收到请求后,会返回一个HTTP响应,其中包含请求的网页内容,这些内容可能包括文本、图像、视频、音频等多种媒体类型的数据。
因此,HTTP是互联网的多媒体信使,它使得我们可以在网上浏览网页、观看视频、听音乐、下载文件等。
HTTP的客户端和服务端
Web内容是存在Web服务器的。Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。服务器存储了互联网中的数据,如果HTTP客户端发出请求的话,它们会提供数据。HTTP客户端和HTTP服务器共同构成互联网的基本组件。
最常见的HTTP客户端是Web浏览器。比如谷歌浏览器或者微软的Internet Explorer。
Web资源
Web服务器是Web资源的宿主。Web资源是Web内容的源头。最简单的Web资源是Web文件系统中的静态文件。这些文件可以是文本文件、HTML文件、Word文件、JPEG文件等所有其它能想到的文件。
资源不一定是静态的,资源还可以是根据需要生成内容的软件程序。
资源的媒体类型
互联网有数以千计的不同的数据类型或资源,HTTP仔细的给每种要通过Web传输的对象都打上了名为MIME类型的数据格式标签。
MIME类型是一种文本标记,标识一种主要的对象类型和一个特定的子类型,中间由一条斜杠(/)来分割。
- text/html:HTML文件
- text/plain:纯文本文件
- text/css:CSS样式表文件
- application/javascript:JavaScript文件
- image/jpeg:JPEG图像文件
- image/png:PNG图像文件
- image/gif:GIF图像文件
- application/pdf:PDF文件
- application/msword:Microsoft Word文件
- application/vnd.ms-excel:Microsoft Excel文件
- application/vnd.ms-powerpoint:Microsoft PowerPoint文件
- audio/mpeg:MPEG音频文件
- audio/x-wav:WAV音频文件
- video/mp4:MP4视频文件
- application/json:JSON数据格式
- application/xml:XML数据格式
大多数浏览器都可以处理百种常见的对象类型:图片文件、HTML文件、音频文件、其它类型。
URI
URI,全称为统一资源标识符(Uniform Resource Identifier),是用于标识互联网上资源的一个字符串。这个字符串的格式由一系列的规定和标准定义,使得它可以唯一地标识网络上的资源。
URI的常见形式包括URL(统一资源定位符)和URN(统一资源名称)。URL提供了找到某个资源的位置和访问该资源的方法,例如 "www.example.com"。
URN则是资源的唯一名称,在资源移动后仍然有效,但在实际中使用较少。
URI的一般格式如下:
scheme:[//authority]path[?query][#fragment]
其中:
- scheme:定义了该URI的类型或协议,例如http、ftp、mailto等。
- authority:通常包含了提供该资源的服务器的信息,如服务器的名称和端口号。
- path:资源在服务器上的具体位置。
- query:发送给服务器的额外信息,通常以键值对的形式出现。
- fragment:指向资源内部的一部分,例如HTML文档中的一个特定段落。
例如,在URI "www.example.com/path/to/res...
URL
URL(Uniform Resource Locator,统一资源定位符)是互联网上用来标识某一处资源的地址。它是互联网标准的一部分,定义在RFC 1738中。
一个URL的结构通常包括以下几个部分:
- 协议(或称为服务类型):例如http、https、ftp等。
- 主机名:例如www.google.com。
- 端口号:例如80(http的默认端口),443(https的默认端口)。如果URL中没有指定端口号,那么就使用协议的默认端口。
- 路径:表示资源在服务器上的具体位置。例如/search。
- 查询字符串:以问号开始,用于传递给服务器的参数。例如?q=hello。
- 片段:以井号开始,表示网页中的一个位置。例如#section1。
以下是一个URL的示例:
ini
https://www.google.com/search?q=hello#section1
在这个URL中,协议是https,主机名是www.google.com,路径是/search,查询字符串是?q=hello,片段是#section1。
URL是互联网上定位和获取资源的主要方式。
URL和URI区别
URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)都是用来标识资源的字符串。它们之间的关系和区别可以通过以下几点来理解:
-
所有的URL都是URI,但并非所有的URI都是URL。这是因为URI还包括一个子类叫做URN(Uniform Resource Name),它用于为资源提供唯一的名称,而不需要指明如何定位这个资源。
-
URI是一个更为通用的概念,它可以用来标识任何东西,不仅仅是网络上的资源。例如,
mailto:john@example.com
是一个URI,它标识了一个电子邮件地址,但它不是URL,因为它没有指明如何通过网络获取这个资源。
总的来说,URL和URI都是用来标识资源的,URL提供了获取资源的位置信息,URI则是一个更为广泛的概念,包括URL和URN。在实际使用中,由于URN的使用并不广泛,所以URL和URI常常被混用。
HTTP事务
HTTP事务是指客户端和服务器之间的一次完整的请求和响应过程。
在一个典型的HTTP事务中,客户端(通常是浏览器)首先会向服务器发送一个HTTP请求。这个请求包含了请求方法(如GET、POST等)、请求的URI(统一资源标识符,即URL)、HTTP版本,以及可能包含的请求头部和请求体。
服务器收到请求后,会解析请求,然后根据请求的内容来决定如何响应。服务器会返回一个HTTP响应,这个响应包含了HTTP版本、状态码(如200表示成功,404表示未找到等)、响应头部和响应体。
以下是一个简单的HTTP事务
- 客户端发送请求
vbnet
GET /index.html HTTP/1.1
Host: www.example.com
- 服务器返回响应
less
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
Hello, world!
</body>
</html>
例子中客户端发送了一个GET请求,请求获取www.example.com的首页。服务器返回了一个200 OK的响应,响应体是一个简单的HTML文档。
请注意,HTTP事务是无状态的,这意味着服务器不会在两个事务之间保留任何信息。如果一个事务需要知道前一个事务的结果,那么这个信息需要以某种方式(如Cookie或者Session)在事务之间进行传递。
HTTP方法
HTTP协议定义了多种请求方法,用于表示对指定资源的不同操作。常见的HTTP方法包括
- GET:请求获取指定资源。GET请求应该只用于获取数据,而不应该产生任何副作用。
- POST:向指定资源提交数据,通常会导致服务器上的状态变化或副作用。
- PUT:用请求的主体部分来更新指定的资源。
- DELETE:请求删除指定的资源。
- HEAD:类似于GET,但服务器在响应中只返回头部,不返回实体的主体部分。
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。
- PATCH:对资源进行部分修改。
- CONNECT:用于建立网络隧道。
- TRACE:进行消息回路测试。
在跨域请求的上下文中,HTTP请求可以被分为简单请求和复杂请求(也被称为预检请求)。
简单请求满足以下条件:
- 使用GET、HEAD或POST方法。
- 除了被用户代理自动设置的头部(例如Connection,User-Agent,或者Fetch规范定义的其他头部),只能设置以下头部:Accept,Accept-Language,Content-Language,Content-Type(需要注意额外的限制)。
- Content-Type的值只能是以下三者之一:application/x-www-form-urlencoded,multipart/form-data,text/plain。
- 请求中的任何XMLHttpRequestUpload 对象均没有注册任何事件监听器;也就是说,请求中没有使用 ReadableStream 对象。
不满足以上条件的请求被视为复杂请求。复杂请求会触发预检请求(pre-flight request),即在实际请求之前,浏览器会先发送一个OPTIONS请求,询问服务器对于实际请求的方法和头部有哪些限制。
HTTP状态码
HTTP状态码是由三位数字和一个可选的原因短语组成,用于表示HTTP请求的响应状态。根据第一个数字,HTTP状态码可以分为五类
-
1xx(信息响应):表示请求已被接收,需要继续处理。这类状态码是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。例如,100(Continue)表示客户端应继续其请求。
-
2xx(成功):表示请求已成功被服务器接收、理解、并接受。例如,200(OK)表示请求成功。
-
3xx(重定向):表示需要进一步操作以完成请求。通常,这些状态码用来重定向或者有缓存的情况。例如,301(Moved Permanently)表示请求的资源已被永久移动到新位置。
-
4xx(客户端错误):表示请求包含语法错误或无法完成请求。例如,404(Not Found)表示请求的资源在服务器上不存在。
-
5xx(服务器错误):表示服务器在处理请求的过程中发生了错误。例如,500(Internal Server Error)表示服务器遇到错误,无法完成请求。
这些状态码的目的是让客户端知道其请求的处理状态,以便可以采取适当的操作。
HTTP报文
HTTP报文是在HTTP协议中用于交换数据的基本单位,包括请求报文和响应报文。每个HTTP报文都包含三个部分:起始行、头部和主体。
-
起始行:对于请求报文,起始行包含HTTP方法(如GET、POST等)、请求的URI和HTTP版本。对于响应报文,起始行包含HTTP版本、状态码和状态文本。
-
头部:头部由一系列的头部字段组成,每个字段由一个名字和一个值组成,用冒号分隔。头部字段用于传递关于报文的元数据,如内容类型、内容长度、认证信息等。
-
主体:主体包含了实际的数据,如HTML文档、JSON数据等。主体是可选的,一些请求和响应(如GET请求和204 No Content响应)可能没有主体。
一个HTTP请求报文示例
makefile
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
例子中,起始行是GET /index.html HTTP/1.1
,表示这是一个GET请求,请求的URI是/index.html,使用的HTTP版本是1.1。头部包含了两个字段:Host和User-Agent。这个请求没有主体。
一个HTTP响应报文示例
less
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 137
<html>
<body>
Hello, world!
</body>
</html>
例子中,起始行是HTTP/1.1 200 OK
,表示这是一个HTTP/1.1的响应,状态码是200,状态文本是OK。头部包含了两个字段:Content-Type和Content-Length。主体是一个简单的HTML文档。
HTTP连接
HTTP(超文本传输协议)通常通过TCP/IP协议进行连接。当在浏览器中输入一个URL并按下回车键时,浏览器会向DNS服务器请求该URL的IP地址,然后浏览器会通过TCP/IP协议向该IP地址发送一个HTTP请求。服务器接收到请求后,会处理请求并返回一个HTTP响应,响应中包含请求的网页内容。这个过程就是HTTP通过TCP/IP协议进行连接的过程。
TCP/IP
TCP/IP是一种计算机网络通信协议,是Internet最基本的协议,也是网络中最普遍使用的协议。
TCP/IP实际上是一组协议的集合,其中TCP(Transmission Control Protocol,传输控制协议)和IP(Internet Protocol,网际协议)是最主要的两个协议。
IP协议负责将数据包发送到正确的地址。每个连接到网络的设备都有一个唯一的IP地址,这个地址就像邮寄地址一样,使得数据能够被送到正确的设备。
TCP协议则负责在数据传输过程中保证数据的完整性。它会将数据分割成多个小的数据包进行发送,并在接收端将这些数据包重新组装成完整的数据。如果在传输过程中有数据包丢失,TCP协议会要求重新发送丢失的数据包,从而确保数据的完整性。
因此,TCP/IP协议是互联网上数据传输的基础,它使得我们可以在网络上浏览网页、发送电子邮件、下载文件等。
IP地址和端口号
IP地址和端口号在HTTP通过TCP/IP连接中发挥着非常重要的作用。
-
IP地址:IP地址是互联网上每个设备的唯一标识,就像我们的住址一样。当在浏览器中输入一个URL并按下回车键时,浏览器会向DNS服务器请求该URL的IP地址,然后浏览器会通过TCP/IP协议向该IP地址发送一个HTTP请求。
-
端口号:端口号是用来区分一台设备上的不同服务的。一台服务器上可能同时运行着多个服务,比如HTTP服务、FTP服务、数据库服务等,这些服务不能共享一个端口,所以需要端口号来区分。HTTP服务通常使用80端口,HTTPS服务通常使用443端口。
在HTTP请求中,浏览器会向服务器的特定IP地址和端口号发送请求,服务器收到请求后,会根据端口号将请求转发到对应的服务处理,然后返回响应。
协议版本
HTTP协议有以下几个主要的版本
-
HTTP/0.9:这是HTTP协议的最早版本,于1991年发布。它非常简单,只支持GET方法,且没有头部、状态码等概念。
-
HTTP/1.0:这个版本于1996年发布,相比HTTP/0.9有了很大的改进。它引入了新的请求方法(如POST和HEAD),支持响应状态码,增加了HTTP头部的概念,允许传输除HTML以外的其他文件类型。
-
HTTP/1.1:这个版本于1997年发布,是目前最广泛使用的版本。它引入了持久连接(也称为连接复用),允许在一个TCP连接中发送多个请求和响应,从而提高了传输效率。它还引入了其他一些重要的特性,如分块传输编码(允许发送方在发送全部数据之前开始传输)、内容协商(允许客户端和服务器协商选择最合适的内容格式)等。
-
HTTP/2:这个版本于2015年发布,目标是提高性能。它引入了多路复用(允许在一个TCP连接中同时传输多个请求和响应)、服务器推送(允许服务器主动向客户端发送数据)、头部压缩(减少了头部的大小)等特性。
-
HTTP/3:这个版本目前还在开发中,计划使用QUIC协议替代TCP,以解决HTTP/2中的一些问题,如队头阻塞(当一个请求的处理被阻塞时,会影响同一个连接中的其他请求)。
每个版本的HTTP协议都在前一个版本的基础上进行了改进和优化,以适应互联网的发展和变化。
HTTP的Web结构组件
这里主要说下常见的Web结构组件:代理、缓存、网关、隧道和Agtent代理。
-
HTTP代理:HTTP代理是位于客户端和服务器之间的中间实体,客户端的请求会先发送到代理服务器,由代理服务器再转发给目标服务器,并将服务器的响应返回给客户端。代理可以用于多种目的,如提供缓存服务、过滤内容、负载均衡、隐私保护等。比如nginx就是HTTP代理的一种。
-
HTTP缓存:HTTP缓存是一种机制,可以存储HTTP响应的副本,并在后续的请求中重用这些副本,以减少网络流量和减少服务器的负载。HTTP协议定义了多种缓存控制机制,如Expires头、Cache-Control头、ETag头、Last-Modified头等。
-
HTTP网关:HTTP网关类似于代理,但它提供了协议转换功能。例如,一个HTTP到SMTP的网关可以接收HTTP请求,并将其转换为SMTP请求发送给SMTP服务器。网关通常用于连接不同的网络或协议。
-
HTTP隧道:HTTP隧道是一种封装技术,可以在HTTP连接中传输非HTTP流量。通过隧道,客户端可以建立一个虚拟的"直接连接"到目标服务器,而无需理解中间网络的细节。隧道常用于处理安全连接(如SSL)或者绕过防火墙。
-
Agent代理:在HTTP中,"Agent"通常指的是用户代理(User Agent),它是发起HTTP请求的客户端程序,如浏览器、爬虫等。用户代理会在每个HTTP请求的User-Agent头中发送一些关于自己的信息,如名称、版本、操作系统等。
总结
对于Web开发来说,HTTP就是基础设施,因此学习HTTP是非常必要的。本文重点整理了HTTP的常用知识点,包括HTTP的定义、作用、特点和协议版本变化。具体介绍了HTTP的资源、事务、报文、连接和常见结构组件。
在日常的Web开发中,很多场景都涉及到了HTTP知识点
- 媒体类型方面,下载资源时需要修改下载资源的MIME类型
- 使用浏览器访问页面一直都在用URL
- HTTP事务是无状态的,所以如果一个事务需要知道前一个事务的结果,那么这个信息需要以某种方式(如Cookie或者Session)在事务之间进行传递
- 日常跨域请求就是HTTP的复杂请求
- 每个Web程序员都需要处理好错误,返回给前端的状态码,前端程序员根据状态码处理错误
- HTTP报文会涉及到缓存等
- 前端和后端联调的媒介是IP地址或者IP地址加端口号
- 协议版本HTTP2.0引入的多路复用(允许在一个TCP连接中同时传输多个请求和响应)、服务器推送(允许服务器主动向客户端发送数据)、头部压缩(减少了头部的大小)等特性,可以明显改善浏览器网页性能
- 代理、缓存、网关、隧道和Agtent代理,在日常开发中都或多或少涉及过
本文完。
参考书籍
《HTTP权威指南》