搜档网
当前位置:搜档网 › (参考)应用层网络协议分析

(参考)应用层网络协议分析

HTTP网页访问的协议分析

在协议模型中,应用层是用户与计算机进行实际通信的地方,只有当马上就要访问网络时,才会实际上用到这一层。例如,我们可以从系统中卸载掉任何联网组件,如TCP/IP、网卡(NIC)等,仍可以使用IE来浏览本地的HTML文档。可如果我们试图浏览必须使用HTTP 的文档,或者用FTP下载一个文件,事情就没那么容易了。此时,IE将尝试访问应用层来响应这一类请求。因此,应用层也可被看作是实际应用程序和下一层(OSI模型中为表示层,TCP/IP模型中为传输层)之间的接口,它通过某种方式把应用程序的有关信息送到协议栈的下面各层。

应用层协议则是实现用户和系统之间接口的工具,用户可通过这些协议方便地访问网络资源,实现信息共享,HTTP则是其中一种。

HTTP(超文本传输协议)是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

HTTP是基于请求/响应方式的。它的运作方式很简单:一个客户机与服务器建立连接后,发送一个请求给服务器,服务器接到请求后,给予相应的响应报文。其中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。因此,当网络中的任一台拥有可被访问的页面的计算机被其它计算机访问时,它便是服务器,而当它访问其它浏览非本地的HTTP文档时,它便是客户端。因此,我们可以在局域网中搭建简单的环境来观察分析访问HTTP的工作流程。

最简单的情况可能是在用户和服务器之间通过一个单独的连接来完成,如图1-1:

图1-1

根据图连接好以及配好相应IP后,测试网络互通。而后,在server上建立HTTP服务器。首先在控制面板\添加删除程序\添加删除Windows组件中查看Internet信息服务(IIS)是否装上,若没有则安装,若安装好,则可以进入管理工具\Internet服务管理器,在默认WEB站点下建立自己的站点及目录。而后,在client浏览器地址栏中键入http://31.0.0.1便可浏览位于server端默认站点目录下网页。

在此过程中,我们通过Ethereal所抓的数据包如下:

1、数据链路层:

Frame 14 (334 bytes on wire, 334 bytes captured)表示第14个帧,传输334个字节,捕获334个字节,包中的

Frame Number: 14

Packet Length: 334 bytes

Capture Length: 334 bytes

也指明该帧是第14帧,传输334字节,捕获334字节。

[Protocols in frame: eth:ip:tcp:http]可看出所封装的层结构:应用层用的是HTTP协议,传输层用的是TCP协议,网络层用的是IP协议。

[Coloring Rule String Name: HTTP]

[Coloring Rule String: http || tcp.port = = 80 ] 从这里我们可以知道,HTTP 对应的TCP端口号为80。

在TCP和UDP中,都采用了16bit端口号来识别应用程序。其中,低于1024的端口号被称为众所周知的端口号,它们由RFC3232所定义,大于等于1024的端口号被上层用来建立与其他主机的会话,并且在TCP数据段中被TCP用来作为源方和目的方的地址,具体将在下面传输层中分析。

2、以太网帧:

从以太网帧中,我们可以看到,目的的MAC地址为:00: 16: d3: ee: 0e: 3f ,源MAC 地址为:00: 01: 02: 28: 1a: 34。

Multicast: This is a UNICAT frame 表示是单播帧。

Type:IP(0x0800)表示帧中封装了IP分组,若Type为0x0806表示帧中封装了ARP 分组,这两种帧的分组会被取出,并交付给相应的子程序。

3、IP包:

Internet Protocol, Src: 31.0.0.2 (31.0.0.2), Dst: 31.0.0.1(31.0.0.1) 可了解目地IP和源IP,此包是client端向server发送的http请求报文,所以,目地IP是31.0.0.1,源IP是31.0.0.2。

Version: 4 表示版本4。IPv6的版本号为6。

Header length: 20 bytes 首部长为20字节。它是以4B为单位进行计数的,该字段是可变的,当没有选项时,首部长为20B,对应该字段值为5;当有选项时,该字段最大值为15,对应60B的首部长度。

Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 表示服务类型。不同的应用有不同的服务质量要求,该字段则是体现网络层的IP分组有不同的服务类型,但在大多数的TCP/IP实现中并不支持服务类型,因此这些位置都为0,路由器也会忽略该字段。

Total Length: 320 表示IP数据包的总长度为 320字节。

Identification: 0x0432(1074)标识位,在系统范围内,每发出一个IP包,其值自动增加1。

Flags: 0x04 (Don’t Fragment) 表示没有分段。

保留位:1位

不分段(DF,Don't Fragment):1位

更多段(MF,More Fragments):1位

Fragment offset: 0 表示分段偏移为0。

Time to live: 128 生命周期值,当每经过1个路由器,其值自动减1。

Protocol: TCP (0x06) 负载协议,表示IP数据包负载的协议。

Header checksum: 0xb783[ correct ]首部校验和,只对分组的首部进行校验,而不对分组的数据进行校验。

Source: 31.0.0.2 ( 31.0.0.2 ) 表示源IP地址。

Destination: 31.0.0.1 ( 31.0.0.1 ) 表示目的IP地址。

4、TCP报文:

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP 连接的端口号是80。

通过数据包,我们也可清楚地了解到TCP连接的建立:

(1)SYN报文:

该报文由client发起,Sequence number :0 表示客户端向服务器端发送数据时的第一个数据字节的序号就是0。Client建立的源端口号为1102,请求的是http服务(目的端口为80)。Flags:0x0002(SYN) 该标志位表示了这是一个SYN报文,可看到SYN位置1,而

ACK位置0,这表明这是一个tcp连接请求。

(2)SYN+ACK报文:

此报文为服server同意接受连接时,向client发回的报文,用于回应client的建立连接的请求。Sequenen number: 0 表示server向client发送数据时第一个数据字节的序号为0。Tcp的通信的全双工的,在每个方向上的编号是独立的。Acknowledgement number:1为确认号字段,表明server下一个要接受的报文段中第一个数据字节的编号。该报文段的标志位变成了Flags:0x00012(SYN,ACK),表示这是一个SYN+ACK报文,可看到SYN位置1, ACK位置1,这表明服务器端接受连接,则使用SYN位和ACK位作为应答来回应客户端的连接请求。

(3)ACK报文:

这是由client发送的确认报文,Sequence number :1 表示客户端向服务器端发送数据时的数据字节的序号为1(其值为客户端向服务器端发送数据时的第一个数据字节的序号

+1),Acknowledgement number:1为确认号字段,表明client下一个要接受的报文段中第一个数据字节的编号。此报文段的标志位为Flags:0x00010(ACK),表示这是一个ACK报文,可看到SYN位置0,而ACK位置1,客户端使用ACK标志和确认号字段来确认收到了服务器端的SYN+ACK报文。

通过这3个报文的交换,完成了TCP连接的建立。

(4)client请求http的报文:

Source port: 1102 ( 1102 ) 表示源主机所建立的源端口号为1102。

Destination port: http ( 80 ) 表示目的端口号为80,即接收方主机本次连接建立HTTP连接。

源主机是从1024——65535中指定的源端口号,80是被定义为http服务的端口号,TCP 不像在数据链路层和网络层中的协议那样,它和它的上层协议不使用硬件的和逻辑的地址来区别发送方的主机地址,它们使用端口号来实现。

Sequenen number: 1 序列号为1。上一报文中,客户端的Acknowledgement number 也表明将接收第一个数据字节编号为1。

[Next sequenen number: 281]要发送的下一序列号为:281。

Header length: 20 bytes 首部长20B,它与IP首部长度一样是可变的,都取决于可选项。

Flags: 0x0018 ( PSH, ACK )

Acknowledgment: set 确认位,用来指示确认号有效,当它置0时,说明该报文不包含确认信息,确认号字段值则被忽略。

Push:set 表示请求推送,要立即将报文交给接收应用进程,而不再等到整个缓存满后才向上交付。

Window size:65535 指明窗口大小,其范围为0~65535,当其大小为0时,表示收到了包括确认号减1在内的所有数据,但当前接收方缓存已满,不能再接收,希望发送方不再发送数据了。而发送方也必需要等到收到窗口大小非0的确认报文后,才能继续发送。

5、HTTP报文:

(1)请求报文:

GET/HTTP/1.1\r\n 表示是请求http服务的报文,http的版本为HTTP1.1。至今,HTTP 有三个版本:0.9、1.0、1.1,0.9只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息;

1.0这是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中;1.1当前版本,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度,除此之外,它还有一个明显的改进——错误通知的管理。在http的响应报文中,200多表示正常,300多表示请求重定向到其它的URL,400多表示客户端出现差错,500多表示服务器端出现差错。

GET是表示向服务器请求一个文件,可GET仅仅是HTTP众多方法中的一种,它还有POST:向服务器发送数据让服务器进行处理;PU和:向服务器发送数据并存储在服务器内部;HEAD:检查一个对象是否存在;DELET:表示从服务器上删除一个文件;CONNET:表示对通道提供支;TRACE:跟踪到服务器的路径;OPTIONS:查询Web服务器的性能。

Accept: application/x-shockwave-flash, image/gif, image/-xbitmap, image/jpeg, image/pjpeg,*/*\r\n 表示客户能够接受的媒体格式

Accept-Language: zh-cn\r\n 表示客户能够处理的字符集:简体中文

Accept-Encoding:gzip, deflate\r\n 表示客户能够处理的编码方案。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

User-Agent: Mozilla/4.0 ( compatible; MSIE 6.0; windows NT 5.1; SV1)\r\n 包含HTTP客户端运行的浏览器类型。

Host:31.0.0.1\r\n

Connection:Keep-Alive\r\n 表示此HTTP连接的类型为Keep-Alive。

在HTTP/1.1 协议中,所有的请求头,除Host外,其余都是可选的。

服务器端接收到客户端请求的数据后,服务器便会向客户回送请求,将HTML文件发给客户端。但由于考虑到大数据易出错,并且传输时会一直占用带宽,重传时也会造成大量的带宽浪费,以及设备的缓存容量等问题,TCP便将传输的数据分段在较小的范围内并做好相应标记,以提高传输效率。在以太网中,数据包的大小在64-1518字节之间,如果客户端请求的页面大于1518字节,则会将请求的页面分段传送给客户端被分段的数据及控制信息都由TCP控制。

我们可以看到,在HTTP请求报文之后,有10个TCP报文,它们是服务器端向客户端发送的被分段的包含HTML数据应答报文及客户端接收到后的确认报文。我们将列举其中的三个作为说明,以下是服务器回送用户要求的html文件的第一个数据包和第二个数据包的内容:

Sequence number:1 序列号在TCP连接过程中,服务器端向客户端发送的同意连接中序列号为0,所以此序列号为1 。

Next Sequence number:1461 表示服务器端发送的下一个序列号为1461。

Ackonwledgement number:281 表示服务器端下一个要接受的报文段中第一个数据字节的编号为281。

Sequence number:1461 表示服务器端向客户端发送的序列号,与上一报文中Next Sequence number:1461吻合。

Next sequence number:2921 表示服务器端发送的下一个序列号为2921。

客户端确认接收到的数据:

Sequence number:281 表示序列号为281,这与服务器端将要接收的的报文段中第一个数据字节的编号为281相吻合。

Acknowledgement number:2921 表示客户端下一个要接收的报文段的中第一个字节的序列号为2921,这与服务器端发送的下一个序列号2921相吻合。

Ack位置1 确认接收到的信息。由于使用了选择性确认机制,所以服务器端只需要发送接收到确认报文中标志的下一个报文便可。

除此之外,我们还将注意到,期间每个服务器端发TCP报文中都有如下重组字段:

Reassembled PDU in frame: 25 表示在第25帧(包含响应报文的帧)中重组分段信息。

(2)响应报文:

首先我们看到了分块的重组信息,第15、16、18、20、21、23、25帧中的数据被重组到了第25帧中。

其次我们来重点关注下HTTP的响应部分:

相关主题