wireshark抓包工具的使用可以参考我前面的文字。wireshark网络封包工具
1、tcp三次握手和4次挥手
-
TCP 三次握手:
-
目的:
- 确保双方的通信能力:通过握手过程,双方都可以确认对方是否能够正常接收和发送数据,确保了连接的可靠性。
- 初始化序列号:握手过程中的序列号为后续的数据传输提供了基础,确保数据包的有序和完整性。
- 防止旧连接的干扰:三次握手通过序列号的确认,避免了之前的连接数据包对新连接的影响,确保了数据的准确性。
- 流量控制和拥塞控制的基础:握手建立连接后,TCP 协议可以实现更复杂的流量控制和拥塞控制机制,优化网络性能。
-
过程:
- 第一次握手(SYN) :客户端向服务器发送一个 SYN(同步)报文,表示希望建立连接,此报文中包含客户端的初始序列号,这个阶段,客户端进入 SYN_SEND 状态。
- 第二次握手(SYN-ACK) :服务器收到 SYN 报文后,回复一个 SYN-ACK(同步确认)报文,表示同意建立连接。该报文包含服务器的初始序列号,并确认了客户端的序列号(通过 ACK 字段),服务器在这个阶段进入 SYN_RCVD 状态。
- 第三次握手(ACK) :客户端收到 SYN-ACK 报文后,发送一个 ACK(确认)报文给服务器,确认收到了服务器的 SYN-ACK,此报文中包含服务器的序列号的确认信息。这一阶段,客户端进入 ESTABLISHED 状态,服务器也在接收到这个 ACK 后进入 ESTABLISHED 状态,连接建立成功。
-
-
TCP 四次挥手:
-
目的:确保数据传送的完整性和连接的可靠关闭,保证在关闭连接时,双方都能完成数据的发送和接收,避免数据丢失或混乱。
-
过程:
- 第一次挥手:客户端发送一个 FIN,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。
- 第二次挥手:服务端收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到序号 + 1,服务端进入 CLOSE_WAIT 状态。
- 第三次挥手:服务端发送一个 FIN,用来关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态。
- 第四次挥手:客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 给服务端,确认序号为收到序号 + 1,服务端进入 CLOSED 状态,完成四次挥手。
-
2、抓包验证
- 启动wireshark,选择网卡进行抓包
- 打开终端,输入
curl http://nginx.org/LICENSE发起一个请求 - 紧接着输入
ping nginx.org查看域名对应的ip地址,我这里的输出结果
PING nginx.org (52.58.199.22): 56 data bytes
64 bytes from 52.58.199.22: icmp_seq=0 ttl=49 time=173.003 ms
64 bytes from 52.58.199.22: icmp_seq=1 ttl=49 time=178.518 ms
- 在wireshark里过滤ip,得到下图内容
5. 首先来看建立连接时的报文
# 第一条报文,对应上面的 SYN seq=x
[SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=3439017199 TSecr=0 SACK_PERM
# 第二条报文,对应上面的 SYN seq=y ACK=x+1
[SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1444 SACK_PERM TSval=1127215719 TSecr=3439017199 WS=1
# 第三条报文,对应上面的 ACK seq=y+1
[ACK] Seq=1 Ack=1 Win=131712 Len=0 TSval=3439017407 TSecr=1127215719
6.再来看看断开连接时的报文
# 第一条报文,对应上面的 FIN seq=m
[FIN, ACK] Seq=80 Ack=1677 Win=131072 Len=0 TSval=3439017597 TSecr=1127215927
# 第二条报文,对应上面的 ACK=m+1 和 FIN seq=n,
# 这里之所以合并了,是因为服务器也传输完成了,可以断开连接了
[FIN, ACK] Seq=1677 Ack=81 Win=8113 Len=0 TSval=1127216118 TSecr=3439017597
# 第三条报文,对应上面的 ACK=n+1
[ACK] Seq=81 Ack=1678 Win=131072 Len=0 TSval=3439017787 TSecr=1127216118