PowerProxy原理篇: HTTP代理(1)

前言

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

总结

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

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2017-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落花落雨不落叶

canvas画简单电路图

61011
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2958
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2702
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4015
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5426
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

31510
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3105
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2526
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2635
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2547

扫码关注云+社区