wireshark
:Beyond Compare是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前全世界最广泛的网络封包分析软件
了解TCP端口
TCP的全称是Transmission Control Protocol,即传输控制协议
。它在RFC 793中被定义。所有TCP通信都会使用源端口
和目的端口
,这些信息可以在每个TCP数据包的头部找到。而为了能够将数据传输到远程服务器或设备的特定应用中去,TCP数据包必须知道远程服务所监听的端口
。如果想要尝试连接一个不同于所设置的端口,那么这个通信就会失败。一般来说,TCP通信中的源端口并不重要,可以随机选择。而在使用TCP通信的时候,我们一共可以使用65535个端口。其中1至1023号端口属于标准端口组
,往往是特定的服务所使用的。而1024至65535号端口则是临时端口
,需要使用时,操作系统会在通信时以随机的方式或者采用一定的策略进行选择。
我们来查看一下第一个数据包的TCP头部。可以看到这个数据包是从IP地址为172.16.16.128发往212.58.226.142的,它的源端口号是2826
,属于临时端口,它是由操作系统
选取的。目的端口是80端口,这是一个标准端口
,这个端口通常提供给使用HTTP的Web服务器
。其实Wireshark自身会维护一个端口列表,记录这些端口关联的常用服务,我们可以选择菜单栏的“Edit”->“Preference”->“Name Resolution”,勾选“Resolve transport names”,就可以打开传输端口的解析。但是有些时候开启解析可能会对我们的分析造成困扰,因此希望大家按照实际情况使用。
第二个数据包是从IP地址为212.58.226.142发往172.16.16.128的,除了IP地址相反之外,源端口和目标端口也是相反的
:
事实上,所有基于TCP的通信都以相同的方式工作:选择一个随机的源端口
与一个已知的目标端口
进行通信。在发出数据包之后,远程设备
就会与源设备使用建立起的端口进行通信
了解TCP的三次握手原理
由于TCP提供的是可靠的
数据传输,因此在传输之前,需要与目标主机建立连接。而所有基于TCP的通信都需要以两台主机之间的握手开始。这里我们结合下图进行分析:
请大家注意的是,上图中的seq表示的是请求
的序列号,ack表示确认
序列号,SYN和ACK为控制位
。 1、第一次握手 在第一次握手建立连接时,客户端会向服务器发送SYN数据包
(SYN=1,seq=x),并进入SYN_SENT
状态,等待服务器的确认。 2、第二次握手 第二次握手其实是分为两步来完成的,即SYN加上ACK,也就是请求和确认数据包。 (1)服务器收到了客户端的请求,向客户端回复一个确认信息(ack=x+1)。 (2)服务器再向客户端发送一个SYN包(seq=y)从而建立连接请求,此时服务器进入了SYN_RCVD状态。 3、第三次握手 第三次握手时客户端收到服务器的回复,也就是SYN加上ACK数据包。此时,客户端也要向服务器发送确认数据包(ACK)。发送完毕之后,客户端和服务器就进入了ESTABLISHED的状态,从而完成了三次握手。那么接下来,客户端和服务端就可以开始传输数据了。
需要说明的是,Wireshark为了让我们分析更加简便,引入了一个新的特性,可以自动将TCP数据包的序列号替换为相对值
。但是这里我们不需要这个功能,我们希望看到原始值
,可以选择菜单栏的“Edit”->“Preference”,展开窗口左侧的“Protocols”并选择“TCP”,然后取消勾选“Analyze TCP sequence numbers”,再单击OK即可。
这个捕获文件的第一个数据包就是初始的SYN数据包
,它从172.16.16.128发往212.58.226.142的80号端口。可以看到它的序列号是3691127924。第二个数据包是从212.58.226.142发出的SYN/ACK响应
:
这个数据包里面包含有这台主机的初始序列号
(233779340),以及一个确认号
(3691127925),注意这个确认号比上一个数据包的序列号大1,因为这个域是用来表示主机所期望得到的下一个序列号的值,有助于数据包的顺序传输
。 第三次握手的数据包是从172.16.16.128发出的ACK数据包
:
这个数据包正如所期望的那样,包含有之前数据包的确认号域所定义的序列号3691127925,通过这个序列号,就可以知道数据的传输顺序没有问题。只要网络中存在有TCP通信
,那么我们都会看到这个模式的三次握手
了解TCP的断开过程
在TCP通信中,每次握手之后都会有断开的操作,一旦TCP通信结束,就会使用4个数据包
以及一个FIN
标志表明连接的结束。如下图所示:
TCP的断开步骤如下:
- 1、客户端向服务器发送一个设置了FIN和ACK标志位的TCP数据包,告诉服务器通信完成。
- 2、服务器收到客户端发来的数据包后,发送一个ACK数据包来回应客户端。
- 3、服务器再向客户端传输一个自己的FIN/ACK数据包。
- 4、客户端收到服务器的
FIN/ACK
数据包后,再向服务器发送一个ACK数据包,之后就结束通信过程。
通过查看第一个数据包的标志位可以发现,IP地址为67.228.110.120的设备通过发送含有FIN/ACK
标志位的数据包来开启TCP断开的过程。接下来目标设备使用了一个ACK数据包
来确认收到了数据包,并且发送了一个FIN/ACK数据包。最后,IP地址为67.228.110.120的设备发送了最后的ACK数据包
后,宣告TCP正式断开。那么这两个设备之间的TCP通信就已经结束了,如果想要再继续进行通信,则必须完成新的握手操作。
了解TCP的重置
正常情况下,TCP通信的连接都会以TCP的四次握手
断开。但是现实中,网络连接有时会出现断掉的情况。这有可能是遭受到了网络攻击
,也有可能是出现了配置错误
的情况。此时就需要使用设置了RST标志的TCP数据包,表示出现了连接被异常终止
或拒绝连接
的请求。
这个文件中的第一个数据包是从192.168.100.138发出的,并且尝试与192.168.100.1的80端口进行通信。但是由于目标主机并没有开启80端口,因此在第二个数据包中,就回应了一个RST数据包
,告诉源主机80端口无法建立连接,那么通信也就终止了。由此可见,RST数据包可以在通信序列的开始或者在主机通信的过程中,将通信终止。
UDP数据包分析
UDP
指的是User Datagram Protocol,即用户数据报协议,是在现代网络中最常使用的另外一种第四层
的协议。如果说TCP是为了满足带有内在错误检测的可靠数据传输
,那么UDP主要是为了提供高速的传输。出于这个原因,UDP是一种尽力服务,通常会被称为无连接协议
。一个无连接协议并不会正式地建立和结束主机之间的连接,也不会像TCP那样存在握手和终止的过程。
无连接协议意味着它是一种不可靠的服务,这将使得UDP的流量一点都不稳定。但依赖于UDP的协议通常都会有其它的可靠性服务,或者使用ICMP
的一些功能来保证连接更可靠一些。比如,应用层协议DNS
和DHCP
需要高度依赖数据包在网络上的传输速度,因此需要使用UDP协议
,并利用它们自身的错误检查以及重传计时来保证数据的正确传输。
可以看到,这个捕获文件是由DNS形成的。而UDP的内容也很简单,包含有源端口
、目标端口
、数据报
的长度以及校验和等信息。
需要强调的是,UDP并不关心传输的可靠性,所以任何使用UDP的应用在必要的时候都需要采取特殊的步骤,从而保证传输的可靠性
。