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

相关文章

来自专栏逸鹏说道

用户不在sudoers 文件中。此事将被报告

跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 异常处理汇总-服 务 器 http:/...

3478
来自专栏极客慕白的成长之路

HTTP协议原理及实践

HTTP是在应用层,基于传输层 0x1 低三层 物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结...

1203
来自专栏Petrichor的专栏

ping原理 & 测试操作

  ping是一个用来测试网络连接的程序。它使用ICMP协议,请求目的地给予应答,它可以用来测试网络连通性、网络时延等,通常用来作为可用性的检查。它走在网络层,...

2533
来自专栏LanceToBigData

TCP/IP(六)应用层(DNS和HTTP协议)

前言 到这一篇我已经把TCP/IP五层模型详细的说明了一遍,大体的从物理层到最上层的应用层做了一个大概的了解,其实总体学下来东西非常的多,我们需要经常的去系统性...

2776
来自专栏北京马哥教育

三种不同的负载均衡类型

未使用负载均衡 ? 这种情况下用户直接与web服务器进行连接,且该服务处于单点得状态,如果we server挂掉了,那么后续的所有连接都不回成功,同样的...

3167
来自专栏技术碎碎念

网络编址与端口配置

前段时间的考试题,实验环境Cisco Packet Tracer 6.2sv 一、网络拓扑如下: ? 2.各网段的地址基本需求如下: a.HQ 的 LAN1 网...

3026
来自专栏禅林阆苑

Gulp学习笔记 【原创】

Gulp学习笔记 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csx...

3578
来自专栏贾老师の博客

TCP 参数调优

1844
来自专栏好好学java的技术栈

http简介看这篇就够了

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要...

1052
来自专栏散尽浮华

nginx应用总结(2)--突破高并发的性能优化

在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题。今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经...

2579

扫码关注云+社区