浅谈http协议

浅谈http协议(如何TCP实现HTTP)

前言

上一期的题在这里不解答了,最后演变的局势是一个马后炮绝杀。而本期将进入技术篇——浅谈http协议。

正文

首先我们需要抓取http协议包,一般说到抓包,很多人会想到用抓包工具,如fiddler、wireshark等。这些工具确实不错,不过本文在这里不采用抓包工具,而是用另外一些工具进行“抓包”,在这将介绍两中“抓包”方法。

可以看出浏览器把请求分为两部分,即请求标头和请求正文(其实还可以细分的,我们在另一个方式下将对请求在进行细分),这里就出现一个很奇葩的现象了,请求正文是空的?按照道理来讲请求正文应该是“action=test”才对。然后仔细观看,在请求标头里出现“GET /? action=test”。然后我们去抓一下post请求:

这样,真相也就出来了,请求正文是post请求的参数,无论是文件流还是键值对,都将在这实现。

然后,来谈谈第二种方式,本文着重要讲的就是这种方式。大家都知道http是基于tcp协议的,但是在浏览器上你根本就不知道怎么通过tcp协议封装的,很多开发人员也是局限在这里,根本就不知道什么是http协议。如果你清楚了解http协议,你可以做很多事情,比如自己实现上期的代理服务器(CCPROXY)。为了让读者们清楚了解http协议,我们打开网络调试助手,开启一个8088端口。然后在浏览器上访问http://192.168.0.107:8088

而两个回车(如果是get请求一定要加上\r\n\r\n,否则将不能作为http请求发送),分别对应请求空行和请求正文,无论是get请求还是post请求,它都一样一样是这样的格式。测试中我们可以发现,浏览器一直加载,知道超时出错。这个时候就需要响应的格式了,响应格式如下

其中http的响应吗主要可以分为以下几类:

然后我们继续试验,当浏览器发送请求后,我们按照响应格式,回应如下

然后浏览器响应如下

然后我们再测试下响应码为302的重定向,让其重定向到韩师主页,两个回车记得加上。

然后,浏览器就定向到韩师了。

那么我们如何模拟http请求来访问韩师主页呢?同样我们先进行“抓包”,读者估计还是一下子想到用抓包工具进行抓包,但本文还是不采用抓包工具,我们使用上两期教大家的方法,把http://192.168.0.107:8088/作为代理服务器,设置完成后我们来访问以下韩师官网http://www.hstc.edu.cn/,然后我们可以收到如下数据

至此,最基本的的http协议已通过TCP协议初步实现的方法。当然http协议还有很多规范,具体可以查阅下相关资料。深入了解http协议后你可以很多事情,例如教务系统外网登录,实现起来原理也简单,只需要将内网服务器映射到外网,外网即可通过内网访问教务系统。原理上和上两期的内容差不多。你也可以实现短信轰炸机等等多数和http有关的事情。在这里,给大家实现一下上两期的代理服务器。

主要实现的是线程的函数,线程函数如下:

public voidrun() {

String line;

String host;

intport=80;

Socket outbound=null;

try{

socket.setSoTimeout(TIMEOUT);

InputStream is=socket.getInputStream();

OutputStream os=null;

try{

line="";

host="";

intstate=;

booleanspace;

while(true) {

intc=is.read();

if(c==-1)break;;

space=Character.isWhitespace((char)c);

switch(state) {

case:

if(space)continue;

state=1;

case1:

if(space) {

state=2;

continue;

}

line=line+(char)c;

break;

case2:

if(space)continue;

state=3;

case3:

if(space) {

state=4;

String host0=host;

intn;

n=host.indexOf("//");

if(n!=-1) host=host.substring(n+2);

n=host.indexOf('/');

if(n!=-1) host=host.substring(,n);

n=host.indexOf(":");

if(n!=-1) {

port=Integer.parseInt(host.substring(n+1));

host=host.substring(,n);

}

host=processHostName(host0,host,port,socket);

intretry=CONNECT_RETRIES;

while(retry--!=) {

try{

outbound=newSocket(host,port);

break;

}catch(Exception e) { }

Thread.sleep(CONNECT_PAUSE);

}

if(outbound==null)break;

outbound.setSoTimeout(TIMEOUT);

os=outbound.getOutputStream();

os.write(line.getBytes());

os.write(' ');

os.write(host0.getBytes());

os.write(' ');

break;

}

host=host+(char)c;

break;

}

}

}

catch(IOException e) { }

}catch(Exception e) { }

finally{

try{socket.close();}catch(Exception e1) {}

try{ outbound.close();}catch(Exception e2) {}

}

}

然后我们用Intellij Idea执行一下

至此,http讲解结束,感兴趣的可以跟笔者要代理服务器源码,至于https就由读者自己去分析和实现了。

PC端全局实现

安装包在此处,链接:https://pan.baidu.com/s/1f7uRR1GfG8wGDCubmBlbpQ 密码:6dca

添加地址即可,至此就实现了全局共享上网,如果A电脑没开代理服务器时,记得关闭软件哦。至于本软件只有31天的有效期如何解决?答案是自己百度吧,很简单的。欢迎滑到底部对笔者进行赞赏。

结束语

本期推文总的来说是第二篇技术文了,把这篇技术文共享给大家,希望大家对http协议有更深层次的理解,也欢迎大家关注我的公众号,更欢迎大家私聊笔者的公众号进行探讨。公众号开启了赞赏功能,欢迎大家进行赞赏。

最后进入每日一题活动,你觉得http/https协议安全么?如果不安全,如何实现安全上网?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180917G1HTPW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券