华为网络基础 | WireShark实战之验证

  • 内容
  • 相关

前几篇讲解了RS | 数据包帧字节——图例详解RS | IP报文头部RS | TCP头部封装,已经知道了数据通信过程中,以太帧、IP报文、TCP头部的封装结构组成,接下来我们要通过WireShark抓包验证,这样才能令我们印象深刻,掌握更牢靠。

使用wireshark还需了解的一些知识:MTU和MSS

1.首先回顾以太网帧的封包格式:

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

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

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

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

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

MTU概念:Ethernet Header以下的IP数据报最大传输单位为MTU(Maximum Transmission Unit,Effect of short board[短板效应或者木桶效应]),对于大多数使用以太网的局域网来说,MTU=1500。

MSS概念:TCP数据包每次能够传输的最大数据分段为MSS,为了达到最佳的传输效能,在建立TCP连接时双方将协商MSS值——双方提供的MSS值中的最小值为这次连接写上中的最大MSS值(即:谁小就取谁的值作为MSS)。

MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460

这样,数据经过本地TCP层分段后,交给本地IP层,在本地IP层就不需要分片了。但是在下一跳路由(Next Hop)的邻居路由器上可能发生IP分片!因为路由器的网卡的MTU可能小于需要转发的IP数据报的大小。

这时候,在路由器上可能发生两种情况:

(1)如果源发送端设置了这个IP数据包可以分片(May Fragment,DF=0),路由器将IP数据报分片后转发。

(2)如果源发送端设置了这个IP数据报不可以分片(Don’t Fragment,DF=1),路由器将IP数据报丢弃,并发送ICMP分片错误消息给源发送端。

2.wireshark实战

先来看看一个简单的请求示例截图:

从左到有依次为no(Frame编号)、Time(时间)、Source(源地址)、Destination(目的地址)、Protocal(协议)、Length(包大小)、Info(详细信息)。

tcp请求与回复的info中包括:端口信息(如63703->8279)表示src.port -> des.port,标志位信息(如SYN、ACK)、Seq信息、Ack信息(注意,这个ack是确认号字段m_uiAcknowledgeNum)、len(上层数据长度)、MSS(mss长度)、WS(窗口大小字段)。

实际操作中,头部为66字节,是因为加了12字节的tcp选项信息。实际MSS为1460。

每条数据的详细信息都可以在选中数据后在下方显示,如图:

从上到下依次为Frame(整个帧信息)、Ethernet II(以太头信息)、Internet Protocal Version(IP头信息)、Transmission Control Protocal(TCP头信息),点开后每一个字段的详细信息都可显示,与协议一致。

3.结合实践分析tcp运作方式

(1) 三次握手:tcp通过三次握手创建链接,请看上面的图,

首先63703->8279 发送SYN,Seq=0;

然后8279->63703, 发送SYN&&ACK, Seq=0, Ack=1;

最后63703->8279 发送ACK,Seq=1,Ack=1。

这样就完成了三次握手,与维基百科中的相关知识,做对照,发现完全符合实践。

① 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三路握手的一部分。客户端把这段连接的序号设定为随机数A。 首先63703->8279 发送SYN,Seq=A=0  (A=0

② 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身又有一个随机序号B。 然后8279->63703, 发送SYN&&ACK, Seq=B=0, Ack=A+1=0+1=1  (A=0,B=0

③ 最后,客户端再发送一个ACK。当服务端收到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到的确认号A+1,而响应则为B+1。 最后63703->8279 发送ACK,Seq=B+1=0+1=1,Ack=A+1=0+1=1  (A=0,B=0。这样就完成了三次握手。

(2) 数据传输

69和70是一个http请求,因为包过长,切分成两个tcp包;

75和76分别对这两个包进行ack响应,告知已经收到;

81则对请求做了业务上的响应返回;

而82则是对81的ack响应。

把上图中的69、70、81帧的数据补充完善如下:

69:Seq=1,       Ack=1,       Len=1448 

70Seq=1449, Ack=1,       Len=112 

81Seq=1,       Ack=1561, Len=123

分析上述几条数据我们发现,Seq的递增主要是看上一条发送数据的Len,

如Seq70 = Seq69 + Len69  即:1449=1+1448

而一条数据的ack信息的ack值也是看请求数据的seq和len,

如75是对69的ack,则Ack75=Seq69+Len69 即:1449=1+1448

这一规律也符合协议规定。具体见维基百科数据传输举例。当然,也有选择确认(Selective Acknowledgement)的示例,就不贴出来了。

(3) 选择确认:TCP报文的接收者为了确保可靠性,可以在接收到一定数量的连续字节流后才发送确认。

Wireshark(前生Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。作为一个免费的软件,真的非常好用。

对于网络的初学者,可以先去了解和使用WireShark工具,我也会在后续的教材中退出WireShark工具的操作说明与介绍。

 您阅读这篇文章共花了:

上一篇:华为网络基础 | 套接字

下一篇:Linux | 系统弱点规避

本文标签:    

版权声明:本文依据CC-BY-NC-SA 3.0协议发布,若无特殊注明,本文皆为《fishyoung》原创,转载请保留文章出处。

本文链接:华为网络基础 | WireShark实战之验证 - http://www.fishyoung.com/post-137.html