HTTP 是什么
HTTP是一种超文本传输协议,用于完成客户端和服务器端等等一系列的运作流程。而协议指的是规则的约定。可以说,Web 是建立在 HTTP 协议上进行通信的。
HTTP的诞生
我相信大家也是这样,在学一门技术之前都会去了解一下它的历史,下面来看看 HTTP 的发展史。
HTTP 诞生于 1989 年 3 月。是一个名叫蒂姆伯纳斯-李的哥们儿提出的,最初设想的基本理念是:借助多文档之间相互关联形成的超文本,连成可相互参阅的 WWW(World Wide Web,万维网)。简称 Web。
HTTP 0.9 在 1990 年问世。那时候的 HTTP 还没有作为正式的标准被建立。
HTTP 1.0 在 1996 年 5 月 正式作为标准。该协议标准现在仍然被广泛使用在服务器端。
HTTP 1.1 在 1997 年 1 月公布为当前主流的 HTTP 协议版本。
HTTP 2.0 在 2012 年 3 月 征集建议。
HTTP 2.0 在 同年的 9 月份 发布了第一个草案。
HTTP 2.0 在 2014 年 11 月实现了标准化。
了解 TCP/IP
在理解 HTTP 之前,我们先简单的来了解一下 TCP/IP 协议族。一般使用的网络都是在 TCP/IP 协议的基础上运作的,而 HTTP 属于它内部的一个子集。
TCP/IP 协议族
在计算机和网络设备进行互相通信时,双方都必须基于相同的方法。比如,如何探测到通信目标,是哪边先发起通信、用什么语言进行通信、怎样结束通信等等一些规则都是先要确定好的。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而这种规则称为协议
。
协议中包括:从电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web 页面显示要处理的步骤,等等。将这些相关联的协议集合起来总称为 TCP/IP。
TCP/IP 模型各层作用
TCP/IP 重要的点就是分层。有以下4
层:应用层、传输层、网络层和数据链路层。
下面来介绍各层的作用。
-
应用层:应用层决定了向用户提供应用服务时通信的活动。比如,FTP(文件传输协议)和 DNS(域名解析系统)。HTTP 协议也在该层。
-
传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传送。该层有两个不同的协议:TCP 传输控制协议和 UDP 用户数据协议。
-
网络层:网络层用来处理在网络上的数据包。数据包是网络传输的最小数据单位。网络层的作用就是在多条路线中选出一条传输路线进行数据传输。
-
链路层:用来处理连接网络的硬件部分。包括什么操作系统、硬件的设备、什么路由器啊之类的等等,都属于该层。
TCP/IP 层次化的好处是:如果互联网由一个协议统一规划,某个地方需要改变设计时,就必须将所有部分整体替换掉。而分层之后只需要把变动的层替换掉。把各层之间的接口部分规划好之后,每层内部的设计就可以自由改动。比如,处于应用层上的应用可以只考虑分配给自己的任务,不用去考虑其他的问题。
TCP/IP 通信传输流
TCP/IP 协议进行通信时,会通过分层顺序和对方进行通信。客户端从应用层往下走,服务器端则从链路层往上走。看下面的图。
-
首先客户端在应用层发出一个 HTTP 请求。
-
接着,在传输层接收到应用层的数据后进行分割,给每个报文打上标记序号以及端口号转发给网络层。
-
在网络层,添加通信目的地的 MAC 地址后转发给链路层。
-
接收端(也叫服务器端)的服务器在链路层接收到数据,按次序向上层发送,一直到应用层。传输到应用层才算真正接收到客户端发过来的 HTTP 请求。
和HTTP相关的协议
在HTTP客户端向服务器端发送报文之前,需要用到 IP、TCP、DNS 这三个和 HTTP 密不可分的协议。
IP 网络协议
IP(Internet Protocol
)网络协议处于网络层。IP协议的作用是把各种数据包传送给对方。但要保证正确的传送给对方,其中两个重要的条件是 IP 地址和 MAC 地址。可以把它想象成你家的地址,或者说你的电话号码。
IP 地址指的是节点被分配到的地址,MAC 地址指的是网卡所属的固定地址。IP 地址可以跟 MAC 地址进行配对。IP 地址是可变的,MAC 地址是不可变的。
IP 和 IP地址别搞混了,IP是一种协议。而IP地址是则是每台计算机的标识
ARP 协议
IP 间的通信依赖 MAC 地址。在网络上通信的双方很少会在同一个局域网,一般都是经过多台计算机或者网络设备中专才能连接到对方。而在中转的过程中,会利用下一站中转设备的 MAC 地址进行搜索下一个中转目标。而这时,会用到ARP协议。ARP协议是一种用来解析地址的协议,通过通信方的 IP 地址就能反查出对应的 MAC 地址。
在到达通信目标前的中转过程中,计算机和路由器只能获取粗略的传输路线,这种机制叫做路由选择。
就跟你在淘宝上买东西是一样的道理。比如,你在淘宝网买了件衣服,快递公司会根据你的地址进行送货,在送货这个过程中,并不是直接送到你手里。而是经过各种什么杭州中转站然后又到深圳中转站,之后才送到你手里。
TCP 协议
TCP 协议处于传输层,主要的作用是提供可靠的字节流服务。字节流服务指的是,为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理。而可靠性的传输服务指的是,能够把数据准确可靠的传给对方。
为了准确的将数据传送给对方,三次握手就出现了。下图展示这个过程。
-
第一次握手:客户端先发送一个带 SYN 标志的数据包给对方。
-
第二次握手:服务器端收到之后,回传一个带有 SYN/ACK 标志的数据包表示传达确认信息。
-
第三次握手:最后,客户端再传回一个带 ACK 标志的数据包,表示 “握手” 结束。
DNS 服务
DNS 服务和 HTTP协议一样,处于应用层。它主要的作用是,将域名解析成 IP 地址。DNS 协议可以通过域名查找 IP 地址,也可以通过 IP 地址反查域名的服务。
下面展示每个协议和HTTP协议的关系。
什么是URL和URI?
-
URL指的是统一资源定位符,是访问Web网站需要输入的网站地址。例如,
http://www.tutu.com
。 -
URI指的是统一资源标识符,全称为
Uniform Resource Identifier
,它的作用是区分互联网中的不同资源。比如,HTML 文档、图像、视频片段、程序等等。而 URL 是 URI 的一个子集。
URI格式
下图展示了 URI 的格式。
-
协议名:
http:
或https:
表示协议名称。不区分字母大小写,最后加上//
。 -
登录信息:
user:pass@
表示获取服务器资源的用户和密码。但不推荐使用,因为不安全。 -
服务器地址:服务器地址有三种:
-
以域名的形式
www.tutu.com
; -
以 IPv4
192.168.0.1
地址名; -
以
[0:0:0:0:0:0:1]
这种方括号括起来的 IPv6 地址;
-
-
服务器端口号:
:8080
表示端口号。 -
文件路径:
/html/index.html
表示服务器文件路径,资源的访问位置。 -
查询字符串:
?userId=1
表示文件路径中的参数。?
后面以key=value
的形式。如果后面还需要加参数,用&
拼接。 -
片段标识符:
#cn1
表示文件中的某个位置。就是平时的网页锚点定位。
HTTP基础
HTTP 是一种无状态的协议,对发送过的请求/响应都不做持久化处理。
持久化连接
HTTP 1.1 中的所有连接都是默认开启的(keep-alive
)。通过请求/响应头部的Connection
字段可以查看是否开启持久化连接(后面会介绍该字段的值),而在 HTTP1.0中是默认关闭的(close
)。
它的特点是,不管是客户端还是服务器端,只要其中的一端没有提出断开连接,那么就会保持 TCP 连接。好处是,减少 TCP 连接的重复建立和断开连接造成的额外开销,减轻服务器压力。这样使得 HTTP 请求和响应速度更快结束,也提高页面的显示速度。
管线化
管线化是不用等待响应就可以发送下一个请求,也就是并行处理。不用一个接一个的等待响应,管线化比持久化连接还要更快。
HTTP 报文
HTTP 一共有两种报文:请求报文、响应报文。报文又分为报文头部和报文主体,报文主体是可选的。报文包含了以下三个部分。
-
起始行(
start line
)有以下两种类型。-
请求行:请求的方法、请求的 URL、HTTP的版本
-
响应行:HTTP 版本、状态码
-
-
头部字段(
header
):一些头部信息,以key: value
的形式。 -
主体(
body
):被发送的数据。
这张图是以请求报文为例。