华为网络基础 | 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
70:Seq=1449, Ack=1, Len=112
81:Seq=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工具的操作说明与介绍。
您阅读这篇文章共花了: