开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第十二天,点击查看活动详情
实践教你学习wireshark(六)
数据分析--->TCP协议
什么是TCP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。如果背过面试题的人对tcp应该都是比较了解的,毕竟tcp在网络上是十分常见的一种协议,不过还是得举个例子吧!!!当用户访问网站时,首先通过TCP协议建立连接,然后才发送HTTP请求以获取网站的内容。服务器响应客户端的信息,也都将通过TCP协议传输给客户端。
tcp的捕捉
首先我们可以在wireshark的启动页直接过滤tcp协议,让它只捕捉tcp相关的数据
这样我们就可以看到他只会捕捉tcp相关的数据了,我们可以通过端点分析查看捕获到的IP地址和端口号
在端点统计对话框中包括5个协议的选项卡,分别是Ethernet、IPv4、IPv6、TCP和UDP。通过选择不同的选项卡,即可分析对应协议的端点统计信息。其中,协议选项卡中的数字表示端点数.我们可以查看一下tcp相关的请求数据
可以看到列名总共有8列,分别为Address(IP地址)、Port(端口)、Packets(包数)、Bytes(字节数)、Tx Packets(发送的包数)、Tx Bytes(发送的字节数)、Rx Packets(接收的包数)和Rx Bytes(接收的字节数)。
会话分析(重要)
"三次握手,四次挥手"无疑是很多面试者背过或者看过想对较多的概念,接下来我们就来通过wireshark直接对其进行分析
首先
首先我们先打开会话,查看刚刚请求的一次tcp
会话统计对话框包括5个选项卡,分别为Ethernet(以太网协议)、IPv4(IPv4协议)、IPv6(IPv6协议)、TCP(TCP协议)和UDP(UDP协议)
分析
回到捕捉界面,我们能很清晰的看到一次tcp从连接到断开的流程
现在我们根据我平时看到的tcp连接的图来一步一步分析
第一次握手
客户端发送SYN(seq=x)报文给服务端,进入SYN_SEND状态。
在第一次建立TCP连接时,首先需要客户端向服务器发起建立连接的请求及第一次握手的报文。在该报文中,SYN字段值为1。由于之前的连接不存在,所以没有对之前接收进行确认,故ACK字段被置为0。同时,由于连接还没有建立,不能发送数据,所以序列号也为0。
第二次握手
服务器端收到SYN报文,回应一个SYN(seq=y)ACK(ack=x+1)报文,进入SYN_RCVD状态
第二次握手的报文由服务器发送,需要对第一次握手的报文进行回复确认,因此ACK字段应该置为1。同时,由于仍然是TCP连接建立的过程,所以SYN字段置为1;没有数据传输,故序列号为0。
第三次握手
客户端收到服务器端的SYN报文,将回应一个ACK(ack=y+1)报文,进入ESTABLISHED状态。此时三次握手完成,TCP客户端和服务器端成功地建立连接,就可以开始传输数据了。
客户端收到第二次握手的报文之后,对服务器发送第三次握手的报文。在该报文中,需要对第二次握手的报文进行确认,即ACK字段置为1。此时连接已经建立,SYN字段被置为0,同时可以发送数据,故序列号不再为0。
断开连接
第一次挥手
客户端发送一个FIN,用来关闭客户端到服务器的数据传送,此时客户端进入TIME_WAIT1状态。
客户端主动断开连接,所以向服务器发送FIN数据报。
第二次挥手
服务器收到这个FIN,它回应一个ACK给客户端,确认号为收到的序号加1(与SYN一样,一个FIN占用一个序号)。此时,服务器进入CLOSE_WAIT状态,客户端进入TIME_WAIT2状态。
服务器被动断开,所以发送ACK数据包,对主动断开数据包进行确认。
第三次挥手
当服务器端也没有要传送的数据时,服务器关闭与客户端的连接,发送一个FIN给客户端,服务器进入LAST_ACK状态。
服务器处理完自己的逻辑,发送FIN数据包到客户端。
第四次挥手
客户端收到FIN后,客户端进入TIME_WAIT状态。然后,发送一个ACK给服务器,并将确认号设置为收到序号加1。等待2MSL(120秒)后,服务器端进入CLOSED状态,完成四次挥手
客户端对服务器发送的端口数据包发送ACK数据包进行确认。