通过wireshark解析http通信原理(图文)

来源:互联网 发布:南京网络问政回复时间 编辑:程序博客网 时间:2024/06/05 19:54

 

 

 

 

 

 

 

 

 

 

目录

 

通过wireshark解析http通信原理(图文)    1

 

1 Wireshark抓包形式    2

1.1 Ethernet 层协议头形式    2

1.2 IP层协议头形式    3

1.3 传输层协议头形式    4

2 Wireshark中的分段    6

2-1 为什么会分段    6

2-2 如何判断    6

3 SEQ和ACK    7

3.1 HTTP之前的三次握手    7

3.2 SEQ和ACK    7

4 关于UDP    8

4-1 UDP协议    8

4-2 DNS协议    8

4-3 DNS应答报文    11

5参考资料    12

 

 

 

当在浏览器地址栏敲入"http://www.ifeng.com/"并按下回车键时,浏览器中将呈现出凤凰网首页。在针对这样一种情景,本文通过wireshark抓取这一过程的数据包,结合TCP协议分析HTTP通信的基本流程。

 

1 Wireshark抓包形式

wireshark以太网帧的封包格式为:

----------------------------------------------------------------------------------------------------

Frame=Ethernet Header +IP Header +TCP Header +TCP Segment Data

----------------------------------------------------------------------------------------------------

(1)Ethernet Header =14 Byte =Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+Type(2 Byte),以太网帧头以下称之为数据帧。

(2)IP Header =20 Byte(without options field),数据在IP层称为Datagram,分片称为Fragment。

(3)TCP Header = 20 Byte(without options field),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。

(4)54个字节后为TCP数据负载部分(Data Portion),即应用层用户数据。

下面以访问www.ifeng.com的网页为例,用wireshark抓包,查找到此请求,查看详情。具体讲解如下:

1.1 Ethernet 层协议头形式

    在wireshark抓包,当点击链路层时,即一所示,链路层的标头被选中,即二所示。被选中的链路层头部有十四个字节,前六个字节表明目的地址,其后六个字节表明原地址,最后两个字节表明网络层协议类型,如图所示为0x0800,即为IP协议。

1.2 IP层协议头形式

    上面根据链路层协议得知,IP层的协议类型是IP,IP协议头格式如下所示,具体描述如下:

根据协议头格式,我们知道IP协议其版本号为4,即IPV4。

首部长度为5,其单位为4个字节,即5个4字节长度,20个字节。

区分服务为0,此字段占1个字节,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过。1998 年这个字段改名为区分服务,只有在使用区分服务(DiffServ)时,这个字段才起作用,一般的情况下都不使用这个字段。

总长度占用两个字节,0x05,0xdc表明总长度为5*16*16+13*16+12=1500。

标识占用两个字节,同理计算为26332。

标志占3位,目前只有前两位有意义,即MF和DF,标志字段的最低位是 MF (More Fragment),MF=1 表示后面"还有分片",MF=0 表示最后一个分片。标志字段中间的一位是 DF (Don't Fragment),只有当 DF=0 时才允许分片。这个数据包中DF=1,说明此IP不允许被分片(此数据包长度为1460,部分路由器可能支持的最大长度小于1460,如果此时DF设为1,路由器会丢弃这个包)。

片偏移占后13位。生存时间占用1个字节,为64。

协议为6,即指传输层协议为TCP的意思,其他数字与协议的对应关系如下:

  • 1    ICMP
  • 2    IGMP
  • 6    TCP
  • 17    UDP
  • 88    IGRP
  • 89    OSPF

其后就是首部校验和,以及源、目的IP地址。

1.3 传输层协议头形式

    根据上述信息可知,传输层协议为TCP,TCP的协议头格式如下图所示,在数据包中点击传输层即可查看,其占用也为20个字节,具体信息如下:

    源端口占用两个字节,为0xd1,0x62,即为53602

    目的端口占用两个字节,为0x00,0x50,即为80

    序号占用四个字节,此时查看这个字段信息会出现如下图所示,stream index即为流的序列号,TCP segement len标识这个tcp数据的长度,sequence number表明需要接受的ACK值。(备注:此http数据包被分片,总长1953,上一个分片传输了1460的数据,具体解释在下面)

    确认序列号为1,即为服务器返回的seq值,两个分片是一样的

    数据偏移占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,因此TCP首部的最大长度是60(15*4)个字节。所以一般为5.

    控制位,一共6个,占6比特,设置为1时有效。按顺序依次为:URG、ACK、PSH、RST、SYN、FIN。

  1. URG:紧急位,为1时,首部中的紧急指针有效
  2. ACK:确认位,为1时,首部中的确认号有效
  3. PSH:推位,为1时,要求把数据尽快交给应用程序
  4. RST:复位标志,为1时,复位连接,一般在出错或关闭连接时使用
  5. SYN:同步位,在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1
  6. FIN:结束位,为1时,表示发送方完成了数据发送

在例子中,ACK和PSH为1.

窗口大小,0x00,0x40,即为64

校验和包含了伪首部、TCP首部和数据,校验和是TCP强制要求的,由发送方计算,接收方验证。

紧急指针:URG标志为1时,紧急指针有效,表示数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长。

2 Wireshark中的分段

2-1 为什么会分段

TCP数据包每次能够传输的最大数据分段为MSS,为了达到最佳的传输效能,在建立TCP连接时双方将协商MSS值——双方提供的MSS值中的最小值为这次连接的最大MSS值。MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460。

所以如果一个http请求的数据包大于1460,则在传输中会被分片,形成两个或者多个tcp segment,在我们的例子中,可以看到在传输层和应用层之间有:2 reassembled TCP segment的字样,说明上层数据被分成两个TCP segment,分别大小为1460和493.

所以我们看到如下图所示的样子,http数据超过1460便分成两次发送,wireshark显示tcp segment of a reassembled PDU。其实这两个数据包是一个数据包。

 

2-2 如何判断

    收到一个报文后如何确定它是一个"TCP segment"?

如果有几个报文的ACK序号都一样,并且这些报文的Sequence Number都不一样,并且后一个Sequence Number为前一个Sequence Number加上前一个报文大小再加上1的话,肯定是TCP segment了,对于没有ACK标志时,则无法判断。

以上图我们抓取的包为例,首先具有tcp segment of a reassembled PDU的TCP包ACK为1,这和http数据包相同,同时tcp包的Sequence Number为1,而http的为1461,是tcp报文大小加上1,如此我们可以判断这是一个数据包。

3 SEQ和ACK

3.1 HTTP之前的三次握手

    

在http协议之前,很容发现tcp连接的三次握手。他们分别以【SYN】【SYN+ACK】【ACK】标识。

在第一个数据包中,客户端5672端口向服务器端80端口发送SYN握手包,Seq=0(relative sequence number);在第二个数据包中中,服务器端向客户端发送ACK握手回应包,Ack=1(relative sequence number),同时发送SYN握手包,Seq=0(relative sequence number);在最后一个数据包中,服务器端向客户端发送ACK握手回应包,Seq=1,Ack=1。

3.2 SEQ和ACK

Sequence Number,为源端(source)的发送序列号;Ack即Acknowledgment Number,为目的端(destination)的接收确认序列号,是已经接受的。

以上TCP三次握手结束后,Seq=1为客户端的ISN(Initial Sequence Number),后期某一时刻的Seq=ISN+累计发送量(cumulative sent);Ack=1为客户端的IAN(Initial Acknowledge Number),后期某一时刻的Ack=IAN+累计接收量(cumulative received)。对于服务器端而言,Seq和Ack情同此理。

客户端请求http结束后,服务器端会发送一个tcp数据包,告知客户端已经接受到发送的数据。如上图所示,ACK NUm为1954,即是告知客户端1954之前的数据都已经收到,可以发送1954及以后的数据了。

4 关于UDP

之前的内容讲解了HTTP和TCP,如果是UDP呢?

4-1 UDP协议

我们以UDP承载DNS协议为例进行说明。UDP协议的协议格式非常简单,如下图所示,此处不再详述。

4-2 DNS协议

如果承载dns的情况下,我们先了解一下dns协议格式,如下图所示。

标识:这个字段可以看作是DNS报文的ID,对于相关联的请求报文和应答报文,这个字段是相同的,由此可以区分DNS应答报文是哪个请求报文的响应。我们抓取请求www.qq.com的dns请求和响应包可以看出,都是0xa6d8.

标志(2字节):这部分非常重要,需要逐比特分析。对比如下图格式进行说明

QR(1比特):查询/响应的标志位,1为响应,0为查询。

opcode(4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。

AA(1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器(关于权限服务器以后再讨论)

TC(1比特):截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP有关,先记着)

RD(1比特):该位为1表示客户端希望得到递归回答(递归以后再讨论)

RA(1比特):只能在响应报文中置为1,表示可以得到递归响应。

zero(3比特):不说也知道都是0了,保留字段。

rcode(4比特):返回码,表示响应的差错状态,通常为0和3,各取值含义如下:

        0 无差错

        1 格式差错

        2 问题在域名服务器上

        3 域参照问题

        4 查询类型不支持

        5 在管理上被禁止

        6-- 15 保留

 

下面是问题数、资源记录数、授权资源记录数和额外资源记录数,这四个字段都是两字节,分别对应下面的查询问题、回答、授权和额外信息部分的数量。一般问题数都为1,DNS查询报文中,资源记录数、授权资源记录数和额外资源记录数都为0.

再往后就是数据部分,其格式为下图所示。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。如我们查询www.qq.com,其如图所示,03表示后面有三个字母,根据ascll码为w,然后这部分结束,就是数字02,就是后面两个字母,都为q,如此类推,推导出域名为www.qq.com。后面两个两个字节分别表示查询类型和查询类,查询类型一般为IPV4,是0x0001,查询类是通常为1的,指Internet数据。

查询类型如下:

类型    助记符    说明

    1    A    IPv4地址。

    2    NS    名字服务器。

    5    CNAME    规范名称。定义主机的正式名字的别名。

    6    SOA    开始授权。标记一个区的开始。

    11    WKS    熟知服务。定义主机提供的网络服务。

    12    PTR    指针。把IP地址转化为域名。

    13    HINFO    主机信息。给出主机使用的硬件和操作系统的表述。

    15    MX    邮件交换。把邮件改变路由送到邮件服务器。

    28    AAAA    IPv6地址。

    252    AXFR    传送整个区的请求。

    255    ANY    对所有记录的请求。

 

如下图所示,应答报文给出了两个应答信息,所以我们会发现应答报文里answer RSS为2.

4-3 DNS应答报文

    上述讲解的一般意义上的DNS请求报文,但也适用于应答报文。但应答报文又不同于请求报文的地方。

首先,应答数那一位会根据应答的数量设置

此外,回答报文位置会根据查询到的内容进行反馈,其格式如下。如我们查询www.qq.com的应答报文信息如下,前两个字节为c0和0c,域名域名字段(不定长或2字节),它记录资源数据对应的名字,它的格式和查询名字段格式相同。当报文中域名重复出现时,就需要使用2字节的偏移指针来替换。例如,在资源记录中,域名通常是查询问题部分的域名的重复,就需要用指针指向查询问题部分的域名。关于指针怎么用,TCP/IP详解里面有,即2字节的指针,最签名的两个高位是11,用于识别指针。其他14位从报文开始处计数(从0开始),指出该报文中的相应字节数。注意,DNS报文的第一个字节是字节0,第二个报文是字节1。一般响应报文中,资源部分的域名都是指针C00C(1100000000001100),刚好指向请求部分的域名。

类型(2字节)、类(2字节):含义与查询问题部分的类型和类相同。

生存时间(4字节):该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。

资源数据长度(2字节):表示资源数据的长度(以字节为单位,如果资源数据为IP则为0004)

资源数据:该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。

5参考资料

  1. http://www.cnblogs.com/zhuyf87/archive/2012/12/29/2838937.html
  2. http://www.cnblogs.com/kzloser/articles/2582349.html
  3. http://blog.chinaunix.net/uid-20788636-id-4308536.html
  4. http://blog.csdn.net/phunxm/article/details/5836034
  5. http://kb.cnblogs.com/page/209100/
  6. http://blog.csdn.net/rossini23/article/details/5424850
  7. http://blog.chinaunix.net/uid-24875436-id-3088461.html
原创粉丝点击