一、tcpdump简介

tcpdump是什么?

来看看 tcpdump官网怎么说:This is the home web site of tcpdump, a powerful command-line packet analyzer; and libpcap, a portable C/C++ library for network traffic capture.

不妨来看看chatGPT插件怎么说?

tcpdump是一种网络抓包工具,它能够捕获网络数据包并将其分析和显示出来。它支持多种协议,包括TCP、UDP、ICMP等,并能够根据不同的过滤条件进行数据包的筛选和分析。tcpdump是一个非常强大的工具,可以用于网络故障排除、网络安全分析等方面。

二、tcpdump使用入门

2.1 tcpdump命令使用

tcpdump的使用方法比较简单,也就是:

tcpdump [选项] [过滤表达式]

选项和表达式的外面都加了中括号,表明它们都是可选的。

tcpdump 提供了大量的选项以及各式各样的过滤表达式。不过只需要掌握一些常用选项和过滤表达式,就可以满足日常使用需要了。下面是一些最常见的用法:

2.2 tcpdump输出结果分析

tcpdump 的基本输出格式为:

时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息

“时间戳 协议 源地址.源端口 > 目的地址.目的端口”就是字面意思,一眼看懂。

网络包详细信息包括:

  • Falgs:TCP的标志位信息
  • seq:序列号,范围是0 - 2^32-1
  • win:窗口大小
  • options:选项

不知道你发现没有,这些信息和TCP报文头部的结构是一一对应呢?

输出结果中的Flags信息使用的是简写,补充一张Flags具体说明:

三、tcpdump抓包实战

本案例是使用tcpdump抓包TCP三次握手和四次挥手的过程。这个案例不需要苛刻复杂的实验环境,不需要云服务器,不需要虚拟机,只要有一台电脑,不管是Windows还是MacOS,只要配置了简单的开发环境,就可以进行实战了。

3.1 抓包过程

1.在本地启动一个Spring Boot工程,提供一个测试连接:http://localhost:8080/hello

2、打开一个控制台窗口(窗口1),开启tcpdump抓包,命令如下:

sudo tcpdump tcp -i lo0 port 8080 -S -nn -t

具体含义:过滤TCP协议,抓取回环包,过滤端口8080,绝对数值,不解析IP地址和端口号名称,不显示时间

3、再打开一个控制台窗口(窗口2),访问测试连接,命令如下:

curl 127.0.0.1:8080/hello

4、在窗口1中可以看到抓包的内容显示:

3.2 抓包分析

从上述抓包结果,可以清晰看到TCP建立连接、数据传输、断开连接的过程。

可以对照着回顾下“三次握手”、“四次挥手”的过程,相信一定会加深印象的。

四、tcpdump原理浅析

图片源自:tcpdump官网的文章libpcap: An Architecture and Optimization Methodology for Packet Capture

tcpdump 抓包其实是使用操作系统底层提供的 libpacp 机制和相关系统调用实现的。Pcap是计算机网络管理领域中一个用于捕获网络流量的应用程序接口(API)。tcpdump 的工作过程是:在收发包时,使用 libpcap 库来访问网络接口和解析数据包;将符合规则(通过BPF filter设置)的数据包拷贝一份到 tcpdump 的内核缓冲区,然后以 PACKET_MMAP 的方式将这部分内存映射到 tcpdump 用户空间,在用户空间进行解析和分析,就可以输出到终端或者保存到文件中了。

通过上图可以看到,在收包的时候,如果网络包已经被网卡丢弃了,那么 tcpdump 是抓不到它的;在发包的时候,如果网络包在协议栈里被丢弃了,比如因为发送缓冲区满而被丢弃,tcpdump 同样抓不到它。那么, tcpdump 的能力范围简单地总结为:网卡以内的问题可以交给 tcpdump 来处理;对于网卡以外(包括网卡上)的问题,tcpdump 就无能为力了。这个时候,需要在对端也使用 tcpdump 来抓包。

tcpdump是一款简单好用的命令行抓包工具,希望本文的分享对各位有用!

6张图表 + 1个案例 带你入门tcpdump的使用和原理的更多相关文章

  1. 一个简单的案例带你入门Dubbo分布式框架

    相信有很多小伙伴都知道,dubbo是一个分布式.高性能.透明化的RPC服务框架,提供服务自动注册.自动发现等高效服务治理方案,dubbo的中文文档也是非常全的,中文文档可以参考这里dubbo.io.由 ...

  2. 可能是史上最强大的js图表库——ECharts带你入门

    PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...

  3. highchart访问一次后台服务返回多张图表数据

    本文承接上一篇,我们制作动态图表的时候,往往需要的不止一张图表,如果每张图表都与服务接口做一次交互的话未免太过频繁,这无论对前后还是后台都是一种压力,本文介绍一种一次访问返回多组数据的方式来减少前台与 ...

  4. 史上最强大的js图表库——ECharts带你入门(转)

    出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...

  5. 小案例带你揭秘JS事件

    小案例带你揭秘JS事件 ### 什么是事件? 在js中一个事件的组成由那些呢? 谁触发事件:事件源 触发什么事件: 事件的类型 触发事件干什么事:事件处理函数 事件传播的过程 捕获阶段 就是从wind ...

  6. 一天带你入门到放弃vue.js(一)

    写在前面的话! 每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧! Vue.js是目前三大框架(angular,vue,react)之一,是渐进式js框架,据说是摒弃了 ...

  7. C#单元测试,带你入门

    注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...

  8. SQLite 带你入门

    SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存).平时开发或生产环境中使用各种类型的数据库,可能都需要先安装数据库服务(server),然后才能 ...

  9. 一天带你入门到放弃vue.js(三)

    自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...

  10. 一天带你入门到放弃vue.js(二)

    接下来我们继续学习一天带你入门到放弃系列vue.js(二),如有问题请留言讨论! v-if index.html <div id="app"> <p v-if=& ...

随机推荐

  1. 互联网公司Python高性能编程

    虽然Python一直被吐槽执行速度慢,但是架不住简洁的语法和丰富的第三方库使其能够节省开发时间.众所周知在互联网公司中要求频繁的迭代.快速的上线,而Python的优点就特别适合这种需求,所以Pytho ...

  2. Python报错:TypeError: 'dict_keys' object does not support indexing(机器学习实战treePlotter代码)解决方案

    错误信息: 学习<机器学习实战>这本书时,按照书上的代码运行,产生了错误,但是在代码中没有错误提示,产生错误的代码如下: firstStr = myTree.keys()[0] print ...

  3. AcWing 每日一题 - Summer

    本篇解题记录题源来自 AcWing 的 Summer 每日一题 补题链接:Here 2021/07/01 done Week 1 星期一 AcWing 3485. 最大异或和 (Hard 思路 先求出 ...

  4. StringBuilder 线程不安全,到底哪里不安全?

    StringBuilder 线程不安全,到底哪里不安全? 在Java中,字符串拼接是一个非常常见的操作,而对于频繁变动的字符串内容,使用StringBuilder是一个性能优化的选择.但是,Strin ...

  5. 从输入URL后浏览器的渲染逻辑

    从输入URL到浏览器渲染页面需要经过很多过程,本文简单说明下各个环节的内容 主要渲染节点如下: 一.浏览器进程说明 出于安全考虑,打开一个浏览器的Tab页签,会生成1个浏览器主进程.1个网络进程.1个 ...

  6. Vue - 组件通信(父子单向传递、父子相互传递、祖孙隔代传递)

    父组件向子组件单向传递 父组件:引入子组件后,通过属性绑定的形式,将值传入子组件: ` ` 子组件:子组件通过props接收父组件传入的值; ` {{sonGetParam}} ` 子组件向父组件单向 ...

  7. 【C++】类大小

    [来源]C++类大小详尽讲解 [来源]空类(empty class)

  8. JMS微服务开发示例(六)安全退出进程

    默认情况下,如果在linux,需要关闭微服务进程,请务必使用 kill -15 进程id 命令,其他命令可能会直接关闭进程,造成数据丢失. 例如,有个后台任务,执行了一半,这时候进程突然关闭了,会形成 ...

  9. Go-GC

  10. Go-环形链表

    package main import "fmt" // 环形单向链表 // 特征: 首尾相连 // 实现: 结构体 + 指针 // 1. 构建环形单向链表,类似单向链表,不过he ...