版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
2012-6-14 SamZhang 最近一直在做关于互联网的一些事情,所以今天我想以互联网用户的角度看看互联网协议是如何工作的,并对 HTTP 协议进行详解,以便更好的理解网络通信,为自己的互联网小事业尽一份心意。 一、网络通信依靠数据包的传递 数据传递是这样的,一般由一台电脑向另一台远程电脑发出请求数据包,而另一端的远程电脑返回给这台所请求的数据包,这样就完成了一次网络通信,网络通信发送的数据包一般为如图所示的格式。
http 协议详解之 网络通信数据包格式 我们先不管它是如何发送出去的,先让我看看以太网表头、 IP 标头、 TCP 标头以及应用层数据包(主要进行 HTTP 协议的详解)里面到底是什么东西,下面我将使用 visual sniffer 工具解析下各个数据段的内容。下面开始访问一个 www. 的网站,获得了以下信息: GET / HTTP/1.1 Host: www. User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Cookie: CNZZDATA4158082=cnzz_eid=32769983-1337692276-&ntime=1339403774&cnzz_a=11&retime=1339403808613&sin=none …… 详细解释下: 1. 应用层数据包内容: 这个信息是 HTTP 协议部分的内容, HTTP 协议属于应用层协议,即下图所示部分内容;
http 协议详解之应用层数据包内容 HTTP 是一个属于应用层的面向对象的协议,由于它的简单快速,被互联网广泛采用,目前使用的是 HTTP1.1 协议版本。 HTTP 协议详解之 HTTP URL HTTP URL (URL 是一种特殊类型的 URI — Uniform Resource Identifier ,通用资源标志符,包含了用于查找某个资源的足够的信息 ) 的格式如下: http://host[":"port][abs_path] http 表明用 HTTP 协议定位网络资源; host 表明需要访问的远程 Internet 主机域名或者 IP 地址; port 是所访问远程主机的端口号,没显示的话则表明使用缺省端口 80 ; abs_path 指定了所要请求资源的 URI ;如果 URL 中没有给出 abs_path ,那么当它作为请求 URI 时,必须以“ / ”的形式给出,通常这个工作浏览器自动帮我们完成。 eg: 1 )输入: www. 浏览器自动转换成: http://www./ 2 ) http:192.168.0.116:8080/default.asp HTTP 协议详解之 HTTP 请求 http 请求有三部分组成:请求行、消息报头、请求的正文 1 )“请求行”格式 : Method (请求方法)— Request URI (请求的地址)— HTTP Version ( http 协议版本)— CRLF (回车换行); 请求方法很多,列举常用方法的解释如下: GET :请求获取 Request-URI 所标识的资源 POST :在 Request-URI 所标识的资源后附加新的数据 HEAD :请求获取由 Request-URI 所标识的资源的响应消息报头 应用举例: GET 方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用 GET 方法向服务器获取资源, eg: GET /themes/Discuz7/source/style.css.asp HTTP/1.1 (CRLF) POST 方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。 eg : POST /reg.asp HTTP/ (CRLF) Accept:image/gif,image/x-xbit,... (CRLF) ... HOST:www. (CRLF) Content-Length:22 (CRLF) Connection:Keep-Alive (CRLF) Cache-Control:no-cache (CRLF) (CRLF) // 该 CRLF 表示消息报头已经结束,在此之前为消息报头 user=jeffrey&pwd=1234 // 此行以下为提交的数据 HEAD 方法与 GET 方法几乎是一样的,对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 请求所得到的信息是相同的。 2 )“消息报头”格式: HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。 HTTP 消息报头包括普通报头、请求报头、响应报头、实体报头。 每一个报头域都是由名字 + “:” + 空格 + 值 组成,消息报头域的名字是大小写无关的。 i .普通报头 在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。 eg : Cache-Control 用于指定缓存指令,缓存指令是单向的。 请求时的缓存指令包括: no-cache (不能缓存)、 no-store 、 max-age 、 max-stale 、 min-fresh 、 only-if-cached; 响应时的缓存指令包括: public 、 private 、 no-cache 、 no-store 等。 Connection 普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“ close ”选项,通知服务器,在响应完成后,关闭连接 ii .请求报头 请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 常用的请求报头详解如下: Host 报头域(必需): Host 请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的, eg : 我们在浏览器中输入: http://www./ 浏览器发送的请求消息中,就会包含 Host 请求报头域,如下: Host : www. 此处使用缺省端口号 80 ,若指定了端口号,则变成: Host : www.: 指定端口号 User-Agent 报头域(非必需): 我们上网会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,实际上,服务器应用程序就是从 User-Agent 这个请求报头域中获取到这些信息。这个报头域是非必需的。 Accept 报头域 Accept 请求报头域用于指定客户端接受哪些类型的信息。 eg : Accept : image/gif ,表明客户端希望接受 GIF 图象格式的资源; Accept : text/html ,表明客户端希望接受 html 文本。 Accept-Charset 报头域 Accept-Charset 请求报头域用于指定客户端接受的字符集。 eg : Accept-Charset:iso-8859-1,gb2312. 如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。 Accept-Encoding 报头域 Accept-Encoding 请求报头域类似于 Accept ,但是它是用于指定可接受的内容编码。 eg : Accept-Encoding:gzip.deflate. 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。 Accept-Language 报头域 Accept-Language 请求报头域类似于 Accept ,但是它是用于指定一种自然语言。 eg : Accept-Language:zh-cn. 如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。 iii .实体报头(略) 3 )请求正文(略) 更深一步了解 HTTP 协议,可以查看 RFC2616 ,在 http://www./rfc 上找到该文件。 2. TCP 协议层内容: TCP 协议层内容包含了 TCP 标头和应用层数据包,如下图所示。
http 协议详解之 TCP 协议层内容 TCP 数据包主要是设置发出方和接收方的端口号,像我们访问 www. 的时候发出方用的是 4026 端口,接收方用的是 80 端口,如图所示。
http 协议详解之 TCP 设置端口号 3. IP 协议层内容: 将 TCP 协议层内容嵌入 IP 协议层之后就是 IP 数据包了,如图所示。
http 协议详解之 IP 数据包 IP 数据包包含了请求发出方和接收方的 IP 地址。 4. 以太网协议层内容: IP 数据包嵌入以太网协议层即为以太网数据包,就如本文开头那张图所示。因此,以太网标头主要是设置发出方和接收方的 MAC 地址,即无力网卡地址。 现在终于明白了 HTTP 协议详解的知识了。 |
|