wireshark分析TCP3次握手和4次挥手
1. TCP数据包字段
通过here可以看到TCP中每个字段的含义。
问题:
- 头部长度为20字节,一般除以4,为什么要除以4??
2. 分析TCP3次连接
首先,打开wireshark,在过滤框中输入本地IP和百度IP地址,
(ip.src==36.152.44.96 and ip.dst==192.168.0.107) or (ip.src==192.168.0.107 and ip.dst==36.152.44.96)
打开百度输入框并进行搜索,此时可以在wireshark中得到下面的数据包。
TCP建立连接的过程如下,可以参考here
客户端发送一个SYN包给服务器。
第一次握手时,TCP数据包中seq=0,ack=0,标志位中SYN为1,表示发起一个连接请求。
服务器端收到客户端的SYN包,回应客户端一个ACK-SYN包。
第二次握手,此时seq=0,ack=1,表示希望收到的下一个包的序列号为1,这个值存放在确认序列号字段中。标志位中SYN,ACK均为1,标志位中的ACK为1表示确认序号有效。
客户端回应给服务器端一个ACK确定数据段。
第三次握手,此时seq=1,ack=1。标志位中ACK为1。
总结:
- 第一次握手时,seq=0,ack=0;ack=0表示期望收到的服务器端的序列号为0.
- 第二次握手时,seq=0,ack=1;此时seq表示服务器端发送的数据的序号,ack表示服务器端希望下一个包收到的序号。
- 第三次握手时,seq=1,ack=1。seq=1表示客户端发送的数据序号,ack=1表示客户端希望收到的下一个包的序号。
3. TCP4次挥手
等待一段时间之后,百度会自动断开连接,如下图:
![](https://i.loli.net/2020/09/04/uqvt4NQdWHAO2bi.png)
TCP4次挥手的过程如下,可以参考here
服务器会发送一个FIN-ACK包,关闭服务器端到客户端的数据传送。
seq=73640, ack=4373,标志位中FIN和ACK为1。
客户端收到FIN之后,给服务器发送一个ACK包,表示确认收到。
seq=4373, ack=73641,表示期望收到的下一个包的序号,标志位中ACK为1。
客户端关闭连接,发送一个FIN-ACK到服务器。
seq=4373, ack=73641,表示期望收到的下一个包的序号,标志位中ACK和FIN为1。
服务器发回ACK报文
seq=73641, ack=4374,标志位中ACK为1.
总结:seq中表示当前包的序号,ack表示当前包希望接收到下一个包的序号,标志位中的ACK为1时,ack确定序号才有效。