#0 系列目录#html
#1 原由# 前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的情况。这个问题是偶发性的,大概发生的概率为5%-10%左右,这个几率已经至关高了。在排查问题的过程当中使用到了tcpdump和Wireshark进行抓包分析。感受这两个工具搭配起来干活,很是完美。全部的网络传输在这两个工具搭配下,都无处遁形。linux
为了更好、更顺手地可以用好这两个工具,特整理本篇文章,但愿也能给你们带来收获。为你们以后排查问题,添一利器。ios
#2 tcpdump与Wireshark介绍# 在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具同样,它的特色就是简单而强大。它是基于Unix系统的命令行式的数据包嗅探工具,能够抓取流动在网卡上的数据包
。express
默认状况下,tcpdump不会抓取本机内部通信的报文
。根据网络协议栈的规定,对于报文,即便是目的地是本机,也须要通过本机的网络协议层,因此本机通信确定是经过API进入了内核,而且完成了路由选择。【好比本机的TCP通讯,也必需要socket通讯的基本要素:src ip port dst ip port】编程
若是要使用tcpdump抓取其余主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何通过它的数据包,无论这个数据包是否是发给它或者是它发出的
。通常而言,Unix不会让普通用户设置混杂模式,由于这样能够看到别人的信息,好比telnet的用户名和密码,这样会引发一些安全上的问题,因此只有root用户能够开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡
。安全
Linux抓包原理:服务器
Linux抓包是经过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文以后,它会遍历系统中全部已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载类似,就是让系统中全部的已经注册的文件系统来进行尝试挂载,若是哪个认为本身能够处理,那么就完成挂载。网络
当抓包模块把本身假装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,伪装是本身接收到的报文,汇报给抓包模块。并发
Wireshark是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,通常只在图形界面平台下使用Wireshark,若是是Linux的话,直接使用tcpdump了,由于通常而言Linux都自带的tcpdump,或者用tcpdump抓包之后用Wireshark打开分析。框架
在Mac平台下,Wireshark经过WinPcap进行抓包,封装的很好,使用起来很方便,能够很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。
因此,tcpdump是用来抓取数据很是方便,Wireshark则是用于分析抓取到的数据比较方便。 #3 tcpdump使用# ##3.1 语法##
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
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"
##3.2 选项##
-A:以ASCII编码打印每一个报文(不包括链路层的头),这对分析网页来讲很方便; -a:将网络地址和广播地址转变成名字; -c<数据包数目>:在收到指定的包的数目后,tcpdump就会中止; -C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,若是超过了就新建文件(文件名后缀是一、二、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:用于筛选的逻辑表达式;
##3.3 命令实践##
tcpdump
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump Password: tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:00:19.788139 IP 10.37.63.3.50809 > 10.37.253.32.socks: Flags [.], ack 151417909, win 4096, length 0 11:00:19.790267 IP 10.37.253.32.socks > 10.37.63.3.50809: Flags [.], ack 1, win 560, options [nop,nop,TS val 1323324836 ecr 501713973], length 0 11:00:19.851362 IP 10.37.63.53.57443 > 239.255.255.250.ssdp: UDP, length 133 11:00:19.851367 IP 10.37.63.107.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:00:19.851369 IP 10.37.63.138.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:00:20.060087 IP 10.37.63.71.54616 > 239.255.255.250.ssdp: UDP, length 133
tcpdump -i en0
若是不指定网卡,默认tcpdump只会监视第一个网络接口,通常是eth0,下面的例子都没有指定网络接口。
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 11:04:31.780759 IP 10.37.63.100.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
tcpdump -i en0 host 10.37.63.255
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump host 10.37.63.255 tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:07:23.807683 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:23.913143 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.538785 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.643311 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.747672 IP 10.37.63.87.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST 11:07:25.374527 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:26.209995 IP 10.37.63.86.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:26.210530 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \)
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \) tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:10:38.395320 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:39.234047 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:39.962286 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:48.422443 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:49.153630 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:49.894146 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:52.600297 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
tcpdump -n host 10.37.63.255 and ! 10.37.63.61
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -n host 10.37.63.255 and ! 10.37.63.61 tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 15:54:33.921068 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.025490 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.025492 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.338753 IP 10.37.63.56.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.174516 IP 10.37.63.88.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.204268 IP 10.37.63.56.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.592199 IP 10.37.63.135.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61 Password: tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 16:02:48.168264 IP 10.37.63.107.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.272626 IP 10.37.63.28.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586137 IP 10.37.63.75.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586140 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586201 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586202 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.690751 IP 10.37.63.103.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.004792 IP 10.37.63.28.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.212622 IP 10.37.63.88.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.317969 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.317972 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.318301 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
tcpdump -i en0 src host 10.37.63.3 (注意数据流向)
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 src host 10.37.63.3 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:08:05.698674 IP 10.37.63.3.51503 > 101.201.169.146.https: Flags [.], ack 3067697680, win 4096, length 0 16:08:06.225543 IP 10.37.63.3.56531 > 10.37.253.51.domain: 49330+ PTR? 3.63.37.10.in-addr.arpa. (41) 16:08:06.228851 IP 10.37.63.3.56781 > 10.37.253.51.domain: 9247+ PTR? 146.169.201.101.in-addr.arpa. (46) 16:08:07.247441 IP 10.37.63.3.53716 > 10.37.253.51.domain: 60009+ PTR? 51.253.37.10.in-addr.arpa. (43) 16:08:08.198285 IP 10.37.63.3.newoak > 123.151.13.85.irdmi: UDP, length 47 16:08:08.254488 IP 10.37.63.3.51134 > 10.37.253.51.domain: 52763+ PTR? 85.13.151.123.in-addr.arpa. (44) 16:08:08.917142 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [P.], seq 341932595:341932930, ack 4196579612, win 65535, length 335 16:08:08.918050 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [P.], seq 335:804, ack 1, win 65535, length 469 16:08:08.984637 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [.], ack 292, win 65535, length 0
tcpdump -i en0 dst host 10.37.63.3 (注意数据流向)
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 dst host 10.37.63.3 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:10:00.120346 IP 123.151.13.85.irdmi > 10.37.63.3.newoak: UDP, length 47 16:10:00.447742 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [.], ack 3563461726, win 62712, length 0 16:10:00.449252 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [P.], seq 0:291, ack 1, win 62712, length 291 16:10:00.590941 IP 10.37.253.51.domain > 10.37.63.3.62089: 38134 NXDomain 0/1/0 (101) 16:10:00.593145 IP 10.37.253.51.domain > 10.37.63.3.56987: 19136 NXDomain* 0/0/0 (41) 16:10:01.598164 IP 10.37.253.51.domain > 10.37.63.3.63380: 43688 NXDomain* 0/0/0 (43) 16:10:03.194440 IP 123.151.13.85.irdmi > 10.37.63.3.newoak: UDP, length 79 16:10:03.880803 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [.], ack 806, win 63784, length 0 16:10:03.883452 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [P.], seq 291:582, ack 806, win 63784, length 291 16:10:04.051402 IP dns15.online.tj.cn.irdmi > 10.37.63.3.terabase: UDP, length 87
tcpdump -i en0 host 10.37.63.3 and tcp port 80
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host 10.37.63.3 and tcp port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:13:34.869399 IP 10.37.63.3.51843 > cncln.online.ln.cn.http: Flags [.], ack 3148173637, win 8192, length 0 16:13:34.890175 IP cncln.online.ln.cn.http > 10.37.63.3.51843: Flags [.], ack 1, win 31, length 0 16:13:49.497784 IP 10.37.63.3.51845 > 27.221.81.19.http: Flags [.], ack 3932049450, win 4096, length 0 16:13:49.497786 IP 10.37.63.3.51844 > 27.221.81.19.http: Flags [.], ack 3635221024, win 4096, length 0 16:13:49.513952 IP 27.221.81.19.http > 10.37.63.3.51845: Flags [.], ack 1, win 122, options [nop,nop,TS val 4035158002 ecr 876369829], length 0 16:13:49.518587 IP 27.221.81.19.http > 10.37.63.3.51844: Flags [.], ack 1, win 122, options [nop,nop,TS val 4035158002 ecr 876369829], length 0
tcpdump -i en0 host 10.37.63.3 and dst port 80
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host 10.37.63.3 and dst port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:19:36.187617 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [P.], seq 219000907:219001688, ack 4212585623, win 8192, length 781: HTTP: GET / HTTP/1.1 16:19:36.194163 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [.], ack 292, win 8182, length 0 16:19:36.194292 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [.], ack 453, win 8186, length 0
tcpdump -i en0 port 25 # 源端口 tcpdump -i en0 src port 25 # 目的端口 tcpdump -i en0 dst port 25网络过滤
tcpdump -i en0 net 192.168 tcpdump -i en0 src net 192.168 tcpdump -i en0 dst net 192.168 tcpdump -i en0 net 192.168.1 tcpdump -i en0 net 192.168.1.0/24
tcpdump -i en0 arp tcpdump -i en0 ip tcpdump -i en0 tcp tcpdump -i en0 udp tcpdump -i en0 icmp
tcpdump -i en0 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
tcpdump -i en0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
tcpdump -i en0 'tcp[tcpflags] = tcp-syn'
tcpdump -i en0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
tcpdump -i en0 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x47455420' # 0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT" tcpdump -XvvennSs 0 -i en0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x5353482D' # 抓老版本的 SSH 返回信息,如"SSH-1.99.." tcpdump -i en0 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'
如前两个的包头过滤,首先了解如何从包头过滤信息:
proto[x:y] : 过滤从x字节开始的y字节数。好比ip[2:2]过滤出三、4字节(第一字节从0开始排) proto[x:y] & z = 0 : proto[x:y]和z的与操做为0 proto[x:y] & z !=0 : proto[x:y]和z的与操做不为0 proto[x:y] & z = z : proto[x:y]和z的与操做为z proto[x:y] = z : proto[x:y]等于z
操做符 : >, <, >=, <=, =, !=
抓取端口大于1024的TCP数据包:
tcpdump -i en0 'tcp[0:2] > 1024'
tcpdump -i en0 udp dst port 53
-c 参数对于运维人员来讲也比较经常使用,由于流量比较大的服务器,靠人工 CTRL+C 仍是抓的太多,因而能够用-c 参数指定抓多少个包。
time tcpdump -nn -i en0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令计算抓 10000 个 SYN 包花费多少时间,能够判断访问量大概是多少。
实时抓取端口号8000的GET包,而后写入GET.log
tcpdump -i en0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
##3.4 抓个网站练练## 想抓取访问某个网站时的网络数据。好比网站 http://www.baidu.com/ 怎么作?
tcpdump -i en0 host www.baidu.com
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
wget www.baidu.cn
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:43:08.444405 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [S], seq 3066364056, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 878169772 ecr 0,sackOK,eol], length 0 16:43:08.446470 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [S.], seq 3537377541, ack 3066364057, win 65535, options [mss 1440,nop,wscale 7,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0 16:43:08.446517 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [.], ack 1, win 8192, length 0 16:43:08.446553 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [P.], seq 1:142, ack 1, win 8192, length 141: HTTP: GET / HTTP/1.1 16:43:08.450529 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], ack 142, win 202, length 0 16:43:08.451264 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [P.], seq 1:962, ack 142, win 202, length 961: HTTP: HTTP/1.1 200 OK 16:43:08.451270 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], seq 962:2402, ack 142, win 202, length 1440: HTTP 16:43:08.451318 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], seq 2402:3842, ack 142, win 202, length 1440: HTTP
确认序列号ack为什么是1。这是相对值,如何显示绝对值
tcpdump -S -i en0 host www.baidu.com
再次访问这个网站
wget www.baidu.com
控制台输出:
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -S -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:50:11.911342 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [S], seq 1888894292, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 878592161 ecr 0,sackOK,eol], length 0 16:50:11.916158 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [S.], seq 2526934941, ack 1888894293, win 65535, options [mss 1440,nop,wscale 7,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0 16:50:11.916208 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [.], ack 2526934942, win 8192, length 0 16:50:11.916308 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, length 141: HTTP: GET / HTTP/1.1 16:50:11.919124 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], ack 1888894434, win 202, length 0 16:50:11.922055 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [P.], seq 2526934942:2526935943, ack 1888894434, win 202, length 1001: HTTP: HTTP/1.1 200 OK 16:50:11.922060 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], seq 2526935943:2526937383, ack 1888894434, win 202, length 1440: HTTP 16:50:11.922115 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], seq 2526937383:2526938823, ack 1888894434, win 202, length 1440: HTTP
tcpdump -A -i en0 host www.baidu.com
将抓取的结果存到文件,好比文件 file1
tcpdump -A -i en0 -w file1 host www.baidu.com
如何读取这个文件的基本信息
tcpdump -r file1
想要了解更多,好比上面的http报文
tcpdump -A -r file1
也同时想要将确认序列号ack打印成绝对值
tcpdump -AS -r file1
注:
无参数的选项好比 -A, -S, -e, 等。都可以共用一个减号
'src host www.baidu.cn' 属于 expression ,若是太长,能够用单引号括起来:
tcpdump -i en0 'src host www.baidu.com'
16:50:11.916308 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, length 141: HTTP: GET / HTTP/1.1
第一列是时间戳:时、分、秒、微秒
第二列是网际网路协议的名称
第三列是报文发送方的十进制的网际网路协议地址,以及紧跟其后的端口号(偶尔会是某个协议名如 http ,若是在此处仍然显示端口号加上 -n 选项)
第四列是大于号
第五列是报文接收方的十进制的网际网路协议地址,以及紧跟其后的端口号(偶尔会是某个协议名如 http ,若是在此处仍然显示端口号加上 -n 选项)
第六列是冒号
第七列是 Flags 标识,可能的取值是 [S.] [.] [P.] [F.]
第8、9、十……列 是tcp协议报文头的一些变量值:
seq 是 请求同步的 序列号 ack 是 已经同步的 序列号 win 是 当前可用窗口大小 length 是 tcp协议报文体的长度 若是加入了-S选项,会看到的 seq, ack 是 两个冒号分割的值,分别表示变动前、后的值。
#4 tcpdump抓取TCP包分析# TCP传输控制协议是面向链接的可靠的传输层协议,在进行数据传输以前,须要在传输数据的两端(客户端和服务器端)建立一个链接,这个链接由一对插口地址惟一标识,便是在IP报文首部的源IP地址、目的IP地址,以及TCP数据报首部的源端口地址和目的端口地址
。TCP首部结构以下:
注意:一般状况下,一个正常的TCP链接,都会有三个阶段:一、TCP三次握手;二、数据传送;三、TCP四次挥手
其中在TCP链接和断开链接过程当中的关键部分以下:
源端口号:即发送方的端口号,在TCP链接过程当中,对于客户端,端口号每每由内核分配,无需进程指定;
目的端口号:即发送目的的端口号;
序号:即为发送的数据段首个字节的序号;
确认序号:在收到对方发来的数据报,发送确认时期待对方下一次发送的数据序号;
SYN:同步序列编号,Synchronize Sequence Numbers;
ACK:确认编号,Acknowledgement Number;
FIN:结束标志,FINish;
##4.1 TCP三次握手## 三次握手的过程以下:
step1. 由客户端向服务器端发起TCP链接请求。Client发送:
同步序列编号SYN置为1,发送序号Seq为一个随机数,这里假设为X,确认序号ACK置为0
;step2. 服务器端接收到链接请求。Server响应:
同步序列编号SYN置为1,并将确认序号ACK置为X+1,而后生成一个随机数Y做为发送序号Seq(由于所确认的数据报的确认序号未初始化)
;step3. 客户端对接收到的确认进行确认。Client发送:
将确认序号ACK置为Y+1,而后将发送序号Seq置为X+1(即为接收到的数据报的确认序号)
;
对于step3的做用,假设一种状况,客户端A向服务器B发送一个链接请求数据报,而后这个数据报在网络中滞留致使其迟到了
,虽然迟到了,可是服务器仍然会接收并发回一个确认数据报。可是A却由于久久收不到B的确认而将发送的请求链接置为失效,等到一段时间后,接到B发送过来的确认
,A认为本身如今没有发送链接,而B却一直觉得链接成功了,因而一直在等待A的动做,而A将不会有任何的动做了。这会致使服务器资源白白浪费掉了
,所以,两次握手是不行的,所以须要再加上一次,对B发过来的确认再进行一次确认,即确认此次链接是有效的,从而创建链接
。
有的系统中是显式的初始化序号是0,可是这种已知的初始化值是很是危险的,由于这会使得一些黑客钻漏洞,发送一些数据报来破坏链接
。所以,初始化序号由于取随机数会更好一些,而且是越随机越安全。
tcpdump抓TCP三次握手抓包分析:
sudo tcpdump -n -S -i lo0 host 10.37.63.3 and tcp port 8080 # 接着再运行: curl http://10.37.63.3:8080/atbg/doc
控制台输出:
# TCP三次握手 start 16:00:13.486776 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [S], seq 1944916150, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 906474698 ecr 0,sackOK,eol], length 0 16:00:13.486850 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [S.], seq 1119565918, ack 1944916151, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 906474698 ecr 906474698,sackOK,eol], length 0 16:00:13.486860 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119565919, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 0 16:00:13.486868 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916151, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 0 # TCP三次握手 end # 传输数据 start 16:00:13.486923 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [P.], seq 1944916151:1944916238, ack 1119565919, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 87: HTTP: GET /atbg/doc HTTP/1.1 16:00:13.486944 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916238, win 12756, options [nop,nop,TS val 906474698 ecr 906474698], length 0 16:00:13.489750 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [P.], seq 1119565919:1119571913, ack 1944916238, win 12756, options [nop,nop,TS val 906474701 ecr 906474698], length 5994: HTTP: HTTP/1.1 200 OK 16:00:13.489784 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571913, win 12572, options [nop,nop,TS val 906474701 ecr 906474701], length 0 # 传输数据 end # TCP四次挥手 start 16:00:13.490836 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [F.], seq 1944916238, ack 1119571913, win 12572, options [nop,nop,TS val 906474702 ecr 906474701], length 0 16:00:13.490869 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916239, win 12756, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.490875 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571913, win 12572, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.491004 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [F.], seq 1119571913, ack 1944916239, win 12756, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.491081 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571914, win 12572, options [nop,nop,TS val 906474702 ecr 906474702], length 0 # TCP四次挥手 end
每一行中间都有这个包所携带的标志:
S=SYN,发起链接标志。
P=PUSH,传送数据标志。
F=FIN,关闭链接标志。
ack,表示确认包。
RST=RESET,异常关闭链接。
.,表示没有任何标志。
第1行:16:00:13.486776,从10.37.63.3(client)的临时端口61725向10.37.63.3(server)的8080监听端口发起链接,client初始包序号seq为1944916150,滑动窗口大小为65535字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为16344(便可接收的最大包长度,一般为MTU减40字节,IP头和TCP头各20字节)。【seq=1944916150,ack=0,syn=1】
第2行:16:00:13.486850,server响应链接,同时带上第一个包的ack信息,为client端的初始包序号seq加1,即1944916151,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号seq为1119565918,mss也是16344。【seq=1119565918,ack=1944916151,syn=1】
第3行:15:46:13.084161,client再次发送确认链接,tcp链接三次握手完成,等待传输数据包。【ack=1119565919,seq=1944916151】
##4.2 TCP四次挥手## 链接双方在完成数据传输以后就须要断开链接。因为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最后发送的确认可以到达主机B。若是处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开链接请求,而后主机A就能够有足够的时间去再次发送确认。可是这也只能尽最大力量来确保可以正常断开,若是主机A的确认老是在网络中滞留失效,从而超过了2MSL,最后也没法正常断开;
第二,若是主机A在发送了确认以后当即进入CLOSED状态。假设以后主机A再次向主机B发送一条链接请求,而这条链接请求比以前的确认报文更早地到达主机B,则会使得主机B觉得这条链接请求是在旧的链接中A发出的报文,并不当作是一条新的链接请求了,即便得这个链接请求失效了,增长2MSL的时间可使得这个失效的链接请求报文做废,这样才不影响下次新的链接请求中出现失效的链接请求。
由于在TCP链接过程当中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,若是本身在这段事件内也有数据要发送,就跟确认一块儿发送,若是没有,则确认单独发送。而咱们的抓包实验中,由服务器端先断开链接,以后客户端在确认的延迟时间内,也有请求断开链接须要发送
,因而就与上次确认一块儿发送,所以就只有三个数据报了。
#5 Wireshark分析tcpdump抓包结果#
tcpdump -i lo0 -s 0 -n -S host 10.37.63.3 and port 8080 -w ./Desktop/tcpdump_10.37.63.3_8080_20160525.cap # 而后再执行curl curl http://10.37.63.3:8080/atbg/doc
No. 1-4 行:TCP三次握手环节;
No. 5-8 行:TCP传输数据环节;
No. 9-13 行:TCP四次挥手环节;
弹窗以下图所示,上面红色部分为请求信息,下面蓝色部分为响应信息:
以上是Wireshark分析tcpdump的简单使用,Wireshark更强大的是过滤器工具,你们能够自行去多研究学习Wireshark,用起来仍是比较爽的。
推荐几个关于Wireshark的文章: