重新认识 TCP 的握手和挥手:答案和解析

本文是重新认识 TCP 的握手和挥手一文的答案和解析。

第一题,3个。

Wireshark 选择 Statistics > 选择 TCP Tab 就可以看到 3 个会话,以及 IP 端口,一共使用的数据量,发送的速率等等。

Wireshark 的会话统计功能

第二个问题,找到这 3 个会话的握手包和挥手的包。

这个问题比较简单,借这个问题介绍一个 Wireshark 的很好用的功能:Profile。

Profile 可以让你在分析不同的网络问题或者网络协议的时候使用不同的配置,比如,我们在分析 HTTP 问题的时候,就让 Wireshark 切换到 HTTP 模式;在分析 TCP 性能的时候,就切换到「TCP 性能模式」。

Profile 可以在 Edit > Configuration Profiles… 打开,然后可以添加或者复制已有的模式。

进入 Profile 管理

我们新添加一个 TCP Profile。(也可以复制已有的)

添加一个新的 Profile

我们点击 Wireshark 右下角的 Profile: 可以切换,选择我们刚刚创建的 TCP 模式。

刚切换过来,和之前没有什么不同。我们可以在这个 Profile 下做一些配置。

在 View > Coloring Rules… 可以打开颜色配置,在这里可以修改 Packet 在 Wireshark 中显示的颜色。

颜色配置入口

我们删除其他所有的颜色,只留下 TCP 和 TCP flags 的配色。

Wireshark 颜色配置

这时候回到 Wireshark,就没有其他的颜色干扰了,我们想要的 TCP SYN 和 FIN 都展现在眼前。

刚刚的修改只会影响我们创建的 TCP 这个 Profile,如果你在刚刚右下角的位置切换回 Default, 那么 Default 的颜色配置又回来了。Profile 就是我们对不同问题分析的时候用的不同配置。

如果还觉得不够清晰,可以试试这个 Display Filter Button 功能。

点击这个 +,可以输入过滤条件。
输入 Label,Filter 和 Comment

点击 OK,在 + 右边会出现一个 SYN||FIN 的按钮。点击之后,就会直接应用我们给这个按钮绑定的过滤条件。

使用 Display Filter Button 快速过滤

这个按钮也是跟随 Profile 的,切换不同的 Profile 就可以展示不同的快速过滤按钮。适合将常用的 filter 给保存下来。

在第二题中,前两个会话是特殊构造的。

第一个会话的三次握手其实只有两个包。在TCP 延迟分析中,我们知道三次握手的第三个包发送出去之后就可以直接发送数据,不占用延迟时间,那么是否可以将数据和第三个包(实际上是一个 ACK)一起发送呢?答案是可以的,就和当前题目中给出的抓包文件一样。

在之前的博客 TCP可以使用两次握手建立连接吗?再多来点 TCP 吧:Delay ACK 和 Nagle 算法中也有讨论。

第二个会话中,四次挥手其实是三次,FIN 和 ACK 也合并了。读者如果没有注意到,可以再仔细观察下第二个 TCP 连接。

在第三个问题,如何区分 ACK 的是数据还是 FIN flag 呢?答案是:FIN flag 也是占用一个 sequence number 的。

我们可以用第三个会话来分析这个现象。在第三个会话中右键选择 Follow > TCP Stream.

过滤某一个单独的会话

就可以只显示和这个 TCP 会话有关的包了,在有很多 TCP 连接,我们只想分析其中一个的时候,非常有用。

除了 Wireshark 的包列表页面,我们还会看到一个明文的页面,这就是这个 TCP 会话中发送的所有数据。

TCP Stream 分析

我们这里想要分析的 seq number 和 ack number,所以可以在列表中展示这两列。直接在列的 header 右键可以编辑。

也可以打开一个包,在想要的字段上右键,选择 Apply as Column,就可以直接把这个字段放到列里面。

Apply as Column

同理,也把 ack number 放到 Column 里面。

找到一个 FIN 的包,就可以清楚的看到这个 length 为 0 的 FIN 包页增加了一个 seq number。

在 TCP 协议里面是这么说的。

A control bit (finis) occupying one sequence number, which indicates that the sender will send no more data or control occupying sequence space.

RFC 793

总结一下,今天学习到的 Wireshark 技巧真多呢:

  • Wireshark 的会话统计功能
  • 配置 Profile 和颜色
  • 配置 Profile 的快速过滤按钮
  • 过滤单独的 TCP 会话
  • 将想看的字段展示在 Column 上面

==计算机网络实用技术 目录==

这篇文章是计算机网络实用技术系列文章中的一篇,这个系列正在连载中,我计划用这个系列的文章来分享一些网络抓包分析的实用技术。这些文章都是总结了我的工作经历中遇到的问题,经过精心构造和编写,每个文件附带抓包文件,通过实战来学习网路分析。

如果本文对您有帮助,欢迎扫博客右侧二维码打赏支持,正是订阅者的支持,让我公开写这个系列成为可能,感谢!

没有链接的目录还没有写完,敬请期待……

  1. 序章
  2. 抓包技术以及技巧
  3. 理解网络的分层模型
  4. 数据是如何路由的
  5. 网络问题排查的思路和技巧
  6. 不可以用路由器?
  7. 网工闯了什么祸?
  8. 网络中的环路和防环技术
  9. 延迟增加了多少?
  10. TCP 延迟分析
  11. 压测的时候 QPS 为什么上不去?
  12. 压测的时候 QPS 为什么上不去?答案和解析
  13. 重新认识 TCP 的握手和挥手
  14. 重新认识 TCP 的握手和挥手:答案和解析
  15. TCP 下载速度为什么这么慢?
  16. TCP 长肥管道性能分析
  17. 后记:学习网络的一点经验分享
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 4.0 国际 协议。


重新认识 TCP 的握手和挥手:答案和解析”已经有6条评论

  1. wireshark还有个比较强大的tcp.completeness 会话完整性分析。用来找大量正常流里面几个建链失败的报文可太好用了!

  2. 第一个链接,四次挥手也是特殊构造的吗?看起来在第三次挥手的时候带业务数据了?”HTTP/1.0 200 OK”

    • 这个不是。FIN 只是一个 flag,FIN flag=1 的时候也是完全可以携带数据的。就是说,「发完这个包的数据之后,我这边的数据已经发送完成了」。原理就和本文在说的握手过程中 ACK 包也可以携带数据一样。(不过问这个问题说明您还没看到这一篇的重点呀~)

      另外虽然是特殊构造,但是文中出现的包也都是完全合法的。

Leave a comment

您的邮箱地址不会被公开。 必填项已用 * 标注