zoukankan      html  css  js  c++  java
  • 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连接过程中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,如果自己在这段事件内也有数据要发送,就跟确认一起发送,如果没有,则确认单独发送。而我们的抓包实验中,由服务器端先断开连接,之后客户端在确认的延迟时间内,也有请求断开连接需要发送,于是就与上次确认一起发送,因此就只有三个数据报了。

  • 相关阅读:
    《你不知道的JavaScript》【5b】——混合对象类
    为什么像素级是图像标注的未来?
    吐血整理!这可能是最全的机器学习工具手册
    斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...
    高数解题神器:拍照上传就出答案,这个中国学霸做的AI厉害了 | Demo
    那些酷炫的深度学习网络图怎么画出来的?
    斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...
    TensorFlow官方发布剪枝优化工具:参数减少80%,精度几乎不变
    干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个...
    常用的模型集成方法介绍:bagging、boosting 、stacking
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/13182107.html
Copyright © 2011-2022 走看看