时空波居士 ☀️摩诃般若波罗蜜

《图解HTTP协议》读书笔记

2017-04-05

预备知识

HTTP协议属于TCP/IP协议族应用层的协议。 当前最新的HTTP协议版本是HTTP/1.1(RFC2616)

数据转发

代理:代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器,代理不改变请求URI,会直接发送给前方持有资源的目标服务器。从源服务器返回的响应经过代理服务器后再传给客户端。转发时,需要附加Via首部字段以标记出经过的主机信息: 客户端——GET HTTP/1.1——->proxy1

proxy1———GET HTTP/1.1 Via:proxy1——>proxy2

proxy2———GET HTTP/1.1 Via:proxy2——>源服务器

proxy2<—–HTTP/1.1 200 OK——源服务器

HTTP/1.1 200 OK——proxy2 proxy1<——–Via:proxy2

HTTP/1.1 200 OK——proxy1 客户端<——–Via:proxy1 使用代理的主要理由通常是:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。

网关:网关的工作机制和代理很相似,但是网关能使通信线路上的服务器提供非HTTP协议的服务,因此可以利用网关由HTTP请求转化为其他协议通信,与其他系统联动: 客户端——-HTTP请求——->网关——-非HTTP通信协议——->非HTTP服务器 客户端<——HTTP响应——–网关<—–非HTTP通信协议———非HTTP服务器

隧道:隧道可按要求建立起一条与其他服务器的通信线路,然后使用SSL等加密手段进行通信,目的是确保客户端能与服务器端进行安全的通信。隧道本身不会去解析HTTP请求,而是将请求保持原样中转给之后的服务器。

数据缓存

缓存是指代理服务器或者客户端本地磁盘内保存的资源副本,利用缓存可以减少对原服务器的访问,因此也就节省了通信流量和通信时间(当代理转发从服务器返回的响应时,将会保存一份资源的副本)。

HTTP协议的请求方法

完整的URI格式: http://user:pass@www.example.com:80/dir/index.html?param1=value1&param2=value2#flag 结构解析: http :// user:pass @ www.example.com : 80 /dir/index.html? param1=value1&param2=value2 #flag 协议 认证信息 服务器地址 端口 文件路径 查询字符串 片段标识符

持久链接(HTTP Persistent Connections、HTTP keep-alive、HTTP connection reuse)与管线化技术(pipelining):

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP链接,频繁的TCP链接与断开(如请求一个有很多图片的网页)会造成无谓的流量消耗和低效的性能。 持久链接的特点是:只要任意一端没有明确地提出断开连接,则保持TCP连接状态。 在HTTP/1.1中,所有的连接默认都是持久连接,持久连接的实现需要服务器端和客户端同时支持。

持久连接使得当有多个请求时,可以以管线化方式发出请求:不用等待前一个请求的响应即可以直接发送下一个请求(实现并行请求行为)。

请求方法:

(方法名区分大小写,一定要用大写字母) 1.0和1.1都支持的方法有5个: GET:访问已被URI标识的内容。 POST:用来传输实体的主体,与GET方法的区别在于其主要目的并不是获取响应的主体内容。 PUT:用来传输文件(写文件),因为PUT方法自身不带验证机制,因此一般的Web网站不使用该方法。 HEAD:获取报文首部,与GET方法的主要区别在于其不返回报文主体,主要用于确认URI的有效性及资源更新的日期时间等。 DELETE:删除文件,作用于PUT相反。 仅1.1支持的方法有3个: OPTIONS:询问指定URI资源支持的方法。 TRACE:让Web服务器将之前的请求通信环回给客户端的方法,配合Max-Forwards字段,可以用来查询发送出去的请求是怎样被加工修改的。 CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。 (CONNECT这个方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户。这样用户就可以访问到一些只有服务器上才能访问到的网站了,这就是HTTP代理。CONNECT方法是需要使用TCP直接去连接的,要是使用CONNECT方法,首先要让服务器监听一个端口来接收CONNECT方法的请求。Connection验证并建立连接后会返回HTTP/1.1 200 Connection Established,否则返回HTTP/1.1 407 Unauthorized。验证通过之后,我们就可以做普通的HTTP操作了。完全可以把现在的代理服务器看作是请求连接的Internet服务器,也就是说可以像直接访问普通的服务器一样,使用GET、POST等方法来请求Internet服务器上的页面了。) 仅1.0支持,在1.1中已经废弃的方法有2个: LINK UNLINE`

HTTP报文结构解析

HTTP报文本身其实是由CR+LF作为换行符的一个多行字符串文本,大致可以分成报文首部和报文主体两部分,这两部分由第一个出现的空行来分隔。用于请求的报文通常称为请求报文,用于响应的报文通常称为响应报文,结构如下:

请求报文

请求报文实例 GET http://www.google.cn/ HTTP/1.1CR+LF Host: www.google.cnCR+LF Proxy-Connection: keep-aliveCR+LF Accept: text/html,appl…/webp,/;q=0.8CR+LF User-Agent: Mozi…36CR+LF Accept-Language: zh-CN,zh;q=0.8CR+LF Cookie: NID=67=i9vxrEuDQ7tNijPKYNau5…CR+LF

响应报文实例 HTTP/1.1 200 OKCR+LF Vary: Accept-EncodingCR+LF Content-Type: text/htmlCR+LF Last-Modified:…TCR+LF Date: Tue, 30 Dec 2014 08:49:48 GMTCR+LF Cache-Control: private, max-age=0CR+LF Server: sffeCR+LF CR+LF <!DOCTYPE html>

Google

文章目录