网络抓包
tcpdump 和 Wireshark 就是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器。
tcpdump 仅支持命令行格式使用,常用在 Linux 服务器中抓取和分析网络包。
Wireshark 除了可以抓包外,还提供了可视化分析网络包的图形页面。 这两者实际上是搭配使用的,先用 tcpdump 命令在 Linux 服务器上抓包,接着把抓包的文件拖出到 Windows 电脑后,用 Wireshark 可视化分析。
tcpdump
tcpdump 是 Linux 系统中强大的网络抓包工具,它使用 libpcap 库来抓取网络包,这个库在几乎所有的 Linux/Unix 中都有。
基本用法
tcpdump 的基本用法如下:
tcpdump [选项] [过滤表达式]
选项用来配置 tcpdump 的功能,比如指定抓取的网络接口、是否解析 DNS 等。
过滤表达式用来过滤网络包,只抓取感兴趣的网络包。
常用选项与过滤

抓包实例
这条命令表示抓取 eth0 网络接口上的所有网络包,并把抓取结果保存在 file.pcap 文件中。
在工作中 tcpdump 只是用来抓取数据包,不用来分析数据包,而是把 tcpdump 抓取的数据包保存成 pcap 后缀的文件,接着用 Wireshark 工具进行数据包分析。

Frame:物理层数据帧的情况;
Ethernet II:数据链路层以太网帧头部的信息;
Internet Protocol Version 4:网络层数据包头部信息;
Transmission Control Protocol:传输层的数据段头部信息。
WireShark
Wireshark 除了可以抓包外,还提供了可视化分析网络包的图形页面。Wireshark 的基本界面包括以下几个部分:
Filter:用来输入过滤表达式,只抓取感兴趣的网络包。
Packet List:用来展示抓取的网络包列表,每个网络包都会有一行简单的信息,包括序号、时间戳、源地址、目标地址、协议、长度和信息等。
Packet Details:用来展示每个网络包的详细信息,这部分会按照osi七层网络模型的顺序,从物理层到应用层,分别展示每一层的头部信息。
Packet Bytes:用来展示每个网络包的二进制格式,也就是每个字节对应的十六进制和 ASCII 码。 wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容
语法结构

Protocols: ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp and udp(若不指定,默认使用所有支持的协议)
Direction: src,dst,src and dst,src or dst(若不指定,默认使用双向(src or host))
Host:net,port,host,portrange(若不指定,默认所有)
Logical Operations: not,! and,&&,or,||,xor,==(匹配),!=(不匹配)(若不指定,默认使用and)
Other expression:其他的过滤条件,当有多重表达条件时与Logica Operatios 一起连用
常用过滤
Wireshark提供了两种过滤器:捕获过滤器和显示过滤器 捕获过滤器:在抓包之前就设定好过滤条件,然后只抓取符合条件的数据包。 显示过滤器:在已捕获的数据包集合中设置过滤条件,隐藏不想显示的数据包,只显示符合条件的数据包。 这两种过滤器所使用的语法是完全不同的,捕捉网卡数据的其实并不是Wireshark,而是WinPcap,当然要按WinPcap的规则来,显示过滤器就是Wireshark对已捕捉的数据进行筛选。
针对ip的过滤 对源地址进行过滤
ip.src == 192.168.1.1
对目标地址进行过滤
ip.dst == 192.168.1.1
对源地址或者目的地址进行过滤
ip.addr == 192.168.0.1
如果想排除以上的数据包,只需要将其用括号囊括,然后使用 “!” 即可
!(ip.src == 192.168.1.1 && ip.dst == 192.168.1.2)
针对tcp的过滤 对源端口进行过滤
tcp.srcport == 80
对目标端口进行过滤
tcp.dstport == 80
针对协议的过滤 获某种协议的数据包,表达式很简单仅仅需要把协议的名字输入即可(只能为小写)
http
捕获多种协议的数据包
http or telnet
排除某种协议的数据包
not arp 或者 !tcp
针对端口的过滤 捕获某一端口的数据包(以tcp协议为例)
tcp.port == 80
捕获多端口的数据包,可以使用and来连接,下面是捕获高于某端口的表达式(以udp协议为例)
udp.port >= 2048
针对长度和内容的过滤 针对长度的过虑(这里的长度指定的是数据段的长度)
udp.length < 20
http.content_length <=30
针对uri 内容的过滤
http.request.uri matches "user" (请求的uri中包含“user”关键字的,matches 后的关键字是不区分大小写的!)
http.request.uri contains "User" (请求的uri中包含“user”关键字的,contains 后的关键字是区分大小写的)
针对http请求的一些过滤实例
精确过滤域名
http.host==baidu.com
模糊过滤域名
http.host contains "baidu"
过滤请求的content_type类型
http.content_type =="text/html"
过滤http请求方法
http.request.method=="POST"
过滤tcp端口
tcp.port==80
http && tcp.port==80 or tcp.port==5566
过滤http响应状态码
http.response.code==302
过滤含有指定cookie的http数据包
http.cookie contains "userid"
抓包实践
wireshark抓包界面

http应用抓包
分析:
TCP三次握手
在Wireshark中,抓包后的结果中Len字段表示的是数据包的有效负载长度。具体来说,它指的是数据包中传输的数据部分的长度,不包括协议头部(如以太网头部、IP头部和TCP头部)的长度,单位为字节。
第一包SYN包,序列号为1168863964,确认应答号为0 TCP首部长度为32个字节,其中标准头部字节数为20个字节,选项长度为12个字节 TCP首部长度32个字节 = 标准头部字节数为20个字节 + 选项长度为12个字节 = 源端口号16位(2字节)+ 目标端口号16位(2字节) + 序列号32位(4字节) + 应答确认号32位(4字节) + 首部长度(4位) + 保留(6位) + 标记位(6位)+ 窗口大小(16位) + 校验和(16位)+ 紧急指针(16位) + 可选项(长度可变) 标准头部字段对应如下:
Source Port (16 bits): 源端口号
Destination Port (16 bits): 目标端口号
Sequence Number (32 bits): 序列号
Acknowledgment Number (32 bits): 确认号(仅在ACK标志设置时有效)
Data Offset (4 bits): TCP头部的长度,以4字节为单位
Reserved (3 bits): 保留字段,必须设置为0
Flags (9 bits): 各种控制标志(如URG, ACK, PSH, RST, SYN, FIN等)
Window (16 bits): 窗口大小
Checksum (16 bits): 校验和
Urgent Pointer (16 bits): 紧急指针(仅在URG标志设置时有效) 可选项包含:
最大报文段大小 (MSS) 选项编号: 2,长度: 4字节,指定连接中允许的最大报文段大小。通常在TCP连接建立时的SYN包中使用
窗口扩大因子 (Window Scale) 选项编号: 3,长度: 3字节,允许发送方和接收方使用大于16位(65535字节)的窗口大小,通过一个位移因子进行缩放。通常在TCP连接建立时使用。
时间戳 (Timestamp) 选项编号: 8 长度: 10字节 提供精确的往返时间测量和对PAWS(保护免受包重新排序攻击)的支持
选择性确认 (SACK) 选项编号: 4(SACK-Permitted)和5(SACK) 长度: 2字节(SACK-Permitted),可变(SACK) 允许接收方通知发送方成功接收到的非连续数据块,从而提高拥塞控制效率。
无操作 (NOP) 选项编号: 1 长度: 1字节 描述: 用于填充,使选项字段对齐到4字节边界。常用于分隔不同的选项。
结束选项列表 (End of Option List) 选项编号: 0 长度: 1字节 描述: 标识选项列表的结束。
第二包SYN+ACK包,序列号为3131781547,确认应答号为1168863964+1 服务端收到客户端的SYN包后,会返回一个SYN+ACK包,表示同意建立连接,并确认客户端的序列号。
第三包ACK包,序列号为1168863964+1,确认应答号为3131781547+1 客户端收到服务端的SYN+ACK包后,会返回一个ACK包,表示确认连接建立成功。
TCP窗口大小机制
发送窗口:发送方根据接收方的接收窗口(由接收方在TCP头中的窗口字段指定)来调整其发送窗口的大小。发送窗口表示发送方在等待确认之前可以连续发送的最大数据量。 接收窗口:接收方根据其可用缓冲区大小来调整其接收窗口的大小。接收窗口表示接收方当前可以接收的最大数据量。 TCP窗口大小是动态调整的,通过以下机制实现:
滑动窗口协议:窗口的起始位置根据已经确认的数据移动,从而实现连续的数据流传输。
窗口缩放选项:在高速网络中,标准的16位窗口大小(最大为65,535字节)可能不足以充分利用带宽。窗口缩放选项允许窗口大小扩展到32位,从而支持更大的数据传输量。
TCP Payload
在TCP(传输控制协议)中,Payload(有效载荷)指的是TCP段中的实际数据部分,也就是传输的应用层数据。具体来说,TCP段包含了以下几个部分:
TCP头部:TCP协议控制信息的部分,包括源端口、目标端口、序列号、确认号等,用来管理数据传输的可靠性和顺序性。
TCP有效载荷:也称为数据部分或者TCP数据字段,这部分是TCP段中实际的应用层数据。它是从发送端应用层传输到接收端应用层的内容。 TCP Payload的特点:
应用层数据:TCP Payload是从应用层(如HTTP、FTP、SMTP等)传输的数据,具体内容取决于具体的应用协议。
大小限制:TCP段的大小通常受到路径上MTU(最大传输单元)的限制。在IPv4网络中,常见的MTU大小为1500字节。TCP有效载荷的最大大小由TCP头部中的数据偏移字段决定,通常为最大65,495字节(65,535减去TCP头部的20字节)。 TCP Payload与MSS的关系: TCP Payload指的是TCP段中的实际应用层数据部分,它的大小不能超过MSS。换句话说,MSS限制了TCP段中有效载荷的最大大小。 MSS是TCP协议在连接建立时通过选项字段交换确定的一个参数,表示在一个TCP段中,TCP数据字段(有效载荷)的最大允许大小。MSS是指TCP段中除去TCP头部后,实际能够用来传输数据的最大大小。
HTTP请求
序列号为1168863964+1,确认应答号为3131781547+1。len=474 在三次握手完成后,客户端发起http请求,使用三次握手后的序列号和应答确认号。在tcp协议层len=474,指的是http请求头的长度,单位是字节。
HTTP响应
序列号为3131781547+1+165+(30),确认应答号为1168863964+1+474 在这里TCP进行了分段重组