网络 系列 HTTP

开启 网络 探索新篇章

Posted by lichao modified on May 11, 2020

基于“请求-响应”的无状态协议,基于可靠的TCP链接。TCP默认端口为80。由客户端建立连接并发送HTTP请求来初始化一个事务

HTTP消息包括消息头和消息体两个部分。消息头以行为单位,每行以CRLF(回车和换行)结束,消息头结束后额外增加一个CRLF,之后内容就是消息体部分。这意味着:消息头是由ASCII(每个字节存储一个字符)表示的字符串,消息体可能会存在不同的编码方式。

特点

  1. 无状态:是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即打开一个服务器上的网页和之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
  2. 持久性:在 HTTP/1.0 中默认使用短连接。即 浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。如果客户端浏览器访问某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源,如 JavaScript 文件、图像文件、CSS 文件等;当浏览器每遇到这样一个 Web 资源,就会建立一个 HTTP 会话。

HTTP/1.1 起,默认使用长连接来保持连接特性。使用长连接的 HTTP 协议,会在响应头有加入这行代码:Connection:keep-alive。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。

HTTP 方法

GET

GET 方法用来请求访问已被 URI 识别的资源。

指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。

网络

应保持幂等性

POST

POST 方法用来传输实体的主体。

虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。 网络

PUT

传输文件

PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

获得报文首部

HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。

DELETE

删除文件

DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。

OPTIONS

询问支持的方法

OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。

TRACE

追踪路径

TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。

GET 和 POST 区别

数据存放问题

不论是 GET 和 POST 都可以使用 URL 传递数据。

GET 和 POST 是由 HTTP 协议定义的。在 HTTP 协议中,Method 和 Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个 Method 与应用层的数据如何传输是没有相互关系的。

HTTP 没有要求,如果 Method 是 POST 数据就要放在 BODY 中。也没有要求,如果 Method 是 GET,数据(参数)就一定要放在 URL 中而不能放在 BODY 中。

数据长度限制

HTTP 协议对 GET 和 POST 都没有对长度的限制。HTTP 协议明确地指出了,HTTP 头和 Body 都没有长度的要求。

如果使用 GET 通过 URL 提交数据,那么 GET 可提交的数据量就跟 URL 的长度有直接关系了。而实际上,URL 不存在参数上限的问题,HTTP 协议规范没有对 URL 长度进行限制。 这个限制是特定的浏览器及服务器对它的限制。 IE 对 URL 长度的限制是 2083 字节(2K+35)。对于其他浏览器,如 Netscape、FireFox 等,理论上没有长度限制,其限制取决于操作系统的支持。

注意这个限制是整个 URL 长度,而不仅仅是参数值数据长度。

POST 也是一样,POST 是没有大小限制的,HTTP 协议规范也没有对 POST 数据进行大小限制,起限制作用的是服务器的处理程序的处理能力。

正因为它们有这样的区别,所以不应该且不能用 get 请求做数据的增删改这些有副作用的操作。因为 get 请求是幂等的,在网络不好的隧道中会尝试重试。如果用 get 请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用(浏览器和操作系统并不知道会用 get 请求去做增操作)。

安全性

终极区别

GET 和 POST 最大的区别主要是 GET 请求是幂等性的,POST 请求不是。这个是它们本质区别。

什么是幂等性?幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。

参考文档