HTTP探究(原创)

我事先声明下,我写的都是基础篇,高级特性不是我研究的范畴。

        我今天选择探究的方向是HTTP协议,超文本传输协议,基于TCP。实验环境如下图所示。

图片

        首先我用浏览器访问地址:http://192.168.0.2/,然后我用Wireshark截了整个过程的报文。截图如下。图片

        前面是ARP和TCP三次握手,暂时不分析。下面那个就是HTTP的请求报文了,源主机为客户端,目的为服务器。使用了GET方法,请求的HTTP版本为1.1。下图为请求报文的详细格式。

图片

        这里面有几个比较重要,第一句是最关键的,使用“GET”方法,请求目录为“/”表示根目录,版本号是“HTTP/1.1”,还有一个比较重要的是“Host:192.168.0.2”,表明本地地址,这两个是一个请求报文必不可少的信息。从上面的过程可以看出。服务器有回复。在第13条的地方回复了一个报文。内容如下图。

图片

        看到我们熟悉的html了吧?这个经过浏览器解释,输出一句“hello world!”。从图上可以看出服务器为IIS6.0,解释器为ASP.NET和PHP。过程似乎一目了然。

        既然可以用浏览器访问,我可不可以仿制一个HTTP请求呢?嗯,似乎可以,我试图用TELNET进行连接。我打开cmd.exe,输入telnet 192.168.0.2 80,telnet80端口,似乎没问题,这才只是连接过程。敲完回车,连接就建立了。那么我需要发送请求了。但你刚敲完回车,屏幕就变黑了,什么都不显示,这时候你需要快速的敲“GET / HTTP/1.1”,回车,“HOST:”,回车,再回车。敲的过程中没有回显,且必须速度很快,否则连接就被复位了。下面就可以显示服务器应答报文了。过程截图如下。

图片

图片

        不过了解我的人都知道我比较能折腾,我还嫌不够尽兴,我准备编程验证下到底是不是这样。于是我用JAVA写了一个请求报文的程序。代码如下:

import java.io.*;
import java.net.*;

public class inout {

 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  Socket sock = new Socket("192.168.0.2",80);
  InputStream in = sock.getInputStream();
  OutputStream out = sock.getOutputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(in));
  String s = "GET / HTTP/1.1/r/nHost:192.168.0.1/r/n/r/n";
  out.write(s.getBytes());
  out.flush();
  System.out.println(br.readLine());
  while(br.ready()){
   System.out.println(br.readLine());

  }
 }
}

        呵呵,有回复的哦。回复如下:

HTTP/1.1 200 OK
Connection: close
Date: Sat, 09 Jan 2010 15:38:19 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-Powered-By: PHP/5.2.10
Content-type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>服务器首页</title>
</head>

<body>
hello world!</body>
</html>

        至此我终于尽兴了。知道了这个,我们就可以往上学习ASP,PHP,JSP等知识,最起码我们知道,服务器发过来的是HTML或是XML等格式。其实服务器不过起动态解释作用罢了。往下可以学习底层协议。呵呵,说完啦。我一个晚上就浪费在上面了,看看吧,或许有帮助!

        (ps:我以前一直以为HTTP连接会被保持,后来猜想保持那么多连接很耗资源,可能会挂起吧,果然,服务器回复完就立即隐性地请求关闭连接。可是连接信息会被放在服务器内存中,以便客户端POST_BACK时,能区别处理。这就是传说中的SESSION了!有了它,论坛变成了可能!也或许服务器只保存一个客户编号,客户机接到请求应答时,把编号写入本地CACHE,客户机POST_BACK时用GET方法,在地址后缀上编号,例如,http://www.bbs.com?client_id=1010,或用POST隐性发送编号。这样既节省了服务器内存,也简化了匹配客户连接的过程。呵呵,只是猜想,下次去验证下!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值