一。tcpdump工具的使用
==> 安装
yum install -y tcpdump
==》 更多命令使用
# 列出可以抓包的网络接口 (网卡)
tcpdump -D
# 抓取所有网卡的包
tcpdump -i any
# 抓取5次 ping报文信息
tcpdump -i any -c5 icmp
# 抓取 与 目标地址相关的数据包
tcpdump -i any -c5 -nn host 54.204.39.132
# 抓取80端口的数据包
tcpdump -i any -c5 -nn port 80
# 源ip匹配的地址 (左边匹配)
tcpdump -i any -c5 -nn src 192.168.122.98
# 改为显示绝对序号 (默认在握手成功后 ack变为从1开始)
-S
# 使用and 或or来过滤规则 同时可以加上 () 让条件更复杂多样
tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
其它参数
-A:以ASCII编码打印每个报文(不包括链路层的头),这对分析网页来说很方便;
-a:将网络地址和广播地址转变成名字;
-c<数据包数目>:在收到指定的包的数目后,tcpdump就会停止;
-C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
-d:将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd:将匹配信息包的代码以c语言程序段的格式给出;
-ddd:将匹配信息包的代码以十进制的形式给出;
-D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
-i<网络界面>:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),linux 2.2 内核及之后的版本支持 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:以十六进制显示包内容,几个选项只有细微的差别,详见man手册;
-w<数据包文件>:直接将包写入文件中,并不分析和打印出来;
expression:用于筛选的逻辑表达式;
二、 实际的tcp请求的理解
这里首先要理解几个概念
为什么要用tcp ,ip 不够吗?
实际上网络协议到了ip层就已经实现了通信,
tcp (transmission Control Protocol)重点在于 Control 是为了达到控制,控制可靠性
tcp 的格式:
源端口,目标端口
序号 Seq
确认号 Ack
首部长度,保留,标志位,窗口
校验和,紧急指针
选项项,填充
数据Data
序号 seq (sequence Number) 是用来解决乱序问题的。
确认号 ack (Acknowledgment Number) 是用来解决丢包情况的,告诉发送方这个包我收到了。
三次握手,其实是为了初始化序号 SYN (synchronize sequence Number)
举例流程-三次握手:
确认号为序号+1
我 -seq100》
你 -seq105 ack101》我
我 -ack106》你
这就完成了三次握手
举例流程-tcp传输:
接下来是交互过程(在三次握手初始化后会给对方一个初始化后的seq来用,双方各有一个)
我 -seq 101(101:111)(length 10)
你 -ack 111
你 -seq 106(106:126)(length 20)
我 -ack 126
。。。。
举例流程-四次挥手:
我 -seq 359 ack 1077 [fin]
你 -ack 360
你 -seq 1077 ack 360 [fin]
我 -ack 1078
从上面可见,三次握手的过程实际上是为了同步给对方seq 序号,具体流程是我告诉你我的序号,你把我的序号+1,来证明知道了,同时发送了你的序号,我也把你的序号+1,证明我也知道了。
这也就解释了为什么要三次才能握手,因为同步SYN过程最少也要像这样走三下,同时如果走四下会浪费一次请求。
另外四次挥手为什么要四次,原因是tcp协议是全双工的,也就是我能发给你,你也能发给我,要断开连接必须双方都确认才能断开。
断开的双方都将上一次自己收到的对方最后ack的序号作为seq,并发给对方ack,对方回复一个ack=seq+1 即完成关断
三、tcpdump执行后的结果分析
# 使用如下命令抓取80端口
》》》tcpdump -i any -c5 -nn port 80
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
# 三次握手
11:53:21.695073 IP 我 > 你: Flags [S], seq 196875948, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
11:53:21.695105 IP 你 > 我 : Flags [S.], seq 4087077141, ack 196875949, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
11:53:21.695349 IP 我 > 你: Flags [.], ack 1, win 4106, length 0
# 数据传输
11:53:21.695497 IP 我 > 你: Flags [P.], seq 1:539, ack 1, win 4106, length 538: HTTP: GET / HTTP/1.1
11:53:21.695511 IP 你 > 我 : Flags [.], ack 539, win 237, length 0
11:53:21.695997 IP 你 > 我 : Flags [P.], seq 1:180, ack 539, win 237, length 179: HTTP: HTTP/1.1 304 Not Modified
11:53:21.736287 IP 我 > 你: Flags [.], ack 180, win 4105, length 0
# 使用如下命令抓取80端口,不要相对序号,要绝对序号
》》》tcpdump -S -i any -c5 -nn port 80
11:58:21.495550 IP 我 > 你主机: Flags [S], seq 493576005, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
11:58:21.495599 IP 你主机 > 我: Flags [S.], seq 2487186919, ack 493576006, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
11:58:21.495811 IP 我 > 你主机: Flags [.], ack 2487186920, win 4106, length 0
11:58:21.496316 IP 我 > 你主机: Flags [P.], seq 493576006:493576544, ack 2487186920, win 4106, length 538: HTTP: GET / HTTP/1.1
11:58:21.496336 IP 你主机 > 我: Flags [.], ack 493576544, win 237, length 0
11:58:21.497167 IP 你主机 > 我: Flags [P.], seq 2487186920:2487187099, ack 493576544, win 237, length 179: HTTP: HTTP/1.1 304 Not Modified
11:58:21.539155 IP 我 > 你主机: Flags [.], ack 2487187099, win 4105, length 0
四次挥手的样本
13:49:48.484108 IP 主机 > 192.168.41.1.60873: Flags [F.], seq 359, ack 1077, win 245, length 0
13:49:48.484271 IP 192.168.41.1.60873 > 主机: Flags [.], ack 360, win 4104, length 0
13:49:56.188338 IP 192.168.41.1.60873 > 主机: Flags [F.], seq 1077, ack 360, win 4104, length 0
13:49:56.188386 IP 主机 > 192.168.41.1.60873: Flags [.], ack 1078, win 245, length 0
上面的字段
时间戳(micro-timestamp) 上层协议 发送方ip.port > 接收方ip.port : 【标记】 seq/ack(序号/答复号) win(window窗口大小 可以接受长度) length(长度) 下层协议 协议头
flag 部分 [S] 表示 seq 被设置 [.] 表示 ack 被设置 [P] 表示发送数据 [F] 表示fin进行挥手告别