计网 - TCP 实战:如何进行 TCP 抓包调试?

简介: 计网 - TCP 实战:如何进行 TCP 抓包调试?

20210702225354984.jpg


Pre


Wireshark 是世界上应用最广泛的网络协议分析器,它让我们在微观层面上看到整个网络正在发生的事情。


Wireshark 本身是一个开源项目,所以也得到了很多志愿者的支持。同时,Wireshark 具有丰富的功能集,包括:


深入检查数百个协议,并不断添加更多协议;


实时捕获和离线分析;


支持 Windows、Linux、macOS、Solaris、FreeBSD、NetBSD,以及许多其他平台;


提供 GUI 浏览,也可以通过 TTY;


支持 VOIP;


支持 Gzip;


支持 IPSec。


……


Wireshark 的主页:https://www.wireshark.org/download.html下载 Wireshark


那如何通过wireshark进行 TCP 抓包和调试?


接口列表


Whireshark 可以帮你看到整个网络交通情况,也可以帮你深入了解每个封包。而且 Whireshark 在 macOS、Linux、Windows 上的操作都是一致的,打开 Wireshark 会先看到如下图所示的一个选择网络接口的界面。


20210704233203943.png

我们要做的第一件事情就是选择一个网络接口(Network Interface)。Linux 下可以使用ifconfig指令看到所有的网络接口,Windows 下则使用 ipconfig。可以看到,上图中有很多网络接口,目前我连接路由器的接口是以太网 2。


开启捕获功能


选择好接口之后,点击左上角的按钮就可以开启捕获,开启后看到的是一个个数据条目。

因为整个网络的数据非常多,大量的应用都在使用网络,你会看到非常多数据条目,每个条目是一次数据的发送或者接收。如下图所示:



20210704233255819.png


以下是具体捕获到的内容:


2021070423331181.png


序号(No.)是 Wireshark 分配的一个从捕获开始的编号。


时间(Time)是从捕获开始过去的时间戳,具体可以在视图中设置,比如可以设置成中文的年月日等。这里有很多配置需要你自己摸索一下,我就不详细介绍了。


源地址和目标地址(Source 和 Destination)是 IP 协议,注意这里有 IPv6 的地址,也有 IPV4 的地址。


协议可能有很多种,比如 TCP/UDP/ICMP 等,ICMP 是 IP 协议之上搭建的一个消息控制协议(Internet Control Message Protocol),比如 Ping 用的就是 ICMP;还有 ARP 协议(Address Resolution Protocol)用来在局域网广播自己的 MAC 地址。


Length 是消息的长度(Bytes)。


Info 是根据不同协议显示的数据,比如你可以看到在TCP 协议上看到Seq 和 ACK。这里的 Seq 和 ACK 已经简化过了,正常情况下是一个大随机数,Whireshark 帮你共同减去了一个初始值。


观察 TCP 协议


如果你具体选择一个 TCP 协议的捕获,可以看到如下图所示的内容:

20210704233523359.png

然后在这下面可以观察到详情内容:


20210704233512538.png


我们可以从不同的层面来看这次捕获。从传输层看是 TCP 段;从网络层来看是 IP 封包;从链路层来看是 Frame。

点开不同层面观察这个 TCP 段,就可以获得对它更具体的认识,例如下图是从 TCP 层面理解这次捕获:

20210704233615485.png

你可以看到这次捕获是一次 ACK(见 Flags)字段,从端口 58260 发往 443,那么大概率是 HTTPS 客户端给服务器的响应。


消息视图


20210704233916559.png


如果你选中一条消息,下面会出现一个消息视图。还有一个二进制视图。二进制视图里面是数据的二进制形式,消息视图是对二进制形式的解读。


Whireshark 追溯的是最底层网卡传输的 Frame(帧),可以追溯到数据链路层。因此对二进制形式的解读,也就是我们的消息视图也要分层。因为对于同样的数据,不同层的解读是不同的。


最上面是 Frame 数据,主要是关注数据的收发时间和大小。


接着是数据链路层数据,关注的是设备间的传递。你可以在这里看到源 MAC 地址和目标 MAC 地址。


然后是网络层数据,IP 层数据。这里有 IP 地址(源 IP 地址和目标 IP 地址);也有头部的 Checksum(用来纠错的)


最下面是传输层数据。 也就是 TCP 协议。关注的是源端口,目标端口,Seq、ACK 等。


有的传输层上还有一个 TLS 协议,这是因为用 HTTPS 请求了数据。TLS 也是传输层。TLS 是建立在 TCP 之上,复用了 TCP 的逻辑。


观察 HTTP 协议


Wireshark 还可以用来观察其他的协议,比如说 HTTP 协议,下图是对 HTTP 协议的一次捕获:


20210704233741873.png


可以看到,Wireshark 不仅仅捕获了应用层,还可以看到这次 HTTP 捕获对应的传输层、网络层和链路层数据。


过滤和筛选


Wireshark 还提供了捕获的过滤,我们只需要输入过滤条件,就可以只看符合条件的捕获。

比如我们想分析一次到百度的握手。首先开启捕获,然后在浏览器输入百度的网址,最后通过ping指令看下百度的 IP 地址,如下图所示:


20210704233809855.png

看到IP 地址之后,我们在 Wireshark 中输入表达式,如下图所示:


20210704233825440.png

这样看到的就是和百度关联的所有连接。上图中刚好是一次从建立 TCP 连接(3 次握手),到 HTTPS 协议传输握手的完整过程。你可以只看从192.168.1.5到14.215.177.39的请求。


首先是从客户端(192.168.1.5)发出的 SYN 和百度返回的 SYN-ACK,如下图所示:

20210704233957395.png

然后是客户端返回给百度一个 ACK:


20210704234004528.png


接下来是 HTTPS 协议开始工作(开始握手):

20210704234029795.png


可以看到 HTTPS 协议通过 TLSv1.2 发送了 Client Hello 到服务端。接下来是 Server 返回给客户端 ACK,然后再发送给客户端一个 Server Hello:


20210704234100520.png

之后百度回传了证书:

20210704234127833.png

最后开始交换密钥,直到 HTTPS 握手结束:


20210704234149607.png

报文颜色


在抓包过程中,黑色报文代表各类报文错误;红色代表出现异常;其他颜色代表正常传输。

image.png

总结


Wireshark 是个强大的工具,支持大量的协议。还有很多关于 Wireshark 的能力,希望你可以进一步探索,如下图中鼠标右键一次捕获,可以看到很多选项,都是可以深挖的。

20210704234240124.png



QA: 请你用自己最熟悉的语言,写一个 UDP 连接程序,然后用 Wireshark 抓包。


以 Java 为例,写了一个回声服务(即客户端发送什么服务段返回什么),以下是服务端程序:

var socket = new DatagramSocket(8888);
var buf = new byte[256];
while (true) {
    DatagramPacket packet
            = new DatagramPacket(buf, buf.length);
    System.out.println("try receive...");
    socket.receive(packet);
    var address = packet.getAddress();
    int port = packet.getPort();
    packet = new DatagramPacket(buf, buf.length, address, port);
    String received
            = new String(packet.getData(), 0, packet.getLength());
    socket.send(packet);
}

以下是客户端程序:

  var buf = "Hello".getBytes();
  var socket = new DatagramSocket();
  var address = InetAddress.getByName("localhost");
  var packet
          = new DatagramPacket(buf, buf.length, address, 8888);
  socket.send(packet);
  socket.receive(packet);
  String received = new String(
          packet.getData(), 0, packet.getLength());
  System.out.format("Server echo : %s\n", received);


通过观察上面两段程序,你会发现发送和接收的都是Datagram报文。而且服务端和客户端之间不需要建立连接。服务端可以通过读取客户端的地址区分客户端,客户端通过服务端地址和端口发送数据到服务端。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8月前
|
网络协议 网络性能优化
基于 Wireshark 分析 TCP 协议
基于 Wireshark 分析 TCP 协议
|
8月前
|
网络协议 安全 网络性能优化
CCNA 200-301系列:TCP和UDP简介
【4月更文挑战第21天】
86 8
|
网络协议 大数据 网络架构
网络协议【图解TCP/IP(笔记二)】
网络协议【图解TCP/IP(笔记二)】
117 0
|
网络协议 前端开发 算法
前端面试之TCP与UDP区别
前端面试之TCP与UDP区别
119 0
|
XML JSON 网络协议
【网络原理】UDP和TCP协议重点知识汇总
【网络原理】UDP和TCP协议重点知识汇总
169 0
|
网络协议 Unix 网络性能优化
两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】
两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】
171 0
|
存储 缓存 网络协议
TCP详解(WireShark抓包分析TCP三次握手和TCP四次挥手)(一)
TCP详解(WireShark抓包分析TCP三次握手和TCP四次挥手)
364 0
|
网络协议 算法 Java
TCP详解(WireShark抓包分析TCP三次握手和TCP四次挥手)(二)
TCP详解(WireShark抓包分析TCP三次握手和TCP四次挥手)
257 0
|
存储 网络协议 安全
第一章 TCP/IP 协议
第一章 TCP/IP 协议
120 0
|
网络协议 PHP Python
推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用。好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控。 假如有一天,你写“传统”的PHP有些累了,想玩玩socket了,搞搞python、NodeJS、GO之类的新兴语言或框架(当然我不是说这些语言不能写web),或者干脆就用PHP吧,事实上PHP5.
16884 0