前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PowerProxy原理篇: HTTP代理(1)

PowerProxy原理篇: HTTP代理(1)

作者头像
七夜安全博客
发布2018-06-21 18:36:53
1.3K0
发布2018-06-21 18:36:53
举报
文章被收录于专栏:七夜安全博客七夜安全博客

前言

今天正式开更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的建立和关闭操作时,将会浪费时间和带宽。

总结

由于公众平台篇幅有限,不利于文章太长,原理篇的内容下一篇接着讲解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七夜安全博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档