brady-wang

 

本文主要介绍 TCP 的握手连接与断开,这里我以“金庸梦“游戏的客户端连接服务器(10.1.230.41)、断开服务器为例,用wireshark抓包分析 TCP 协议的三次握手连接、四次握手断开,与计算机网络原理进行验证;用Fiddler抓包,分析验证一个 HTTPS 网站的 TCP 连接过程。

一、TCP 协议的连接与断开

TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

下图是一个 TCP 包头的结构,这部分主要分析 TCP 协议的三次握手连接和四次握手断开,着重注意 ACK 、 SYN 、FIN 。

在这里插入图片描述

  1. URG:紧急指针字段有效
  2. ACK:确认序号字段有效
  3. PSH:接收方需尽快把该报文段交给应用层
  4. RST:重置连接
  5. SYN:同步序号,用于发起一个连接
  6. FIN:发送端完成发送任务
  • 握手连接:
    1. 第一次握手:客户 → 服务器(ACK = 0 ,SYN = 1)
    2. 第二次握手:服务器 → 客户(ACK = 1 ,SYN = 1)
    3. 第三次握手:客户 → 服务器(ACK = 1 ,SYN = 0)
  • 握手断开:
    1. 第一次握手:客户 → 服务器(ACK = 1 ,FIN = 1)
    2. 第二次握手:服务器 → 客户(ACK = 1 ,FIN = 0)
    3. 第三次握手:服务器 → 客户(ACK = 1 ,FIN = 1)
    4. 第四次握手:客户 → 服务器(ACK = 1 ,FIN = 0)

注:有时候断开连接时,只抓得到三个包,是因为第二次、第三次握手放在同一个包里了,合并成一次握手了。

连接建立: TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。

在这里插入图片描述
连接终止: 建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。

在这里插入图片描述

二、wireshark 抓 C# 程序的 TCP 包

这里我事先编写了一个连接学校服务器的游戏客户端,可以直接连接上学校的游戏服务器,相关代码请参考博客:C#编写网游客户端连接游戏服务器,下载安装 wireshark 请参考博客:C#使用TCP/UDP协议通信并用Wireshark抓包分析数据

  • 首先运行游戏客户端(先不要点击 “ 进入游戏 ”)。

在这里插入图片描述

  • 此时,打开 wireshark 软件,由于我现在连接的是学校 wifi ,所以选择 WLAN 。

在这里插入图片描述

  • 双击打开之后,就可以看到 wireshark 在不停的抓包了。

在这里插入图片描述

  • 然后点击游戏客户端的 “ 进入游戏 ” 按钮。

在这里插入图片描述

  • 就成功连接上了学校的游戏服务器端。
  • 连接完毕后,点击 wireshark 左上角的红色按钮结束抓包,至此,抓包结束,接下来找一下 TCP 连接时三次握手的包。
  • 首先筛选一下(我只需要找 TCP 协议的)。

在这里插入图片描述
三次握手连接:

在这里插入图片描述

  • 第一次握手:客户端 → 服务器(SYN = 1)。

在这里插入图片描述

  • 第二次握手:服务器 → 客户端(ACK =1 ,SYN = 1)。

在这里插入图片描述

  • 第三次握手:客户端 → 服务器(ACK = 1 ,SYN = 0)。

在这里插入图片描述
以上就是抓到的 TCP 三次握手连接的包,接下来抓一下四次握手断开的包。

  • 点击鱼鳍按钮,再点击 Continue without Saving ,重新开始抓包。

在这里插入图片描述

  • 此时,wireshark 处于抓包状态,这时我们点击网游客户端的 “ 退出游戏 ” 按钮。

在这里插入图片描述

  • 然后点击 wireshark 左上角的红色按钮停止抓包,然后我们开始寻找一下四次握手断开的包。
  • 同样筛选一下 TCP 包,然后找一下四次握手的 TCP 包。

四次握手断开:

说明:这里第一次握手,里面有个数据 ACK ,这是给游戏服务器确认消息(确定收到了游戏服务器发给我的上一条数据)。

在这里插入图片描述

  • 第一次握手:客户端 → 服务端(FIN = 1)。

在这里插入图片描述

  • 第二次握手:服务端 → 客户端(ACK = 1)。

在这里插入图片描述

  • 第三次握手:服务端 → 客户端(ACK = 1 ,FIN = 1)。

在这里插入图片描述

  • 第四次握手:客户端 → 服务端(ACK = 1)。

在这里插入图片描述
至此,成功抓到了 TCP 协议三次握手连接、四次握手断开的包,至于为什么 TCP 协议的连接这么繁琐呢,主要是为了确保传输数据的可靠性。

三、Fiddler 抓 HTTPS 网站包

1)HTTP 协议简介

TCP 协议是 HTTP 协议的基石——HTTP 协议需要依靠 TCP 协议来传输数据。在网络分层模型中,TCP 被称为 “传输层协议”,而 HTTP 被称为 “应用层协议”。

HTTP 对 TCP 连接的使用,分为两种方式:俗称 “短连接” 和“长连接”(“长连接”又称 “持久连接”,洋文叫做“Keep-Alive” 或“Persistent Connection”) 假设有一个网页,里面包含好多图片,还包含好多外部的CSS 文件和 JS 文件。在 “短连接” 的模式下,浏览器会先发起一个 TCP 连接,拿到该网页的 HTML 源代码(拿到 HTML 之后,这个 TCP 连接就关闭了)。然后,浏览器开始分析这个网页的源码,知道这个页面包含很多外部资源(图片、CSS、JS)。

然后针对每一个外部资源,再分别发起一个个 TCP 连接,把这些文件获取到本地(同样的,每抓取一个外部资源后,相应的 TCP 就断开) 相反,如果是 “长连接” 的方式,浏览器也会先发起一个 TCP 连接去抓取页面。但是抓取页面之后,该 TCP 连接并不会立即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。然后浏览器分析 HTML 源码之后,发现有很多外部资源,就用刚才那个 TCP 连接去抓取此页面的外部资源。

2)使用 Fiddler 抓包

Fiddler 下载官网地址:https://www.telerik.com/download/fiddler

  • 填入基本信息后,然后点击 “ Download for Windows ” 开始下载。

在这里插入图片描述

  • 下载完成后,点击安装程序。

在这里插入图片描述

  • 点击 “ I Agree ” 。

在这里插入图片描述

  • 选择安装路径,然后点击 “ Install ”。

在这里插入图片描述

  • 安装完成后,打开 fiddler 软件。

在这里插入图片描述

  • 弹出的窗口点击 “ No ” 即可,不用理会。
  • 下面开始配置 fiddler 。
  • 点击 Tools → Options…

在这里插入图片描述

  • HTTPS 下,勾选 Decrypt HTTPS traffic ,

在这里插入图片描述

  • 然后获取证书,Actions → Trust Root Certificate 。

在这里插入图片描述

  • 弹窗出来后,一直点击是就行了。
  • 下图就是 Fiddler 抓取的内容以及 HTTPS 协议执行的过程。

在这里插入图片描述

  • 下面开始抓取 HTTPS 包分析。
  • 首先点击 Edit -> remove -> all sessions 即可清除所有记录。

在这里插入图片描述

  • 打开了 fiddler 软件,使用浏览器访问百度:www.baidu.com

在这里插入图片描述

  • 然后再看看 fiddler 软件,左侧的记录就是抓到的包。

在这里插入图片描述

  • 开始分析包。
  • 下图中红色方框内,都是谷歌浏览器在向百度服务器发送请求。

在这里插入图片描述

  • 下图中是百度服务器返回给谷歌浏览器的图片、JS、CSS、文本文件等等。

在这里插入图片描述

  • 选择一个文件,我选的这个文件是图片文件,可以使用 ImagView 查看。

在这里插入图片描述
在这里插入图片描述

  • Header 标签——用于显示 HTTP 请求和响应的头信息。
  • TextView 标签——用于查看 HTML/JS/CSS 等格式的数据。
  • ImageView 标签——用于显示图片格式的数据。
  • WebForms 标签——用于显示请求的表单数据。如登录请求,就可以通过它查查看登录用户名密码信息。它以表格形式显示。
  • Raw 标签——可以查看原始的符合 HTTP 标准的请求和响应头。
  • Auth 标签——可以查看授权 Proxy-Authorization 和 Authorization 的相关信息。
  • Cookies 标签——可以看到请求的 cookie 和响应的 set-cookie 头信息。
  • XML 和 JSON 标签——用于显示 XML 和 JSON 格式的数据。

这里可以看到采用的连接方式保持的是长连接。

在这里插入图片描述
更多的 Fiddler 使用方法请参考博客:Fiddler抓包1_介绍及界面概述

四、总结

虽然没有使用 Fiddler 抓到 HTTPS 网站的 TCP 三次握手连接,这是由于 Fiddler 只能抓取 HTTP 协议,而 HTTP 协议是 TCP 的一个分支,当使用浏览器访问一个服务器的时候,首先都是通过 TCP 三次握手连接,然后才使用 HTTP 协议进行数据的交互。

五、参考资料

1、TCP协议
2、Fiddler的安装与使用
3、入门:详谈HTTPS SSL/TLS协议原理

分类:

技术点:

相关文章: