很多WEB开发都不怎么理解 HTTP
,为什么要深入理解HTTP协议
?因为前端所有的 静态资源加载,和 数据加载,都是要通过HTTP
进行发送的。而后端做出来的服务,提供出来的内容给前端,也是通过HTTP
进行发送的!这篇文章主要用来帮助大家深入理解HTTP协议
。
什么情况下会用到HTTP协议
呢?例如:
- 输入
URL
打开网页 -
AJAX
获取数据 -
img
标签加载图片
一、网络协议分层
低三层
- 物理层:主要作用是定义物理设备如何传输数据,也就是电脑的硬件设备,网卡端口、网线、以及网线连出去之后会有一条光缆将数据传输到互联网等。
- 数据链路层:在通信的实体间建立数据链路链接,数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
- 网络层:为数据在结点之间传输创建逻辑链路。
传输层
- 向用户提供可靠的端到端(End-to-End)服务
- 传输层向高层屏蔽了下层数据通信的细节
应用层
- 为应用软件提供了很多服务
- 构建于
TCP
协议之上 - 屏蔽网络传输相关细节
二、http协议发展历史
HTTP/0.9
- 只有一个命令
GET
- 没有
HEADER
等描述数据的信息 - 服务器发送完毕,就关闭
TCP
连接
HTTP/1.0
- 增加了很多命令,如
post
、put
等 - 增加
status code
和header
- 多字符集支持、多部分发送、权限、缓存等
HTTP/1.1
- 持久连接
- pipeline
- 增加
host
和其他一些命令
HTTP2
- 所有数据以二进制传输
- 同一个连接里面发送多个请求,不再需要按照顺序来
- 头信息压缩以及推送等提高效率的功能
三、HTTP三次握手和四次挥手
建立TCP连接
-
三次握手
TCP的连接建立是一个三次握手过程,目的是为了通信双方确认开始序号,以便后续通信的有序进行。主要步骤如下:
连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号a;
连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个a包
的回应信息ACK,回应的序号为下一个希望收到包的序号,即a+1,然后还包含
了自己的初始序号b;
- 连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了
下一个希望收到包的序号即b+1。
断开TCP连接
-
四次挥手
TCP终止连接的四次挥手过程如下:
- 首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这
个FIN)执行被动关闭。
- 当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一
样,一个FIN将占用一个序号。
- 同时TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个
服务器程序就关闭它的连接,导致它的TCP端发送一个FIN。
- 客户必须发回一个确认,并将确认序号设置为收到序号加1。
四、URI、URL、URN
URI
- Uniform Resource Identifier / 统一资源标志符
- 用来唯一标识互联网上的信息资源
- 包括URL和URN
URL
- Uniform Resource Locator / 统一资源定位符
- http://user:pass@host.com:80/path?query=string#hash
- 此类格式的都叫做URL,比如ftp协议
URN
- 永久统一资源定位符
- 在资源移动之后还能被找到
- 目前还没有非常成熟的使用方案
五、HTTP报文
HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。
HTTP报文的流动方向:一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到“服务器”,在服务器工作完成之后,报文又会从“服务器”流到“代理”再流到“客户端”
报文的语法:所有的HTTP报文都可以分为两类,请求报文 和 响应报文。请求和响应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。
请求报文:它会向Web服务器请求一个动作
请求报文的格式:
- 起始行: <method> <request-URL> <version>
- 头部: <headers>
- 主体: <entity-body>
响应报文:它会将请求的结果返回给客户端。
响应报文的格式:
- 起始行: <version> <status> <reason-phrase>
- 头部: <headers>
- 主体: <entity-body>
HTTP方法:并不是每个服务器都实现了所有的方法。即使服务器实现了所有这些方法,这些方法的使用很可能也是受限的。例如,支持
DELETE
方法或PUT
方法的服务器可能并不希望任何人都能够删除或存储资源,这些限制通常都是在服务器的配置中进行设置的。
常用的HTTP方法:
GET方法
:通常用于请求服务器发送某个资源。不包含主体
HEAD方法
:与GET方法类似,但服务器在响应中只返回首部,使用HEAD方法可以,在不获取资源的情况下了解资源的情况(比如,判断其类型);通过查看响应中的状态码,看看某个对象是否存在;通过查看首部,测试资源是否被修改了;不包含主体
POST方法
:该方法是用来向服务器发送数据的,常用于HTML表单,包含主体
PUT方法
:该方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,如果那个URL已经存在的话,就用这个主体来替代它。包含主体
TRACE方法
:主要用于验证请求是否如愿穿过了请求/响应链,不包含主体
OPTIONS方法
:决定可以在服务器上执行那些方法,不包含主体
DELETE方法
:该方法就是请服务器删除请求URL所指定的资源,但是客户端应用程序无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求,不包含主体
状态码:HTTP状态码被分成了五大类。状态码为客户端提供了一种理解事务处理结果的便捷方式。
1、100~199(信息性状态码)
:HTTP/1.1向协议中引入了信息性状态码
2、200~299(成功状态码)
:客户端发起请求时,这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求
3、300~399(重定向状态码)
:重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容
4、400~499(客户端错误状态码)
:有时客户端会发送一些服务器无法处理的东西。浏览网页时,我们都看到过臭名昭著的404 Not Found错误码,这只是服务器在告诉我们,它对我们请求的资源一无所知
5、500~599(服务器错误状态码)
:有时客户端发送了一条有效请求,服务器自身却出错了,这些会返回5xx状态码