HTTP协议
超文本传输协议(HyperText Transfer Protocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
设计HTTP最初的目的是为了提供一种发布和接受HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一标识符(Uniform Resource Identifiers, URI)来标识。
URI与URL的区别
1)URI(Uniform Resource Identifiers, 统一资源标识符),用于唯一的标识一个区域的一个资源。比如:A省/B市/C区/D路/E号,那么此时的“E号”对于“D路”就是URI,同时“B市/C区/D路/E号”对于“A省”也是URI。
2)URL(Uniform Resource Locator,统一资源定位符),用于在internet中标识唯一的一个资源。例如:https://cn.bing.com
一、协议概述
HTTP是一个客户端和服务端之间请求和应答的标准,通常使用TCP协议。通过使用网页浏览器、网络爬虫或者其他的工具,客户端发起一个HTTP请求到服务器上指定端口(默认为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源(比如HTML文件和图像),我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或隧道(tunnel)。
尽管TCP/IP协议是互联网上最流行的应用,但是在HTTP协议中并没有规定它必须使用或它支持的层。事实上HTTP可以在任何互联网协议或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用,所以其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP链接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如“HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误信息、或者其他信息。
二、请求方法
在HTTP/1.1协议中共定义了八种方法(也叫动作)来以不同方式操作指定的资源:
1、GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取资料,而不应当被用于产生“副作用”的操作中。其中给一个原因是GET可能会被网络爬虫等随意访问。
2、HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。他的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
3、POST
向指定资源提交数据,请求服务器进行处理。数据被包含在请求本文中。这个请求可能回创建新的资源或修改现有资源,或二者皆有。
4、PUT
用于更新某个较为完整的资源。
5、DELETE
请求服务器删除Request-URI所标识的资源。
6、TRACE
回显服务器收到的请求,主要用于测试或诊断。
7、OPTIONS
这个方法可使服务器传回该资源所支持的所有请求方法。用‘*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运行。
8、CONNECT
HTTP/1.1协议中预留给能够将链接改为隧道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或不支持队形的请求方法时,应当返回状态码501(Not Implement)。
HTTP服务器至少应该实现GET和 HEAD方法,其他方法都是可选的。当然所有的方法支持的实现都应符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如:
9、PATCH
用于资源的部分内容的更新(或修改)。
三、安全方法
对于GET和HEAD方法而言,粗了进行获取资源信息外,这些请求不应当再有其他的意义。也就是说,这些方法应当被认为是“安全的”。客户端可能回使用其他“非安全”方法,例如POST、PUT及DELETE,应该以特殊的方式(通常是按钮而不是超链接)告知客户可能的后果(例如一个按钮控制的资金交易),或请求的操作可能是不安全的(例如某个文件将被上传或删除)。
但是,不能想当然地认为服务器在处理某个GET请求时不会产生任何副作用。事实上,很多动态资源会把这作为其特性。这里重要的区别在于用户并没有请求这一副作用,因此不应当由用户为这些副作用承担责任。
四、HTTP交互过程
HTTP协议是一个无状态协议,同一个客户端的这次请求和上次请求是没有关系的。
五、版本
超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。
1、HTTP/0.9
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
2、HTTP/1.0
这是第一个在通信中指定版本号的HTTP协议版本。
3、HTTP/1.1
默认采用持续链接(Connection:keep-alive),能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
4、HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性
5、HTTP/2
当前版本,于2015年5月作为互联网标准正式发布。
6、HTTP/3
2022年6月已发布最新的HTTP/3标准。
六、状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接收
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误。
虽然RFC 2616中已经推荐了描述状态的短语,例如“200 OK”,“404 Not Found”,但是WEB开发者任然能够自动决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
持续链接
在HTTP 0.9和1.0中,TCP连接在每一次请求/回应对之后关闭。在HTTP 1.1中,引入了保持连接的机制,一个连接可以重复在多个请求/回应使用。持续连接的方式可以大大减少等待是按,因为在发出第一个请求后,双方不需要重新进行TCP三次握手。
HTTP 1.1还改进行了HTTP 1.0的带宽,例如, HTTP 1.1引入了分块传输编码,以允许传递内容可以在持续连接被流传输而不必使用到缓冲器。HTTP管道允许客户端在收到每个回应之前发送多个请求,进一步减少用户感受到的滞后时间。协议的另一个补充是字节服务,允许客户端请求资源的某一部分,服务器仅回应某资源的指明部分。
七、弱点
HTTP协议通过明文方式进行传输相关内容,这就可能导致用户所使用的用户/密码容易被人嗅探得到。
八、HTTPS
超文本传输安全协议(HyperText Transfer Protocol Secure,HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但是利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性
1、HTTPS结构
2、工作过程
1)客户端浏览器将自己支持的加密规则发送给网站。
2)网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回客户端浏览器。证书里包含了网站地址、加密公钥以及证书颁发机构等信息。
3)客户端浏览器获得网站证书之后,会进行如下工作:
a)验证证书的合法性(颁发证书的机构是否合法?证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器网址栏会显示一个小锁头,否则会给出证书不受信的提示。
b)如果证书受信任,或者用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c)使用约定好的HASH算法计算握手信息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4)网站接收到浏览器发送的数据之后会进行如下操作:
a)使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b)使用密码加密一段握手消息,发送浏览器。