使用tcpdump +wireshark分析linux网络性能问题 - Linux - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > 服务器系统 > Linux

使用tcpdump +wireshark分析linux网络性能问题

发布时间:2016-07-21 来源:服务器之家

linux网络问题分析的大刀:tcpdump +wireshark

1.参考
2.熟悉tcpdump工具
3.以工作中dhcp服务为例,查找linux下的网络问题。

本文主要来自网络各家:
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
http://www.tuicool.com/articles/EVVBrq
http://www.cnblogs.com/AloneSword/p/4510189.html
http://www.doc88.com/p-5807317030896.html
http://www.daxueba.net/?p=328
http://www.cr173.com/html/20128_4.html
http://www.linuxfly.org/post/183/


2.关于tcpdump
在 Linux 里抓包,然后在Windows 里分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析


DHCP的作用:

 

在局域网中,用户电脑都需要IP地址才使用网络服务,但是客户并不都会配置IP地址,这时,可以在网络中部署一个DHCP服务器,用来给这些客户主机动态的分配IP。所有DHCP的客户端,在向DHCP服务器租用到地址后,会在DHCP服务器端留下租用信息,网络管理员可以根据这些分配信息统一管理这些客户。

 

DHCP的一些概念:

DHCP是一个典型的Client/Server模型的协议,使用UDP传输
<1>.DHCP Server端,使用UDP端口:67 DHCP
<2>. Client端,使用UDP端口:68

DHCP的基本工作流程

DHCP的客户端如果把网卡的IP地址配置为动态获取IP的方式,就会发送DHCP请求,来寻找DHCP服务器申请地址;

DHCP的在客户端申请、服务器下发地址的过程中,一共会产生四个数据包,如下:

根据这四个数据包来看,DHCP的工作流程如下图:

DHCP详细工作流程解析

第一步:

DHCP客户端主动发起DHCP
Discover包,用来寻找DHCP服务器,其中:源MAC是自己的MAC地址,目的MAC是FFFF.FFFF.FFFF的广播。源IP是0.0.0.0(现在还没有IP,就用全0地址),目的IP是255.255.255.255的三层广播。因为DHCP服务器在哪里还不知道,所以使用广播来寻找,广播会泛洪到整个网段中;
例如:在 Windows 的预设情形下,Dhcpdiscover 的等待时间预设为 1 秒,也就是当客户端将第一个
Dhcpdiscover 封包送出去之后,在 1 秒之内没有得到回应的话,就会进行第二次 Dhcpdiscover
广播。若一直得不到回应的情况下,客户端一共会有四次 Dhcpdiscover 广播(包括第一次在内),除了第一次会等待 1
秒之外,其余三次的等待时间分别是 9﹑13﹑16 秒。如果都没有得到 DHCP 伺服器的回应,客户端则会显示错误信息,宣告
Dhcpdiscover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 Dhcpdiscover
的过程。

第二步:

DHCP服务器收到客户端发的DHCP
Discover之后,会在自己的地址池中拿出一个没有分配的地址以及配套的参数(如:掩码、DNS、网关、域名、租期……),然后以一个DHCP
Offer包发送出去。这个DHCP
Offer数据包的地址如下:源MAC是DHCP服务器的MAC,目的MAC是FFFF.FFFF.FFFF的广播。源IP是DHCP服务器的IP,目的IP是255.255.255.255的广播。这时客户端还没有获得IP,DHCP服务器端现在还无法定位客户端,所以用广播来回应。

第三步:

客户端收到这个DHCP Offer后,会再发出一个DHCP
Request给服务器来申请这个Offer中包含的地址。这个时候,客户端还没有正式拿到地址,所以还需要向DHCP服务器申请,告诉所有
DHCP 伺服器它将指定接受哪一台伺服器提供的 IP
位址。这时客户端的源IP还是0.0.0.0,目的IP还是255.255.255.255。源MAC是客户端的MAC,目的MAC是FFFF.FFFF.FFFF广播包。
同时,客户端还会向网路发送一个 ARP 封包,查询网路上面有没有其它机器使用该 IP 位址;如果发现该 IP
已经被占用,客户端则会送出一个
DHCPDECLINE 封包给 DHCP 伺服器,拒绝接受其 Dhcpoffer ,并重新发送 Dhcpdiscover
信息。
事实上,并不是所有 DHCP 客户端都会无条件接受 DHCP 伺服器的 offer ,尤其这些主机安装有其它 TCP/IP
相关的客户软体。客户端也可以用 Dhcprequest 向伺服器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP
Option
Field 里面:

换一句话说,在 DHCP 伺服器上面的设定,未必是客户端全都接受,客户端可以保留自己的一些 TCP/IP
设定。而主动权永远在客户端这边。

第四步:

服务器收到客户端的请求后,会发出一个DHCP ACK用来确认这个IP地址可以分配给这个客户端。客户端收到第四个DHCP

ACK数据包才算正式拿到了这个IP。

"这里写图片描述" >
Dhcp客服端都是广播,dhcp服务端不是广播。

5.重新登录。
以后DHCP客户机每次重新登录网络时,就不需要再发送DHCPdiscover发现信息了,而是直接发送包含前一次所分配的IP地址的DHCPrequest请求信息。当DHCP服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP地址,并回答一个DHCPack确认信息。假如此IP地址已无法再分配给原来的DHCP客户机使用时(比如此IP地址已分配给其它DHCP客户机使用),则DHCP服务器给DHCP客户机回答一个DHCPnack否认信息。当原来的DHCP客户机收到此DHCPnack否认信息后,它就必须重新发送DHCPdiscover发现信息来请求新的IP地址。

6.更新租约。
DHCP服务器向DHCP客户机出租的IP地址一般都有一个租借期限,期满后DHCP服务器便会收回出租的IP地址。假如DHCP客户机要延长其IP租约,则必须更新其IP租约。DHCP客户机启动时和IP租约期限过一半时,DHCP客户机都会自动向DHCP服务器发送更新其IP租约的信息。

7.跨网路的 DHCP 运作
从前面描述的过程中,我们不难发现:DHCDISCOVER 是以广播方式进行的,其情形只能在同一网路之内进行,因为 router 是不会将广播传送出去的。但如果 DHCP 伺服器安设在其它的网路上面呢﹖由于 DHCP 客户端还没有 IP 环境设定,所以也不知道 Router 位址,而且有些 Router 也不会将 DHCP 广播封包传递出去,因此这情形下 DHCPDISCOVER 是永远没办法抵达 DHCP 伺服器那端的,当然也不会发生 OFFER 及其他动作了。要解决这个问题,我们可以用 DHCP Agent (或 DHCP Proxy )主机来接管客户的 DHCP 请求,然后将此请求传递给真正的 DHCP 伺服器,然后将伺服器的回复传给客户。这里,Proxy 主机必须自己具有路由能力,且能将双方的封包互传对方。

小结:

 

下面是一个直观的总结。假设我们把DHCP客户机比做餐馆里的客人,DHCP服务器比做服务员(一个餐馆里也可以有多个服务员),IP地址比做客户需要的食物。那么可以这样描述整个过程:

 

(1)客人走进餐馆,问:“有没有服务员啊?”(DHCPdiscover);
(2)多个服务员同时回答:“有,我这有鸡翅”“有,我这有汉堡”(DHCPoffer)。
(3)客人说:“好吧,我要一份汉堡”(DHCPrequest,这个客人比较死板,总是选择第一次听到的食物);
(4)端着汉堡的服务员回应了一声:“来啦”(DHCPack),并把食物端到客人面前,供其享用(将网卡和IP地址绑定)。
(5)客人下次来的时候,就直接找上次那个服务员点自己喜欢的汉堡了(DHCPrequest);
(6)如果还有汉堡,服务员会再次确认并上菜(DHCPack),而如果已经卖完了,服务员则会告诉客人:“不好意思,已经卖完了”(DHCPnack)。
(7)当然,服务员隔一段时间会来收拾一次桌子,除非客人特别说明这菜还要继续吃的,服务员会将剩菜端走。

DHCP支持三种类型的地址分配:
1. 自动分配方式:
DHCP给主机指定一个永久的IP地址,一旦DHCP客户端第一次成功的从DHCP伺服器端租用到IP位址之后﹐就永远使用这个位址
2. 动态分配方式:
DHCP给主机指定一个有”时间限制(租约)”的IP地址,到时间(租约到期)或主机明确表示放弃这个地址(主机主动断开连接)时,这个地址可以被其他的主机使用,当然,客户端可以比其它主机更优先的延续(renew)租约,或是租用其它的IP位址
3. 手工分配方式:
主机的IP地址是由网络管理员指定的,它可以按照MAC地址来固定的分配IP位址﹐DHCP只是把指定的IP地址告诉主机,相当于将某个MAC和IP进行了静态绑定

DHCP有3个端口,其中:
1.UDP67: DHCP Server服务端口
2. UDP68: DHCP Client服务端口
3. UDP546: 用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做”双机热备”的

0x1: DHCP协议的封装
链路层头 IP头 UDP头 DHCP报文
1.链路层头: 承载报文的链路层信息头,常见的有Ethernet_II格式、802.1Q格式、 IEEE802.3格式、令牌环链路层头格式等。
2.IP头: 标准的IP协议头,IPV4中长度为20bytes,包括了SrcIp,DstIp等信息。
3.UDP头: 8bytes,包括了SrcPort,DstPort,报文长度及UDP校验和等信息。
4.DHCP报文:具体的DHCP报文内容。

0x2: DHCP协议本身的报文格式

1.OP:
1.1) client发送给server的封包,设为1
1.2) server发送给client的封包,设为2
2.HTYPE: 硬件类别
2.1) 1表示10Mb/s的以太网(Ethernet)的硬件地址
3.HLEN: 硬件地址长度、
3.1) Ethernet为6(字节)
4.HOPS: 跳数,若封包需经过router传送,每站加 1,若在同一网内,为0(客户端的初始设置为0)
5.XID: TRANSACTION ID(事务ID),DHCP REQUEST 时产生的数值,服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。以作 DHCPREPLY 时的依据
5. SECONDS: 由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数

FLAGS:从0到15共16 bits
6.1) 最左1Bit为1时表示 server将以广播方式传送封包给client
6.2) 最左1Bit为0时表示 server将以单播方式传送封包给client
其余尚未使用。

ciaddr:
客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。即要是 client 端想继续使用之前取得的IP地址,则这个字段会被填充

yiaddr: 从server送回client的DHCP OFFER与DHCPACK封包中,此栏填写分配给client的IP地址。9. siaddr:
表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
10.giaddr:若需跨网域进行DHCP获取,此栏为 relay agent的地址,否则为0

chaddr:
客户端硬件地址。客户端必须设置它的”chaddr”字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。

sname:
Server的名称字符串,由DHCP服务器填写,以0x00结尾。

file:
启动文件名,是一个空结尾的字符串。DHCP Discover报文中是”generic”名字或空字符,DHCP Offer报文中提供有效的目录路径全名

options:
允许厂商定议选项(Vendor-Specific Area),以提供更多的设定信息。
格式为CODE(占1字节)+LEN(占1字节)+VALUE(长度由LEN而定)
1) 1、4、Subnet Mask
2) 3、n*4、Router(网关)
3) 6、n*4、DNS Server
4) 7、n*4、Log Server
5) 26、2、Interface MTU
6) 33、n*8、Static route
7) 35、4、ARP cache timeout
8) 42、n*4、NTP servers
9) 51、4、IP address lease time
10) 53、1、Message type
10.1) 1: DHCPDISCOVER
10.2) 2: DHCPOFFER
10.3) 3: DHCPREQUEST
10.4) 4: DHCPDECLINE
10.5) 5: DHCPACK
10.6) 6: DHCPNAK
10.7) 7: DHCPRELEASE
10.8) 8: DHCPINFORM
11) 5、4、DHCP Server Identifier
12) 60、n、华为自定义: 可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。ME60收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。
13) 82、n、华为自定义:ME60作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址

0x3: DHCP报文类型
DHCP共有八种报文,不同报文之间的区别除了DHCP数据包本身之外,在封包上(UDP头,IP头、链路层头)也有一些差别

1.DHCP Discover
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式(链路层MAC目的地址FF:FF:FF:FF:FF:FF、网络层IP地址255.255.255.255)发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
2.DHCP Offer
DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户(可以广播、也可以单播),告知用户本服务器可以为其提供IP地址。(注意,只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复)

DHCP Request
客户端会在两种情况下发送DHCP Request
1)DHCP客户端可能会收到来自DHCP服务器的很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。注意,”Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器”这里存在一个安全问题,如果我们的伪DHCP服务器能比原始DHCP服务器先发送Offer数据包,就能达到欺骗的目的,从而劫持目标用户的流量
2)获取DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。

4.DHCP ACK
DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录(即之前的预分配过程中登记的那个MAC),如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。

DHCP NAK
如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。

DHCP Release
当用户不再需要使用分配IP地址时,就会”主动”向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约(在数据库中清除某个MAC对某个IP的租约记录,这样,这个IP就可以分配给下一个请求租约的MAC)

7.DHCP Decline
DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用,我们在手工设置静态IP、或者DHCP分配中有时会遇到”检测到IP冲突”的提示就是因为客户端利用ARP机制来在当前内网中确认当前指定的IP是否已经被占用
8.DHCP Inform
DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端

linux搭建dhcp服务:
1.修改DHCP服务器网卡配置:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:0C:29:83:BB:21
ONBOOT=yes
IPADDR=192.168.159.128
NETMASK=255.255.255.0
BROADCAST=192.168.159.255
GATEWAY=192.168.159.2

安装DHCP服务
yum -y install dhcp*

配置DHCP服务(*
cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
vim /etc/dhcpd.conf

4.重启网络服务
service dhcpd start
Service network start