代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用。 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识

本文主要介绍代理的事例,分析一个真实的案例来帮助理解HTTP代理的原理。

HTTP代理的原理

下面分析一个 http://iflow.uczzd.cn/iflow/api/v1/client_event?app=uc-iflow...经过代理服务器的HTTP请求。 iflow.uczzd.cn的公网IP是140.205.136.82(各地测试到的IP有可能不同),我的局域网IP是192.168.100.115,代理服务器的IP是192.168.16.35

再简单说一下HTTP请求的流程: 192.168.100.115140.205.136.82发送HTTP请求,其中192.168.16.35是代理服务器。

一、 监控请求

通过网络监控获取到的HTTP请求如下:

可以看到在网络监控中,有两个HTTP请求,一个是向代理服务器发送的HTTP,另一个是代理服务器想目标服务器发送的HTTP请求。这两个请求的请求体是一样的,如下图:

客户端向代理服务器发送的HTTP报文:

代理服务器想目标服务器发送的HTTP报文:

二、 推测处理流程

可以看到,两张图片的HTTP报文是相同的(也有可能Header不同),我们可以推测出客户端和代理服务器的处理流程,如下:

客户端的处理流程:

代理服务器的处理流程:

三、 验证推测的处理流程

在推测出客户端和代理服务器的处理逻辑后,我们需要验证我们的推测是否正确。

我们可以构造一个TCP请求,客户端连接到代理服务器,发送HTTP报文,报文的内容是客户端直接发送到服务器的内容。

例如:直接访问 http://www.cnblogs.com/tgwang/的HTTP报文是:

GET http://www.cnblogs.com/tgwang/ HTTP/1.1
Host: www.cnblogs.com
Connection: close
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36
Referer: http://www.cnblogs.com/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: ***
If-Modified-Since: Sat, 30 Jan 2016 02:48:23 GMT

我们构造一个TCP请求,连接代理服务器,报文的内容也是发送上面的报文,看代理服务器能否正常请求博客园的数据,如果可以正常请求,说明我们对于客户端和代理服务器推测是正确的,如果没有请求博客园数据,而是返回代理服务器的相关信息,表示推测错误。

下面我使用python向代理服务器127.0.0.1:8888发送一个TCP请求,为了在代理服务器中能找到此请求,我在Header中增加了一个Token,使用UUID标识(见红框)。

运行程序,发送TCP请求,报文如下:

查看代理服务器的信息,可知,HTTP请求正常发送到博客园,并且正常响应,如下图:

到此推测验证完成,符合预期结果

书本上的理论看多了,就以为自己看懂了,然而我们真的懂了吗?没动手实践过能算是懂了吗

转:https://www.cnblogs.com/tgwang/p/5170480.html

浅析HTTP代理原理--转的更多相关文章

  1. 浅析HTTP代理原理

    代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...

  2. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  3. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  4. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

  5. Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结

    Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结 1. 普通代理1 1.1.1. 普通代理2 2. 隧道代理3 3. 反向代理 4 4. 正向代理也可以使用apache实现 ...

  6. HTTP 代理原理及实现

    本文转载自 https://imququ.com/post/web-proxy.html HTTP 代理原理及实现(一) 文章目录 普通代理 隧道代理 Web 代理是一种存在于网络中间的实体,提供各式 ...

  7. 动态代理 原理简析(java. 动态编译,动态代理)

    动态代理: 1.动态编译 JavaCompiler.CompilationTask 动态编译想理解自己查API文档 2.反射被代理类 主要使用Method.invoke(Object o,Object ...

  8. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  9. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

随机推荐

  1. STL源码剖析-vector

    STL(Standard Template Library) C++标准模板库,acm选手一定对它不陌生,除了算法,那几乎是“吃饭的家伙了”.我们使用库函数非常方便,且非常高效(相对于自己实现来说). ...

  2. C++,std::shared_future的使用

    今天给大家分享一个类似多线程任务的方法,具体如下: std::shared_future<int> tmp = std::async(p1,p2,p3); int tmpInt = tmp ...

  3. 织梦CMS增加复制文档功能

    打开后台目录(/dede)下archives_do.php约430行下添加: /*----------------------------- //复制文档 ---------------------- ...

  4. 【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈

    第1章   当前主流的小型嵌入式网络协议栈 这几年物联网发展迅猛,各种新产品.新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议栈. 1.1  当前主流的嵌入式网络协议栈 1.2  u ...

  5. C#多线程和线程池 【转】

    1.概念  1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,C ...

  6. 从0开始的Python学习015输入与输出

    简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...

  7. 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)

    为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...

  8. Cordova入门系列(一)创建项目 转发 https://www.cnblogs.com/lishuxue/p/6008678.html

    版权声明:本文为博主原创文章,转载请注明出处 Cordova是什么? 初学Cordova的人,虽然了解一点点,知道Cordova是用来将html, css, js变成app的,但并不知道到底是怎么用的 ...

  9. .NET开源快速开发框架Colder发布 (NET452+AdminLTE版)

    .NET开源快速开发框架Colder(NET452+AdminLTE版) 引言 半年前将基于Easyui的快速开发框架开源,三个版本(NET4.52,NETCore和NET4.0)总共荣获200+星, ...

  10. linux-----docker

    docker简介 Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源. Doc ...