文章目录
最近在复习计算机网络时,了解到了Wireshark这个软件,今天以抓包tcp三路握手与四路挥手为例,开始学习使用。
1.wireshark的下载
Wireshark是一个功能强大且灵活的网络封包分析工具,可用于捕获、分析和理解网络流量。它是网络管理员、安全专家和开发人员的重要工具,帮助他们识别和解决网络问题,提高网络性能和安全性。
wireshark下载地址:wireshark官方下载地址
点击链接后,会跳转到以下界面:
根据自己的电脑配置,可以选择不同版本,其中:
- Windows Intel Installer: 这是Wireshark的Windows平台版本,针对使用Intel处理器的Windows计算机进行了优化和适配。它是通过安装程序(Installer)进行安装,提供了用户友好的图形界面和各种功能。
- Windows Intel PortableApps®: 这是Wireshark的Windows平台版本,针对使用Intel处理器的Windows计算机进行了优化和适配。它是一个可便携应用程序(PortableApps®),可以在不需要安装的情况下直接运行,方便携带和使用。
我选择的是Windows Intel Installer的版本安装使用。
2.TCP协议介绍
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
2.1 TCP报文结构
TCP的首部格式如图1所示:
Source Port是源端口,16位。
Destination Port是目的端口,16位。
Sequence Number是发送数据包中的第一个字节的序列号,32位。
Acknowledgment Number是确认序列号,32位。
Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。
标志位: 6位,URG表示Urgent Pointer字段有意义:
- ACK表示Acknowledgment Number字段有意义
- PSH表示Push功能,RST表示复位TCP连接
- SYN表示SYN报文(在建立TCP连接的时候使用)
- FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
Checksum是校验和,16位。和UDP报文一样,有一个校验和,用于检查报文是否再传输过程中出现差错。
Urgent Pointers是紧急指针,16位,当URG = 1时有效,指出本报文段紧急数据的字节数。
2.2 TCP三路握手
为了确保客户端和服务端都能正常发送和接收数据。三次握手都是从客户端开始。
握手前状态:客户端和服务端都是处于连接关闭状态。服务端首先处于listen状态,等待客户端连接,然后就进入三次握手。
- 客户端向服务器端发送一个SYN(synchronize)包,随后客户端进入SYN-SENT阶段。
- 标志位位SYN:表示请求建立连接;
- 序列号位Seq = x(x一般为随机数);
- 服务端收到客户端发送SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文,随后服务器端进入SYN-RECV(同步接收)阶段。
- 标志位为SYN和ACK:表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
- 序号为Seq = y,将自己的初始序列号同步给客户端;
- 确认号为Ack = x + 1,表示收到客户端的序列号Seq并将其值加1作为自己的确认号Ack的值,告诉客户端自己接收的Seq没错;
- 客户端接收到发送的SYN+ACK包后, 明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文,随后客户端进入ESTABLISHED状态。
- 标志位为ACK,表示确认收到服务器端同意连接的信号;
- 序号为Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;
- 确认号为Ack = y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号Ack的值。
- 当服务器收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,从而完成三路握手。
为什么进行三次握手?
确认客户端和服务器端都能正常的收发数据
- 第一次握手:确认客户端可以正常发数据
- 第二次握手:确认客户端可以正常发送数据,确认服务端可以正常接收数据
- 第三次握手:客户端与服务器确认建立连接,双方准备开始传输数据
2.3 TCP四次挥手
为了告知客户端和服务端未发送的数据发送完毕,并且关闭连接,四次挥手都是从客户端开始的。
挥手前状态:客户端和服务端都处于连接状态(ESTAB-LISHEN),进入四次挥手。
-
首先客户端发送一段TCP报文表明想是否TCP连接,随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止向服务端发送通信数据。
- 标记位为FIN,表示请求释放连接;
- 序号为Seq = u;
-
服务器接收到客户端请求断开连接的FIN报文后,结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段TCP报文,随后服务器开始准备释放服务器端到客户端方向上的连接。客户端收到服务器发送过来的TCP报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
- 标记位为ACK,表示接收到客户端释放连接的请求;
- 序号为Seq = v;
- 确认号为Ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号Ack的值。
-
服务器端在发出ACK确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完后即经过CLOSE-WAIT阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出一段TCP报文,随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止向客户端发送数据。
- 标记位为FIN和ACK,表示已经准备好释放连接了;
- 序号为Seq = w;
- 确认号Ack = u + 1,表示是在收到客户端报文的基础上,将其序列号Seq的值加1作为本段报文确认号Ack的值。
-
客户端收到从服务器发来的TCP报文,确认了服务器已经做好了释放连接的准备,于是结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器发送一段报文。
- 标记位为ACK,表示接收到服务器准备好释放连接的信号;
- 序号为Seq = u + 1,表示是在已收到服务器报文的基础上,将其确认号Ack值作为本段序列号的值;
- 确认号为Ack = w + 1,表示是在收到了服务器报文的基础上,将其序号Seq的值作为本段报文确认号的值
-
随后客户端开始在 TIME-WAIT 阶段等待 2 MSL。服务器端收到从客户端发出的 TCP 报文之后结束 LAST-ACK 阶段,进入 CLOSED 阶段。由此正式确认关闭服务器端到客户端方向上的连接。客户端等待完 2 MSL 之后,结束 TIME-WAIT 阶段,进入 CLOSED 阶段,由此完成「四次挥手」。
为什么进行四次挥手?
为什么需要四次挥手 ?
确认双方都得知双方都没有要传输的数据。
第一次挥手:客户端向服务端请求关闭连接。
- 客户端:客户端无数据传输。
- 服务端:无感知。
第二次挥手:服务端收到客户端的请求,并且告知客户端等我处理完毕数据。
- 客户端:客户端无数据传输。
- 服务端:客户端无数据传输。
第三次挥手:服务端处理完毕数据,告知客户端,服务端数据处理完毕。
- 客户端:客户端无数据传输,服务端无数据传输。
- 服务端:客户端无数据传输,服务端无数据传输。
第四次挥手:客户端得知服务端数据处理完毕,双方数据都处理完毕,可断开连接。
- 客户端:客户端无数据传输,服务端无数据传输。
- 服务端:客户端无数据传输,服务端无数据传输,得知客户端知道服务端无数据传输。