简单的 HTTP 协议
1. 首先介绍一下HTTP
HTTP 协议,全称Hyper Text Transfer Protocol,超文本传输协议,它是一种规范,完成从客户端到服务器端等一系列运作流程。
2. 通信协议(TCP/IP协议族)
计算机与网络设备要相互通信,双方就必须基于相同的方法。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则,而我们就把这种规则称为 协议(protocol)。
像这样把与互联网相关联的协议集合起来总称为 TCP/IP。
TCP/IP 协议族按层次分别分 为以下 4 层:应用层、传输层、网络层和数据链路层。
- 应用层:决定了向用户提供服务时通信的活动,HTTP也处于该层。(FTP、DNS)
- 传输层:提供处于网络连接中的两台计算机之间的数据传输。
- 网络层:网络层用来处理在网络上流动的数据包。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所 起的作用就是在众多的选项内选择一条传输路线。
- 链路层:用来处理连接网络的硬件部分。
在这个过程里,数据流动如图,
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层 时会把对应的首部消去。
3. IP、TCP 和 DNS
3.1 负责传输的IP协议
IP网际协议位于网络层,作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足两个重要的条件是 IP 地址和 MAC 地址。
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定 地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC 地址基本上不会更改。
IP 间的通信依赖 MAC 地址,采用 ARP 协议可以根据通信方 的 IP 地址就可以反查出对应的 MAC 地址。
3.2 确保可靠的TCP协议
TCP 位于传输层,提供可靠的字节流服务。
所谓的字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。为了准确无误地将数据送达目标处,TCP 协议采用了三次握手 、四次挥手策略。
3.3 负责域名解析的DNS服务
DNS服务是和 HTTP 协议一样位于应用层的 协议。它提供域名到 IP 地址之间的解析服务。
用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。
但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。
所以,DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
4. URI 和 URL
URI,统一资源标识符,就是由某个协议方案表示的资源的定位标识符。
URL,统一资源定位符,也就是我们访问页面时的网页地址。
URI 用字符串标识某一互联网资源,而 URL表示资源的地点。可见 URL是 URI 的子集。
了解一下URI的格式:
5. 简单的 HTTP 协议
HTTP 协议用于客户端和 服务器之间的通信。 请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一 端称为服务器端。
HTTP 是一种不保存状态,即无状态(stateless)协议。每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了 更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设 计成如此简单的。
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
6. HTTP 方法
- GET :获取资源
- POST :传输实体的主体。
- PUT:传输文件
- HEAD:获得报文首部
- DELETE:删除文件
- OPTIONS:询问支持的方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理
7. 持久连接
HTTP 协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。传输容量小的话,问题也不大,但是如果包含大量图片等容量大的资源时,每次请求就会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决这个问题,HTTP/1.1和部分 HTTP/1.0 采用持久连接的方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
8. 使用 Cookie 的状态管理
HTTP是无状态协议,无状态的优点是减少服务器的CPU和内存资源的消耗。为了保持长连接引入了Cookie技术,它通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
首次响应,服务器会在响应报文里包含一个首部字段信息Set-Cookie,以此来通知客户端保存Cookie,客户端在之后的请求报文中加入Cookie 后再发送到服务器端。
服务器端接收到客户请求中的 Cookie 后,对比服务器上的记录,可以得到该客户之前的状态信息。
首次请求是这样的:
- 服务端保存客户端请求
- 服务端在响应中添加cookie后返回
在存有Cookie信息之后,请求时这样的:
- 客户端请求时带上cookie
- 服务端检查cookie,作出响应