您的位置:首页 > 理论基础 > 计算机网络

http协议详细总结

2013-12-06 19:12 225 查看
研究的是在基于nginx的智能web应用防火墙,它涉及到目前广泛使用的http协议,web服务器和web代理,以及DNS解析。为此,本章首先介绍目前Internet上基于HTTP的通信架构;以及DNS解析流程。

1、基于HTTP的通信架构

超文本传输协议(Hyper Text Transfer Protocol,HTTP )是现代Internet上Web应用的重要部件,超文件传输协议最初是为了童工一种发布和接受HTML页面的方法而设计的协议, 它允许将超文本标记语言(HTML)文档从web服务器传送到web游览器。实际上,该协议支持的服务器并不限于www,用户可以采用不同的协议访问不同的服务,比如FTP,SMTP等。本节首先简要介绍HTTP协议及其发送方式流程。

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于web服务器和web服务器之间的双工通信。

2 、HTTP

HTTP协议的运作方式是基于请求/响应模式。在HTTP协议的实现中,至少包括两个通信实体:客户端游览器与服务器端。在HTTP协议下,当客户端需要重服务器端获取某一资源时,需要经历以下的过程:

第一步:用户输入连接地址,游览器向本地域名服务器发送请求,获取所输连接地址的计算机的ip地址。

第二步:获得ip地址后,游览器申请与服务器进程建立连接,一般是TCP连接。如果服务器准备就绪,则连接成功。

第三步:游览器运行HTTP,发出请求,并申明要获取的文档名称和合法的文档格式。

第四步;含有所需文档的服务器通过发送HTTP应答客户的HTTP请求,并按要求的文档格式将所请求的文档传送给游览器。

第五步:用户游览文档。若无新的请求,一定时间后服务器关闭TCP连接。

获取资源流程实际效果图参考附录HTTP的操作过程。DNS解析流程,后文中将讲解到。

(1) HTTP请求

一个典型的HTTP请求通常包括三部分

1.起始行(start line)

2.首部(header)

3.主体(body)

报文格式为:

起始行: <method> <request-URL> <version>

首部 : <header>

主体 <entity-body>

方法(Method):希望服务器对资源执行的动作。常用的有GET,POST。

请求URL(request-URL):命名了所请求资源,或者URL路径组建的完整URL。

版本(version):报文所使用的HTTP版本。

首部(header):有多个首部,每个首部都包含了一个名字,后面跟着一个冒号(:)然后是一个空格和值。

更多的的方法和首部详见附录。

我们以图1-1为例,说明一个HTTP请求的结构:



图1

对各行的进行解释:

第一行:表示游览器用GET的方式请求一个文档“/”,使用的HTTP版本为1.1。

第二行:表示客户所请求的内容来自哪一个主机名下,当一个服务器同时拥有多

个主机名(即多个域名公用一个ip地址或者服务器时),用户使用 这个 请求头来指定服务器从哪一个文档中寻找客户请求的内容。这里是从“/”即根域请求。

第三行:表示游览器的版本及所运行的的操作系统。

用Gecko排版引擎运行5.0版本的Mozilla,兼容了Firefox,操作系统为windows NT 6.1

第四行:告诉服务器游览器此次能接收的文件的类型

这里游览器能接收的文件包括html,xhtml+xml,xml。当然在其他http包中还有其他的格式如png和任意格式的图片文件。



第五行:表示游览器能接收到的页面语言。当服务器的页面存在多个语言版本时, 永和可以使用该选项指定一种或多种语言。

第六行:表示游览器能解压的文档类型。这里能够解压gzip和deflate。

第七行:用于客户端识别和跟踪的扩展首部。

第八行:表示客户希望服务器端继续保持TCP连接直到明确断开为止,在 HTTP/1.1中,默认情况下,服务器总是保持TCP连接知道用户指定关闭为止。

第九行:为空白行位于首部与实体的主体部分。

(2)HTTP响应

与请求相似,HTTP响应也由五部分组成:

1.起始行(start line)

2.首部(header)

3.主体(body)

响应报文的格式:

起始行:<version><status><reason-phrass>

首部: <headers>

主体:<entity-body>

状态码(status):这三位数字描述了请求过程中所发生的情况。

Table 3-2. Status code classes

Overall range

Defined range

Category

100-199

100-101

Informational

200-299

200-206

Successful

300-399

300-305

Redirection

400-499

400-415

Client error

500-599

500-505

Server error

一个典型的HTTP响应图1-2所示



图2

对各行的的解释:

第一行:表示服务器使用1.1版本的HTTP协议。200表示成功。OK为原因短语。

第二行:报文创建的日期和时间2013年6月8日 11点24分20秒

第三行:

第四行:实体主体部分的长度,这里是4460字节。

第五行:说明报文中对象的媒体类型。

第六行:用于传输对象的缓存信息。

第八行:cookie首部的搭档。

第九行:cookie首部的搭档。

第十行:用户所请求文档的最后修改时间,这个时间常常被用户缓存处理,当修 改时间没有变化时,游览器下次请求就不必请求整个文档,只需要请求其中发生变化的那些内容。

第十一行:是否对某对象进行过编码:这里的编码是gzip。

第十二行:表示客户希望服务器端继续保持TCP连接直到明确断开为止,在 HTTP/1.1中,默认情况下,服务器总是保持TCP连接知道用户指定关闭为止。

HTTP协议的主要特点:

1.支持客户/服务器模式。

2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

现在说明以具体的一个http请求的详细过程



图3

(3)整个过程可以这样理解:

我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切。

首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范。

1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把www.mycompany.com变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。

请求 连接成功建立后,开始向web服务器发送请求,这个请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径/文件名 HTTP/1.0 文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。现在可以发送GET命令:

GET /mydir/index.html HTTP/1.0,

3.应答 web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知浏览器,,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。

4.关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

下面我们具体分析其中的数据包在网络中漫游的经历:

在网络分层结构中,各层之间是严格单向依赖的。“服务”是描述各层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(primitive),如系统调用或库函数。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。网络中的n层总要向n+1层提供比n-1层更完备的服务,否则n层就没有存在的价值。传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制,流量控制,数据排序(报文排序),连接管理等问题,为此提供不同的服务方式。通常传输层的服务通过系统调用的方式提供,以socket的方式。对于客户端,要想建立一个socket连接,需要调用这样一些函数socket() bind() connect(),然后就可以通过send()进行数据发送。

现在看数据包在网络中的穿行过程:

应用层

首先我们可以看到在应用层,根据当前的需求和动作,结合应用层的协议,有我们确定发送的数据内容,我们把这些数据放到一个缓冲区内,然后形成了应用层的报文data。

传输层

这些数据通过传输层发送,比如tcp协议。所以它们会被送到传输层处理,在这里报文打上了传输头的包头,主要包含端口号,以及tcp的各种制信息,这些信息是直接得到的,因为接口中需要指定端口。这样就组成了tcp的数据传送单位segment。tcp是一种端到端的协议,利用这些信息,比如tcp首部中的序号确认序号,根据这些数字,发送的一方不断的进行发送等待确认,发送一个数据段后,会开启一个计数器,只有当收到确认后才会发送下一个,如果超过计数时间仍未收到确认则进行重发,在接受端如果收到错误数据,则将其丢弃,这将导致发送端超时重发。通过tcp协议,控制了数据包的发送序列的产生,不断的调整发送序列,实现流控和数据完整。

网络层

然后待发送的数据段送到网络层,在网络层被打包,这样封装上了网络层的包头,包头内部含有源及目的的ip地址,该层数据发送单位被称为packet。网络层开始负责将这样的数据包在网络上传输,如何穿过路由器,最终到达目的地址。在这里,根据目的ip地址,就需要查找下一跳路由的地址。首先在本机,要查找本机的路由表,在windows上运行route print就可以看到当前路由表内容,有如下几项:

网络目标 网络掩码 网关 接口 跃点数

整个查找过程是这样的:

(1)根据目的地址,得到目的网络号,如果处在同一个内网,则可以直接发送。

(2)如果不是,则查询路由表,找到一个路由。

(3)如果找不到明确的路由,此时在路由表中还会有默认网关,也可称为缺省网关,IP用缺省的网关地址将一个数据传送给下一个指定的路由器,所以网关也可能是路由器,也可能只是内网向特定路由器传输数据的网关。

(4)路由器收到数据后,它再次为远程主机或网络查询路由,若还未找到路由,该数据包将发送到该路由器的缺省网关地址。而数据包中包含一个最大路由跳数,如果超过这个跳数,就会丢弃数据包,这样可以防止无限传递。路由器收到数据包后,只会查看网络层的包裹数据,目的ip。所以说它是工作在网络层,传输层的数据对它来说则是透明的。如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或 “网络不可达”的错误。

以下是一个本机的路由查找的过程:



图4

一个路由器的链路,通常情况下,接口和网关是同一网段的。接口到达该目的地的本路由器的出口ip(对于我们的个人pc来说,通常由机算机A的网卡,用该网卡的IP地址标识,当然一个pc也可以有多个网卡)网关这个概念,主要用于不同子网间的交互,当两个子网内主机A,B要进行通讯时,首先A要将数据发送到它的本地网关,然后网关再将数据发送给B所在的网关,然后网关再发送给B。默认网关,当一个数据包的目的网段不在你的路由记录中,那么,你的路由器该把那个数据包发送到哪里!缺省路由的网关是由你的连接上的默认网关决定的,也就是我们通常在网络连接里配置的那个值。通常接口和网关处在一个子网内,对于路由器来说,因为可能具有不同的接口当数据包到达时,根据网络目标寻找匹配的条目,如果找到,接口则指明了应当从该路由器的那个接口出去,网关则代表了那个子网的网关地址。

第一条 0.0.0.0 0.0.0.0 192.168.137.1 192.168.137.113 281

0.0.0.0代表了缺省路由。该路由记录的意思是:当我接收到一个数据包的目的网段不在我的路由记录中,我会将该数据包通过192.168.137.113这个接口发送到192.168.137.1这个地址,这个地址是下一个路由器的一个接口,这样这个数据包就可以交付给下一个路由器处理,与我无关。该路由记录的线路质量 281。当有多个条目匹配时,会选择具有较小Metric值的那个。

10.8.2.0 255.255.255.0 在链路上 10.8.2.250 20

直联网段的路由记录:当路由器收到发往直联网段的数据包时该如何处理,这种情况,路由记录的接口和网关是同一个。当我接收到一个数据包的目的网段是10.8.2.0时,我会将该数据包通过10.8.2.250这个接口直接发送出去,因为这个端口直接连接着10.8.2.0这个网段,该路由记录的线路质量20(因接口和网关是同一个,表示数据包直接传送给目的地址,不需要再转给路由器)。

当然查找到下一跳ip地址后,还需要知道它的mac地址,这个地址要作为链路层数据装进链路层头部。这时需要arp协议,具体过程是这样的,查找arp缓冲,windows下运行arp -a可以查看当前arp缓冲内容。



图5

如果里面含有对应ip的mac地址,则直接返回。否则需要发生arp请求,该请求包含源的ip和mac地址,还有目的地的ip地址,在网内进行广播,所有的主机会检查自己的ip与该请求中的目的ip是否一样,如果刚好对应则返回自己的mac地址,同时将请求者的ip mac保存。这样就得到了目标ip的mac地址。链路层将mac地址及链路层控制信息加到数据包里,形成Frame,Frame在链路层协议下,完成了相邻的节点间的数据传输,完成连接建立,控制传输速度,数据完整。

物理层

物理线路则只负责该数据以bit为单位从主机传输到下一个目的地。下一个目的地接受到数据后,从物理层得到数据然后经过逐层的解包到链路层到网络层,然后开始上述的处理,在经网络,层链路层,物理层将数据封装好继续传往下一个地址。

3、URL

在智能web应用防火墙讲解时,及在进行应用层HTTP攻击和检测时,必须首先了解URL的格式及每部分的意义。

统一资源定位符(URL,Uniform Resource Locator),也叫网页地址,是因特网上标准的资源地址。作为因特网标准RFC1738,用于完整地描述Internet上网页和其他资源。

URL是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示。URL给资源的位置提供一种抽象的识别的方法,并用这种发放给资源定位。只要能改对资源定位,系统就可以对资源进行各种操作,如存取,更新,替换和查找其属性。URL相当于一个文件名在网络范围的扩展。因此URL是与因特网相连的机器上的任何可访问对象的一个指针。

图6显示了URL如何精确地说明某资源的位子及其如何去访问它。



图6

大多数的URL方案的URL语法都建立在这个由9部分构成的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

格式说明如下:

组件

描述

默认值

方案<scheme>

访问服务器以获取资源时要使用哪种协议。



用户<user>

某些方案访问资源时需要的用户名

匿名

密码<password>

用户名后米娜可能要包含的密码,中间由冒号:分隔

<E-mail地址>

主机<host>

资源宿主服务器的主机名或点分IP地址



端口<port>

资源宿主服务器正在坚挺的端口号。很多方案都有默认端口号(HTTP监听的端口号为:80)

每个方案特有

路径<path>

服务器上资源的本地名,由一个斜杠(/)将其与前面的URL组件分隔开来。路径组件的语法是与服务器和方案有关



参数<params>

某些方案会用这个组件来指定输入的参数。参数为名/值对。URL中可以包含多个参数字段,它们互相之间以及路径的其余部分之间用分号(;)分隔



查询<query>

某些方案会用这个组件传递参数以激活应用程序。查询组件的内容没有通用用格式。用字符“?”将其与URL的其余部分分隔开来



片段<frag>

一小片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器;这个字段是在客户端内部使用的。通过字符“#”将其与URL的其余部分分隔开来



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: