tcpdump详解&实战

本文介绍了TCPdump工具,详细讲解了TCP报文格式、TCP连接状态和TCPdump的使用,包括常用参数、命令及输出解释。通过示例展示了如何捕获、分析网络数据包,帮助读者更好地理解和排查网络问题。
摘要由CSDN通过智能技术生成

作为程序员,网路问题经常遇到,熟悉抓包工具,会使我们排查网络问题时候,事半功倍!

由于抓包我们经常还会查看设备以及端口的一些信息,所以我们先介绍下netstat工具

netstat工具简介和使用

netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、网络连接以及每一个网络接口设备的状态信息。netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

  • 参数解释 shell -a: (all) 显示所有活动中的网络连接和机器正在监听的 TCP/UDP 端口 -r: (route): 显示路由表 -n: 以数字方式显示,禁用反向域名解析,加快查询速度 (默认是不带-n参数的,如果带了-n 输出将会很快,但是只有数字类型的ip,域名是没法看到的,如果不带-n将会看到域名(如有域名的话)) -t: (tcp) 显示tcp连接 -u: (udp) 显示udp连接 -l: (Listen) 只显示监听状态的套接字 -p: 输出中显示 PID 和进程名称 -s: 显示所有端口的统计信息 -i: 查看网卡接口信息

  • 输出列名解释 shell Proto:显示连接使用的协议。 Recv-Q:发送队列 Send-Q:接收队列 Local Address:本地地址:端口。 Foreign Address:外部地址:端口。 state:显示套接口当前的状态。

  • 常用命令 shell netstat -at        #查看当前已经建立的tcp连接 netstat -au        #列出所有 udp 端口 netstat -lt #只列出所有监听中的 tcp类型的 端口 netstat -lu #只列出所有监听中的 udp类型的端口 netstat -antp        #查看所有已经建立的tcp连接,并且域名以数字形式显示 netstat -tupl     #查看所有监听的tcp和udp及进程名信息(udp不能监听,但可以查看是否在占用) netstat -s           #显示所有端口的统计信息 netstat -st 或 -su #显示 TCP 或 UDP 端口的统计信息 netstat -i         #查看网卡接口信息 netstat -tulnp |grep nginx   #查看nginx服务的网络信息

  • 演示几个 查看所有监听状态的tcp端口(以ip形式显示) image.png

查看所有监听状态的tcp端口(如有域名的话以域名形式显示) image.png

查看所有端口情况(不进行反向域名解析) image.png

......还有很多,这里就不一一演示了,只需要使用时根据需要灵活组合即可

TCP报文基本格式

image.png

上图中 TCP 报文中每个字段的含义如下:

源端口和目的端口字段
  • TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
  • TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
序列号字段

序列号字段确认号字段这两个字段是TCP可靠传输服务的关键部分,序列号是该报文段首字节的字节流编号(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观: 当报文被分解(拆包后)成多个报文段时,序列号就是报文段首字节在整个报文的偏移量。而确认号字段则是指发送确认(ack)的一端所期望收到的下一个序号值

序列号(Sequence Number):占 32 位。 一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。每发送一次数据,就累加一次该数据字节的大小。序列号不会从零开始,而是在建立连接时通过计算机随机生成一个数,由SYN包传给接收端主机。\ 假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义

确认号字段

TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。发送确认ack的一端所期望收到的下一个序号,标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

数据偏移字段

TCP 首部长度(Header Length):由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*4 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值

保留字段

保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。

标志位字段 CWR、ECE、URG、 ACK、PSH 、 RST 、 SYN、 FIN
  • CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
  • ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
  • URG(Urgent):紧急指针标志,为1时表示紧急指针有效,该报文应该优先传送,为0则忽略紧急指针。
  • ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。我们称携带ACK标识的TCP报文段为确认报文段。TCP 规定,连接建立后,ACK 必须为 1。
  • PSH(Push):为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应优先将这个报文段交给应用程序,而不是在tcp内核缓冲区排队。
  • RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
  • SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。
  • FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接,我们称携带FIN标志的TCP报文段为结束报文段。
窗口大小字段

窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间(注意:实际的窗口大小 也和Window Scale选项有关)。该字段可以用于 TCP 的流量控制。

TCP 校验和字段

校验和(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。\ 伪首部中包含: 4个字节保存源ip信息,4个字节目的ip信息,一个字节的保留位置,一个字节保存协议号(6代表tcp,17代表udp),2个字节保存tcp首部+数据的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值