前言
今天正式开更PowerProxy系列专题,这也是我愿意倾注很多心血的一个开源项目。本专题文章按照原理,简单实现,提升性能和扩展功能的次序对PPy项目进行讲解,今天讲解的是原理篇的第一课,讲解HTTP协议。
HTTP与TCP
要实现HTTP代理,了解HTTP与TCP的关系是关键。首先我们从TCP/IP协议中看一下HTTP所处的位置,如下图所示。
由上图就可以看到,HTTP协议通常承载于TCP协议之上。有时也承载于TLS或SSL协议层上,这就是我们常说的HTTPS。默认HTTP的端口号为80,HTTPS的端口号为443。
学过网络编程的朋友,大家应该比较清楚,通常TCP层的通信,都是由套接字来完成的,也就是常说的socket通信。既然TCP通信是由socket来通信,那么HTTP通信和socket有什么关系呢?我们可以大胆地猜想,HTTP通信的实现就是在socket中传输HTTP报文。其实事实就是如此,下面我们使用Wireshark来抓一下HTTP请求,更加直观地了解HTTP连接的过程。在浏览器中访问:我的博客,抓包效果如下图所示。
从图中可以看到,HTTP通信的前提是通过TCP的三次握手建立连接,建立连接之后,才是HTTP请求的传输。据此,基本上可以确定使用socket就可以实现HTTP的通信,同时也可以确定HTTP代理是通过socket转发来实现的。
HTTP数据传输
我们了解到HTTP属于应用层协议,TCP属于传输层协议,因此HTTP的长连接与短连接本质上是TCP的长连接和短连接。
首先聊一下TCP连接的三次握手和四次挥手,这对我们了解HTTP连接为什么会有长短之分有很大的帮助。如下图所示,即为TCP三次握手,用来建立连接。
如果想断开TCP连接,则需要进行四次挥手,如下图所示。
1.TCP短连接
TCP短连接的操作步骤为:建立连接-->数据传输-->断开连接 ...... 建立连接-->数据传输-->断开连接。其运行流程为:首先client向server发起连接请求,server接到请求,然后双方建立连接。接着client向server 发送消息,server回应client,然后一次读写就完成了。最后一般是client主动断开连接,当然也有server断开连接的时候。从应用场景中可以看出TCP短连接,一般只是用来在client/server之间完成一次数据传输的操作,数据传输完成,立即关闭连接。
2.TCP长连接
TCP长连接的操作步骤为:建立连接-->数据传输 ...... (保持连接) ...... 数据传输-->断开连接。其运行流程为:首先client向server发起连接请求,server接到请求,然后双方建立连接。建立连接之后,双方开始进行数据传输,但是和短连接不同的是,完成一次数据读写,并不会立即断开连接,而是保持连接,让之后的数据传输继续使用。
3.应用场景
在现存HTTP协议中,有1.0,1.1和2.0版本,其中使用最广泛的是HTTP/1.1版本。HTTP/1.0属于过时的协议,但是依然有很少的网站在用。HTTP/2.0是下一代HTTP协议,将只用于https://网址,用来保证安全性,现在使用较少。因此下面我们从HTTP/1.0协议和HTTP/1.1协议来讲一下长连接和短连接。
在HTTP/1.0中,默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就需要建立一次连接,但数据传输结束就中断连接。当浏览器访问某个HTML网页时,如果网页中还包含着其他的Web资源,如js文件,图片等,这个时候浏览器会接着创建连接,建立HTTP会话,接收资源。
而在HTTP/1.1中,默认使用长连接。使用长连接的HTTP报文,会在响应头中加入Connection头域,并将域值设置为"keep-alive",如下所示。
在使用长连接时,当客户端访问一个网页结束后,客户端和服务器之间的连接并不会关闭,当客户端再次访问服务器上的网页时,会继续使用已经建立的连接。但是keep-alive不会永久保持连接,它有一个保持时间,这个可以由服务器软件进行设置。如果想主动关闭连接,可以在响应头中将“keep-alive"改为"close",如下所示。
4.优势与缺点
长连接可以减少较多的TCP建立和关闭的操作,减少服务器资源的浪费,节约时间。对于频繁请求资源的客户端来说,较适用长连接。但是存在一个问题,就是存活功能的探测周期太长。在长连接的应用场景下,客户端一般不会主动关闭它们之间的连接,客户端与服务端之间的连接如果一直不关闭的话,随着连接的增多,服务器的压力会剧增,甚至导致宕机。
短连接对于服务器来说,管理比较简单,而且存在的连接都是有效的,不需要额外的控制手段。但是如果客户端请求频繁,在进行TCP的建立和关闭操作时,将会浪费时间和带宽。
总结
由于公众平台篇幅有限,不利于文章太长,原理篇的内容下一篇接着讲解。