作为开发人员,每天都在使用HTTP协议,但是否详细了解过一下该协议的构成及特性吗?本文就带大家全面的梳理一下。先来看一下本篇文章涉及到的知识点脑图。脑图原文件可在公众号【程序新视界】内回复“http”获得。下面,看具体关于HTTP协议的介绍。
HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。
HTTP协议基本格式:
协议://服务器IP:[端口]/路径/[?查询]
1999年6月公布的RFC 2616定义了HTTP协议中现今广泛使用的HTTP 1.1。HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。
HTTP协议概述
HTTP是一个客户端与服务器端请求应答的标准(TCP)。可通过浏览器或者其它的工具,发起一个HTTP请求到服务器上指定端口(默认:80)。
HTTP协议广泛应用于TCP/IP协议之上,但并非必须使用TCP/IP协议。HTTP假定下层协议可靠传输,因此能够保证这一要求的协议都可被使用。
HTTP协议数据是明文传输,不安全,可基于HTTPS进行加密处理,通常使用SSL/TLS协议进行加密。
基本使用流程:客户端发起HTTP请求,创建到指定服务器(端口)的TCP连接。服务器监听对应端口(默认80端口),接收并处理请求,返回状态码(比如:"HTTP/1.1 200 OK")、内容、错误消息或其他信息。
HTTP协议特性
HTTP是无状态的
HTTP协议是无状态(stateless)协议。每次请求都是相互独立的,不会对请求或响应做持久化处理。好处:可以更快地处理大量事务、确保协议的可伸缩性。
针对业务需要,可引入了Cookie(HTTP 1.1)和Session技术,用于管理状态。
多次HTTP请求
针对一个网页,并不是一次请求完成。客户端首先响应的是HTML页面,然后再加载其他资源(CSS、JS、图片等)。HTTP 2.0 支持管道机制,可以同时请求和响应多个请求,大大提高了效率。
无连接
HTTP 1.0每次连接只处理一个请求。服务器处理完客户的请求,收到客户的应答后,即断开连接。目的是节省传输时间、提高并发性能。
HTTP 1.1 会等待一段时间,如无后续请求则断开,否则继续使用。目的是提高效率,减少短时间内建立连接的次数。
基于TCP协议
HTTP协议的目标是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。大多数底层是基于TCP实现。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。
HTTP工作流程
客户端向服务器发送请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器响应请求结果,响应内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的基本步骤:
步骤一:客户端(比如浏览器)连接到Web服务器(默认80端口),并建立TCP连接。
步骤二:基于TCP,发起HTTP请求;
步骤三:服务接受请求并返回相应报文;
步骤四:释放连接TCP连接;
步骤五:客户端(浏览器)解析HTML内容并呈现;
如果在浏览器输入URL地址,地址为域名,则还需先向DNS服务器请求解析域名对应的IP,然后在基于IP和端口建立TCP连接。
HTTP请求报文
HTTP请求包含四个部分,分别是请求行(请求方法)、请求头(消息报头)、空行和请求正文。
HTTP请求报文示例:
# 请求行 POST /index.html HTTP/1.1 # 请求头 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) Accept: text/html,application/xhtml+xml,application/xml; Accept-Language: zh-CN,zh; Accept-Encoding: gzip, deflate Referer: http://127.0.0.1/index.html Content-Type: application/x-www-form-urlencoded Content-Length: 29 Connection: close Cookie: security=impossible; PHPSESSID=8vv0n11btuol45hqcm5recmfp7 Upgrade-Insecure-Requests: 1 # 请求正文 username=admin&password=admin
需要注意的每一行末尾都有回车和换行,在内容实体和请求头之间有一个空行。
HTTP响应报文
HTTP响应由四部分组成,分别是响应行、响应头(消息报头)、空行和响应正文(消息主题)。
响应报文示例:
# 响应行 HTTP/1.1 200 OK # 响应头 Date: Tue, 10 Aug 2021 09:09:09 GMT //...省略... Content-Length: 5185 Connection: close Content-Type: text/html;charset=gb2312 # 响应正文 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
其中,Content-Length表示响应正文中内容的长度。
HTTP请求方法
请求方法是客户端用来告知服务器其动作意图的方法,HTTP/1.1协议中共定义了8种方法来操作指定的资源。需要注意的是方法名区分大小写,都是大写字母。
GET:获取资源
请求获取指定URI对应的资源,只读,不应该产生“副作用”。
HEAD:获得报文首部
HEAD方法类似GET方法,但HEAD方法不要求返回数据。用于确认URI的有效性及资源更新时间等,可以理解为“元数据”。
POST:传输实体主体
POST方法用来传输实体的主体。
PUT:传输文件
PUT 方法用来传输文件,向指定资源位置上传其最新内容。
DELETE:删除资源
请求服务器删除所标识的资源,与PUT方法相反。
TRACE:追踪路径
回显服务器收到的请求,主要用于测试或诊断。
OPTIONS:询问支持的方法
获取指定资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT:要求用隧道协议连接代理
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
不支持对应方法时,返回状态码405(Method Not Allowed);未实现方法时,返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法可选。且所支持方法实现应匹配方法的语义定义。
HTTP状态码
状态码是用来告知客户端服务器端处理请求的结果。HTTP响应的第一行都是状态行(包括版本号、状态码、短语),具体内容见返回报文。
其中状态码包含以下类型:
- 1xx消息——接收的请求正在处理
- 2xx成功——请求正常处理完毕
- 3xx重定向——需要进行附加操作以完成请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器处理请求出错
常见状态码:
- 200:客户端请求成功,是最常见的状态。
- 302:重定向。
- 404:请求资源不存在,是最常见的状态。
- 400:客户端请求有语法错误,不能被服务器所理解。
- 401:请求未经授权。
- 403:服务器收到请求,但是拒绝提供服务。
- 500:服务器内部错误,是最常见的状态。
- 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
URL构成
超文本传输协议(HTTP)的统一资源定位符地址构成:传送协议。层级URL标记符号(为[//],固定不变) 访问资源需要的凭证信息(可省略) 服务器。(通常为域名,或IP地址) 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略) 路径。(以“/”字符区别路径中的每一个目录名称) 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题) 片段。以“#”字符为起点
以http://www.choupangxia.com:80/blog/index.html?id=10&page=1 为例。
其中:
- http,是协议;
- www.choupangxia.com,是服务器;
- 80,是服务器上的默认网络端口号,默认不显示;
- /blog/index.html,是路径(URI:直接定位到对应的资源);
- ?id=10&page=1,是查询。
小结
关于HTTP协议相关的知识就汇总这么多,重点关注HTTP协议使用场景、请求返回报文格式、使用流程以及特性。