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 条评论
登录 后参与评论

相关文章

来自专栏xcywt

关于HTTP的笔记

网上看了一篇关于HTTP的博客,觉得还不错,这里就记下来了。 参考:https://www.cnblogs.com/guguli/p/4758937.html ...

3136
来自专栏Vamei实验室

Mac OSX网络诊断命令

下面是一些Mac OSX下常用的网络诊断命令。它们能帮助我们发现网络问题。文中提到的协议和网络通信原理,可参考协议森林。 有些工具,如arping, arp-s...

1919
来自专栏Python小屋

Python使用TCP协议编写会聊天的小机器人

本文代码简单模拟了机器人聊天软件原理,服务端提前建立好字典,然后根据接收到的内容自动回复。当然,这个程序对客户端的信息是进行严格匹配,大家可以尝试结合分词模块和...

3378
来自专栏Python小屋

使用Python开发会聊天的智能小机器人

本文重点演示使用socket实现TCP通信以及字典和集合的用法,客户端发来信息之后,服务端会尽量猜测客户端要表达的真正意思,然后选择合适的内容进行回复。 服务...

33612
来自专栏Danny的专栏

必备的网络常用测试命令(tracert命令)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1262
来自专栏杨明亮的专栏

NAT 穿透原理浅浅说(一)

本篇文章也是综合和参考了些网络上和文献里的一些资料(文中没有对引用处进行标记,请见谅)。写本文的目的就是,用自己的语言描述了这个过程,同时也在描述过程中加入了一...

3.4K4
来自专栏信安之路

【作者投稿】无线渗透(序章)—MITM

中间人攻击(MITM)是一种由来已久的攻击手段,简单点说也就是截获你的流量,然后篡改或者嗅探流量,而且就算是老成的网络“高手”也不一定能发现自己中招了,接下来就...

720
来自专栏黄子玥的专栏

深入理解websocket传输过程

上一篇已经大概介绍了websocket是基于tcp传输的上层协议,且握手方式借用了http的过程,这个过程我们通过一个强大的网络抓包工具wires...

1554
来自专栏重庆的技术分享区

五(七)层互联网协议(计算机网络)深入浅出,看完必懂【图文三】

1493
来自专栏程序员与猫

从输入url到页面返回到底发生了什么

1. 前言 Google应该是开发者平日里用得最多的网站之一,今早笔者在浏览器地址栏里键入www.google.com的时候,突然想了解下这背后的网络通信过程究...

2048

扫码关注云+社区