tcpdump抓包与tcp握手

tcpdump -i eht0  -w file.cap host 192.168.168.18 and tcp port 8081

tcpdump -i wlo1 -A -s0 -w 111.pcap

1、语法中的关键字

host(缺省类型): 指明一台主机,如:host 210.27.48.2

net: 指明一个网络地址,如:net 202.0.0.0

port: 指明端口号,如:port 23

 

确定方向的关键字

src: src 210.27.48.2, IP包源地址是210.27.48.2

dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0

dst or src(缺省值)

dst and src

 

协议的关键字:缺省值是监听所有协议的信息包

fddi、ip、arp、rarp、tcp、udp

 

其他关键字

gateway、broadcast、less、greater

 

常用表达式:多条件时可以用括号,但是要用转义

非 : ! or “not” (去掉双引号)

且 : && or “and”

或 : || or “or”

 

语法中的选项

-A  # 以ASCII编码打印每个报文(不包括链路层的头)

-a  # 将网络地址和广播地址转变成名字

-c  # 在收到指定的包的数目后,命令停止

-C  # 用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加)

-d  # 将匹配信息包的代码以人们能够理解的汇编格式给出

-dd  # 将匹配信息包的代码以c语言程序段的格式给出

-ddd  # 将匹配信息包以十进制的形式给出

-D  # 列出当前主机的所有网卡编号和名称,可以用于选项 -i

-e  # 在输出行打印出数据链路层的头部信息

-f  # 将外部的intetnet地址以数字形式打印出来

-F  # 从指定的文件中读取表达式,忽略其他的表达式

-i  # 监听主机该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),any用于指代任意网卡

-l  # 如果没有使用-w选项,就可以将报文打印到标准输出终端

-n  # 显示ip,而不是主机名

-N  # 不列出域名

-O  # 不将数据包编码最佳化

-p  # 不让网络界面进入混杂模式

-q  # 快速输出,仅列出少数的传输协议信息

-r  # 从指定的文件中读取信包(这些包一般通过-w产生,即抓包写入到文件)

-s  # 指定抓包显示一行的宽度,-s0表示可安包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernet的MTU都是1500字节,所以要抓取大于60字节的包时,使用默认参数就会导致数据包丢失

-S  # 用绝对而非相对值列出TCP关联数

-t  # 在输出的每一行不打印时间戳

-tt  # 在输出的每一行显示未经格式化的时间戳记

-T  # 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)

-v  # 输出一个稍微详细的信息,列如在ip包中可以包括ttl和服务类型信息

-vv  # 输出详细的报文信息

-x/-xx/-X/-XX  # 以十六进制显示包内容,四个选项差别不大

-w  # 直接将抓取的包写入文件中,不分析和显示

expression  # 用于筛选的逻辑表达式

 

命令实践

1、tcpdump  # 直接启动tcpdump并将抓取所有经过第一个网络接口上的数据包

2、tcpdump -i eth0  # 抓取经过指定网卡上的包

3、tcpdump -i eth0 host 192.168.1.1 # 抓取所有经过 eth0,目的或源地址是 192.168.1.1的网络数据

4、tcpdump host192.168.1.1 and (192.168.1.2 or 192.168.1.3)  # 抓取主机192.168.1.1和主机192.168.1.2或192.168.1.3的通信

5、tcpdump -n host 192.168.1.1 and  ! 192.168.1.2     # 抓取主机192.168.1.1除了和主机192.168.1.2之外所有主机通信的数据包

6、tcpdump ip -n host 192.168.1.1 and  ! 192.168.1.2  #  抓取主机192.168.1.1除了和主机192.168.1.2之外所有主机通信的ip包

7、tcpdump -i eth0 src host 192.168.1.1 #  抓取主机192.168.1.1发送的所有数据

8、tcpdump -i eth0 dst host 192.168.1.1  #  抓取主机192.168.1.1接收的所有数据

9、tcpdump -i eth0 host 192.168.1.1 and tcp port 80  #  抓取主机192.168.1.1所有在TCP 80端口的数据包

10、tcpdump -i eth0 host 192.168.1.1 and dst port 80   #  抓取HTTP主机192.168.1.1在80端口接收到的数据包

11、tcpdump -i eth0 port 25  #  抓取所有经过 eth0,目的或源端口是 25 的网络数据

12、tcpdump -i eth0 src port 25  #  抓取所有经过 eth0,源端口是 25 的网络数据

13、tcpdump -i eth0 dst port 25  #  抓取所有经过 eth0,目的端口是 25 的网络数据

14、tcpdump -i eth0 net 192.168  #  抓取所有经过 eth0,网络是 192.168上的数据包

15、tcpdump -i eth0 src net 192.168  #  抓取所有经过 eth0,源网络是 192.168上的数据包

16、tcpdump -i eth0 dst net 192.168  #  抓取所有经过 eth0,目的网络是 192.168上的数据包

17、tcpdump -i eth0 net 192.168.1  #  抓取所有经过 eth0,网络是 192.168.1上的数据包

18、tcpdump -i eth0 net 192.168.1/24  #  抓取所有经过 eth0,网络是 192.168.1掩码是24上的数据包

19、tcpdump -i eth0 arp  #  抓取eth0网口arp协议的包

20、tcpdump -i eth0 ip  #  抓取eth0网口ip协议的包

21、tcpdump -i eth0 tcp  #  抓取eth0网口tcp协议的包

22、tcpdump -i eth0 udp  #  抓取eth0网口udp协议的包

23、tcpdump -i eth0 icmp  #  抓取eth0网口icmp协议的包

24、tcpdump -i eth0 ‘((tcp) and (port 80) and ((dst host 192.168.1.1) or (dst host 192.168.1.2)))’  #  抓取所有经过 en0,目的地址是 192.168.1.1 或 192.168.1.2 端口是 80 的 TCP 数据

25、tcpdump -i eth0 '((icmp)  and (ether dst host 00:01:02:03:04:05))'  #  抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

26、tcpdump -i eth0 '((tcp)  and (dst net 192.168) and (not dst host 192.168.1.2))'  #  抓取所有经过 eth0,目的网络是 192.168,但目的主机不是 192.168.1.2 的 TCP 数据

27、time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /xxx   #  计算抓取10000个SYN包花费多少市检,可以判断访问量

28、tcpdump -i eth0 host www.baidu.com  #  通过tcpdump截获主机www.baidu.com发送与接收所有的数据包

 

分析抓取到的报文

 

 

TCP 三次握手示意

 

 

TCP 四次挥手(即断开请求四次请求)

 

 

step1. 主机A向主机B发起断开连接请求,之后主机A进入FIN-WAIT-1状态;

step2. 主机B收到主机A的请求后,向主机A发回确认,然后进入CLOSE-WAIT状态;

step3. 主机A收到B的确认之后,进入FIN-WAIT-2状态,此时便是半关闭状态,即主机A失去发送能力,但是主机B却还能向A发送数据,并且A可以接收数据。此时主机B占主导位置了,如果需要继续关闭则需要主机B来操作了;

step4. 主机B向A发出断开连接请求,然后进入LAST-ACK状态;

step5. 主机A接收到请求后发送确认,进入TIME-WAIT状态,等待2MSL之后进入CLOSED状态,而主机B则在接受到确认后进入CLOSED状态;

为何主机A在发送了最后的确认后没有进入CLOSED状态,反而进入了一个等待2MSL的TIME-WAIT主要作用有两个:

第一,确保主机A最后发送的确认能够到达主机B。如果处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开连接请求,然后主机A就可以有足够的时间去再次发送确认。但是这也只能尽最大力量来确保能够正常断开,如果主机A的确认总是在网络中滞留失效,从而超过了2MSL,最后也无法正常断开;

第二,如果主机A在发送了确认之后立即进入CLOSED状态。假设之后主机A再次向主机B发送一条连接请求,而这条连接请求比之前的确认报文更早地到达主机B,则会使得主机B以为这条连接请求是在旧的连接中A发出的报文,并不看成是一条新的连接请求了,即使得这个连接请求失效了,增加2MSL的时间可以使得这个失效的连接请求报文作废,这样才不影响下次新的连接请求中出现失效的连接请求。

为什么断开连接请求报文只有三个,而不是四个因为在TCP连接过程中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,如果自己在这段事件内也有数据要发送,就跟确认一起发送,如果没有,则确认单独发送。而我们的抓包实验中,由服务器端先断开连接,之后客户端在确认的延迟时间内,也有请求断开连接需要发送,于是就与上次确认一起发送,因此就只有三个数据报了。

 

posted @ 2020-06-23 15:00  clyde_S  阅读(680)  评论(0编辑  收藏  举报