网络抓包

tcpdump和Wireshark工具

下载

ubuntu环境下安装tcpdump

sudo apt-get install tcpdump

tcpdump的底层依赖是libpcap库,
所以也可以安装一下libpcap

sudo apt-get install libpcap-dev

然后可以用这个库来写一个查看网卡号的小demo

//调用libpcap库的头文件
#include <pcap.h>  
#include <stdio.h>

int main(int argc,const char *argv[])
{
	char errBuf[PCAP_ERRBUF_SIZE],*device;
	device = pcap_lookupdev(errBuf);
	if(device)
	{
		printf("success: device:%s\n",device);
	}
	else
	{
		printf("error:%s\n",errBuf);
	}
	return 0;
}

运行的时候需要连接libpcap的动态库

gcc file.c -lpcap

动态库的位置:
在这里插入图片描述

Libpcap开发库的使用(最全指南!)(包含实操)

安装Wireshark

官网
基本上一直点击下一步就可以了
网络分析工具——WireShark的使用(超详细)

tcpdump的使用

tcpdump -i eth1 icmp and host 183.232.231.174 -nn
-i eth1 抓取eth1网口的数据包
icmp 抓取icmp协议的数据包
host 主机过滤,抓取对应IP的数据包
-nn 表示不解析IP地址和端口号名称

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

ping命令

ping 测试网络是否畅通的工具,最简单的用法就是ping+IP
发送的是ICMP
ICMP协议是英特网控制消息协议,是TCP/IP协议的子协议,用于在ip主机,路由器之间传递控制消息

1.如果是域名,先进行域名解析到具体的一个IP
2.将要ping的IP地址和自己的子网掩码进行与运算,得出相应的网段号
3.然后到自己的电脑里的路由表里查询是否有到这个网段的路由,如果没有就走默认路由,会有下一跳地址
4.查看本机arp缓存表里面是否有下一跳地址的mac地址,如果有就直接封装,如果没有就发arp广播获得下一跳地址的mac地址
5.得到了mac地址后,封装好数据,走物理层(网线)送出数据

举例说明:本机IP:192.168.0.237/24,ping 192.168.90.1的过程:

1.拿目的IP :192.168.90.1和自己的子网掩码进行与运算,得到目的网段:192.168.90.0
2.查看本机的路由表,是否有到达这个网段的路由,如果没有就走默认路由,下一跳地址为:192.168.0.1
3.查看本机arp缓存表里是否有下一跳地址192.168.0.1的Mac地址,如果有就直接封装帧,如果没有,就发arp广播获得192.168.0.1的Mac地址
4.得到了Mac地址后,封装好数据,走物理层送出数据。

信息含义:

  • bytes值:表示通信过程中发送的数据包大小,单位是字节。
  • icmp_seq:ping序列
  • time值:表示响应时间,这个时间越小,说明你与对方通信的速度越快,延时越短。
  • TTL值:Time To Live,表示数据包再经过多少个路由器如果还不能到达就将被丢弃,这里可以通过Ping返回的TTL值大小,粗略地判断目标系统类型是Windows系列还是UNIX/Linux系列。默认情况下,Linux系统的TTL最大值为64或255,WindowsNT/2000/XP系统的TTL最大值为128,UNIX主机的TTL最大值为255。
    ICMP数据包的格式图
    在这里插入图片描述

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

curl命令

curl命令获取指定URL的网页内容,并将其输出到终端

curl [选项][URL]
curl www.baidu.com
上传文件
curl -X POST -F "file=@/path/to/file" https://www.example.com/upload
向https://www.example.com/upload发送HTTP POST请求,将/path/to/file文件上传到服务器。

下载文件
curl -o filename https://www.example.com/file
从https://www.example.com/file下载文件,并保存为filename

在这里插入图片描述

抓取tcp的数据包:

sudo tcpdump -i enp0s3 tcp and host 153.3.238.102
-i enp0s3 抓取enp0s3网口的数据包
tcp 抓取tcp协议的数据包
host 主机过滤,抓取对应IP的数据包

在这里插入图片描述

sudo tcpdump -i enp0s3 tcp and host 153.3.238.102 -w tcp_sys_timeout.pcap
-w tcp_sys_timeout.pcap 把抓取到的数据包保存到tcp_sys_timeout.pcap文件

接着把 ping.pcap 文件拖到电脑,再用 Wireshark 打开它。打开后,你就可以看到下面这个界面:
数据包列表:编号 时间戳,源地址,目标地址,协议,长度,数据包信息
不同的协议有不同的颜色区分
在这里插入图片描述TCP(数据流协议)SOCK_STREAM
因此可以用Wireshark的流量图更加直观的看到数据流的传输过程:
统计- > 流量图
在这里插入图片描述数据包详细信息
在数据包列表选中某一个数据包,可以看到数据包详细信息,可以查看协议中的每一个字段

在这里插入图片描述
在这里插入图片描述Sequence Number(seq):32bit,表示tcp包的序列号,根据seq来确认是否有数据包丢失。
可以理解为:我已经发出了多少数据

Acknowledgment Number(ack):32bit,表示tcp包的确认号。表示已经收到对方多少数据。
可以理解为:我已经接收了多少数据
发出带有SYN或FIN标志的报文,seq需要+1;只带有ACK标志的报文,seq不需要+1。

对于TCP报文中seq和ack的理解

小林codeing的推文–实战!我用“大白鲨”让你看见 TCP

更多推荐