浅谈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协议安全么?如果不安全,如何实现安全上网?
领取专属 10元无门槛券
私享最新 技术干货