wireshark分析TCP3次握手和4次挥手

1. TCP数据包字段

通过here可以看到TCP中每个字段的含义。

问题:

  1. 头部长度为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

  1. 客户端发送一个SYN包给服务器。

    第一次握手时,TCP数据包中seq=0,ack=0,标志位中SYN为1,表示发起一个连接请求。
  2. 服务器端收到客户端的SYN包,回应客户端一个ACK-SYN包。

    第二次握手,此时seq=0,ack=1,表示希望收到的下一个包的序列号为1,这个值存放在确认序列号字段中。标志位中SYN,ACK均为1,标志位中的ACK为1表示确认序号有效。
  3. 客户端回应给服务器端一个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次挥手

等待一段时间之后,百度会自动断开连接,如下图:

因此,此时发起4次挥手的是服务器。

TCP4次挥手的过程如下,可以参考here

  1. 服务器会发送一个FIN-ACK包,关闭服务器端到客户端的数据传送。

    seq=73640, ack=4373,标志位中FIN和ACK为1。
  2. 客户端收到FIN之后,给服务器发送一个ACK包,表示确认收到。

    seq=4373, ack=73641,表示期望收到的下一个包的序号,标志位中ACK为1。
  3. 客户端关闭连接,发送一个FIN-ACK到服务器。

    seq=4373, ack=73641,表示期望收到的下一个包的序号,标志位中ACK和FIN为1。
  4. 服务器发回ACK报文

    seq=73641, ack=4374,标志位中ACK为1.

总结:seq中表示当前包的序号,ack表示当前包希望接收到下一个包的序号,标志位中的ACK为1时,ack确定序号才有效。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务