HTTP协议前言
协议
计算机与网络设备之间要相互通信,双方必须基于相同的方法。比如,如何如何探测到通信目标,由哪一方先发起通信,使用哪种语言进行通信,怎样结束通信规则等等这些要事先明确。所有的一切都需要一种规则,而我们把这种规则称为协议(protocol)。
在介绍HTTP之前,先简单介绍一下TCP/IP协议。通常使用的网络是在TCP/P体系的基础上运作的。
TCP/IP
TCP/IP体系最重要的一点就是分层。TCP/IP体系按照层次划分为4层:应用层,传输层,网络层,数据链路层。各个层次的作用简述如下:
- 应用层:应用层决定了向用户提供应用服务时通信的活动
- 传输层:传输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输
- 网络层:网络层处理在网络上流动的数据包。数据包时网络传输的最小数据单位,该层规定了通过怎么样的路径(传输路线)到达对方计算机,并且把数据包传送给对方
- 数据链路层:处理连接网络的硬件部分。包括控制操作系统,硬件的设备驱动,NIC(Network Interface Card),光纤等物理可见部分。
IP,TCP,DNS
IP,TCP,DNS三个协议与HTTP密切相关,依次介绍这三个协议
负责传输的IP协议
按层次分,IP(Internet Protocol)网际协议位于网络层。Ip协议的作用是吧各种数据包传送给对方。保证数据缺失传送到对方需要满足条件,其中两个重要的条件是IP地址和MAC地址
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的㐉地址。IP地址可以和MAC地址进行匹配。IP地址可以变化,MAC地址基本不会变化。
使用ARP协议凭借MAC地址进行通信
IP间的通信依赖MAC地址,ARP是一种用来解析地址的协议,根据通信双方的IP地址可以反查到对应的MAC地址。
可靠性的TCP协议
按层次分,TCP位于传输层,提供可靠的字节流服务
所谓的字节流服务(Byte Stream Service)是指,为了传输方便,将大块数据分割成以报文段(segment)为单位的数据包进行管理。可靠性传输服务指,能够把数据准确可靠的传输给对方。
确保数据能到达目标
为了准确讲数据送达,TCP协议采用了三次握手策略。用TCP协议把数据包传送出去后,TCP不会对传送后的情况置之不理,它会向对方确认是否成功送达。
握手过程中使用了TCP的标志(flag)——SYN(synchronize)和ACK(acknowledgement)
发送端首先发送一个带有SYNC标志的数据包给对方。在接收端接手后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端回传一个带有ACK标志的数据包,代表握手结束。
若在握手的过程中某个结算中断,TCP协议会再次以相同的顺序发送相同的数据包。
域名解析的DNS服务
DNS(Domain NAMED System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务
计算机既可以被赋予IP地址,也可以被赋予主机名和域名。
用户通常使用主机名和域名来访问对方的计算机,而不是直接通过IP地址访问,DNS协议的功能就是提供通过域名查找IP地址,或者从IP地址反查域名的服务器。
HTTP协议通信过程各自发挥的作用如下图:
URL和URI
与URI(统一资源标识符)相比,URL更为我们熟悉,URL就是使用Web浏览器页面时需要输入的网页地址。
统一资源标识符
URI是Uniform Resource Identifer缩写,三个单词的定义分别如下:
- Uniform:规定统一格式方便处理多种不同类型的资源,不用根据上下文环境来识别资源指定的访问方式。
- Resource:资源的定义是“可标识的任何东西”。除了文档文件,图像或服务等能够区别于其他类型的,全都可作为资源。
- Identifer:表示可标识的对象,也称为标识符。
综上所述,URI就是由某个协议方案表示的资源的定位标识符,协议方案是指访问资源所使用的协议类型名称。
URI用字符串标识某个互联网资源,而URL表示资源的地点,可见URL是URI的子集
HTTP协议
HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一段称为客户端,而提供资源响应的一段称为服务端。HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回。即肯定从客户端开始建立通信,服务器端在没有收到请求之前不会发送响应。
客户端发送给某个服务器端的请求报文内容如下:
GET /index.html HTTP/1.1
Host: ...
起始行开头的GET表示请求访问服务器的类型,称为方法。随后的字符串表示请求访问的资源对象,也就是URI。最后的HTTP/1.1表示的是客户端使用的HTTP协议版本。
请求报文由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成。
接受到请求的服务器会将请求内容的处理结构以相应的刑事返回。
HTTP/1.1 200 OK
Date:....
Content-Length:230
Content-Type :...
在其实行开头的HTTP/1.1表示服务器对应的HTTP版本
紧接着200 OK表示请求的处理结果状态码和原因短语。下一行显示创建相应的日期时间,是首部字段(header field)内的一个属性
接着以一空行分隔,之后的内容称为资源实体的主题。响应报文基本上由协议版本,状态码,解释状态码的原因短语,可选的响应首部字段以及实体主体构成。
不保存状态的协议
HTTP是一种不保存状态的协议,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对发送过的请求或者响应都不做持久化处理
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身不保存之前一切的请求和响应报文信息。这是为了更快处理大量事务,确保协议的可伸缩性特地把HTTP协议设计成如此。
告知服务器意图的方法
- GET方法:GET方法用来请求访问已经被URI表示的资源,指定的资源经服务器解析后返回响应内容。也就是说,如果请求的资源是文本,那么久保持原样返回,如果是想CGI(通用网关接口)那样的程序,则返回经过执行后的输出结果。
- POST方法:主要用来传送实体的主体。虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是使用POST方法。
- PUT方法:主要用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是鉴于HTTP/1.1的PUT方法自身不带验证机制,存在安全性问题。
- HEAD方法:HEAD方法和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性以及资源更新的日期时间。
- DELETE:用于删除文件,与PUT相反的方法,DELETE方法按请求URI删除指定的资源。
- CONNECT:要求用隧道连接代理,CONNECT方法要求与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经过网络隧道传输。
CONNECT方法的格式如下:
CONNECT 代理服务器名:端口号 HTTP版本
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。每次的请求都会造成无所谓的TCP连接建立和断开,增加通信量的开销。
持久连接
为了解决TCP连接的问题,HTTP/1.1使用持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或者HTTP connection reuse)的方法。持久连接的特点是,只要任意一段没有明确断开连接,则保持TCP连接状态。
持久连接的好处就是减少了TCP连接的重复建立和断开所造成的的额外开销,减轻了服务端的负载。在HTTP/1.1中,所有的连接都默认为持久连接。
管线化
持久连接使得多数请求以管线化(pipelining)方式发送称为可能。从前发送请求后需要等待并收到响应,才能发送一个请求。管线化技术出现后,不用等待响应也可以发出下一个请求,这样就可以做到同时并行发送多个请求,而不是一个接一个等待响应。
使用Cookie的状态管理
HTTP是无状态的,它不对之前发生过的请求和响应的状态进行管理,也就是说,无法根据之前的状态进行本次的请求和处理。
假设要求登陆认证的web页面本身就无法进行状态的管理,那么每次跳转新页面不是再次登陆,就是每次请求报文中附加参数来管理登陆状态。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态。Cookie会根据从服务端发送的响应报文中的一个叫做Set-Cookie的首部字段薪资,通知客户端保存Cookie。当下次客户端在网该服务器发送请求字段时,客户端自动在请求报文中添加Cookie值发送出去。
服务端发现客户端发送过来的Cookie之后,会检查是哪个客户端发送的连接请求,然后对比服务器上的记录,最后得到状态信息。