欢迎关注:1,欢迎关注本博客,你可点击右手边的【QQ邮件订阅】订阅本博客!2,本博客推出江湖救急计划,主要为工作中遇到疑难杂症的兄弟提供远程技术支持和分析,如有需要,请在江湖救急计划页面给我留言!

工作机会

作者:易隐者 发布于:2012-9-7 17:15 Friday 分类:其 他

       帮业内朋友招聘系统集成工程师两名。

要求:熟悉网络、服务器、监控等相关知识;

工作地点:合肥;

有意向者可跟我联系。

顺带附上我设计的海报:

点击查看原图

阅读全文>>

标签: 海报 工作机会

评论(0) 引用(0) 浏览(4083)

TCP MSS与PMTUD

作者:易隐者 发布于:2012-9-6 19:16 Thursday 分类:网络分析

 

       一旦DF位置一,将不允许中间设备对该报文进行分片,那么在遇到IP报文长度超过中间设备转发接口的MTU值时,该IP报文将会被中间设备丢弃。在丢弃之后,中间设备会向发送方发送ICMP差错报文。
为了简单直观的展示这个交互的过程,我做了下面这个图示: 

点击查看原图


       我找了一个实际环境下捕获的ICMP需要分片但DF位置一的差错报文,下图为其解码格式: 

点击查看原图


       我们可以看到其差错类型为3,代码为4,并且告知了下一跳的MTU值为1478。在ICMP差错报文里封装导致此差错的原始IP报文的报头(包含IP报头和四层报头)。

       一旦出现这种因DF位置一而引起丢包,如果客户端无法正常处理的话,将会导致业务应用出现异常,外在表现为页面无法打开、页面打开不全、某些大文件无法传输等等,这将严重影响业务的正常运行。
那么客户端如何处理这种状况呢?
TCP主要通过两种方式来应对:
1, 协商MSS,在交互之前避免分片的产生
2, 路径MTU发现(PMTUD)

TCP MSS

       TCP在三次握手建立连接过程中,会在SYN报文中使用MSS(Maximum Segment Size)选项功能,协商交互双方能够接收的最大段长MSS值。
       MSS是传输层TCP协议范畴内的概念,顾名思义,其标识TCP能够承载的最大的应用数据段长度,因此,MSS=MTU-20字节TCP报头-20字节IP报头,那么在以太网环境下,MSS值一般就是1500-20-20=1460字节。
客户端与服务器端分别根据自己发包接口的MTU值计算出相应MSS值,并通过SYN报文告知对方,我们还是通过一个实际环境中捕获的数据报文来看一下MSS协商的过程:

点击查看原图

       这是整个报文交互过程的截图,我们再来看一下客户端的报文详细解码: 

点击查看原图

       上图为客户端的SYN报文,在其TCP选项字段,我们可以看到其通告的MSS值为1460;我们在看看服务器端的SYN/ACK报文解码: 

点击查看原图


       上图为服务器端给客户端回应的SYN/ACK报文,查看其TCP选项字段,我们可以发现其通告的MSS值为1440。

       交互双方会以双方通告的MSS值中取最小值作为发送报文的最大段长。在此TCP连接后续的交互过程中,我们可以清楚的看到服务器端向客户端发送的报文中,TCP的最大段长度都是1440字节,如下图解码所示:

点击查看原图

       通过在TCP连接之初,协商MSS值巧妙的解决了避免端系统分片的问题,但是在复杂的实际网络环境下,影响到IP报文分片的并不仅仅是发送方和接收方,还有路由器、防火墙等中间系统,假设在下图的网络环境下: 

点击查看原图

       中间路径上的MTU问题,端系统并不知道,因此需要一个告知的机制,这个机制就是路径MTU发现(PMTUD: Path MTU Discovery )!

PMTUD

       说起PMTUD,我们必须在此回到上面讲到的ICMP需要分片但DF位置一差错报文,还记得那个ICMP差错报文中有一个字段是告知下一跳的MTU值的吗?PMTUD正是利用ICMP需要分片但DF位置一差错报文的这一特性来实现的。
       发送方在接收到该差错报文后,会根据该报文给出的下一跳的MTU值计算适合传输的最大段长度,从而在后续的发送报文过程中,避免在中间路径被分片的情况产生。
       这在端系统主要是通过在路由表里临时添加目的主机路由并将ICMP差错报文告知的下一跳MTU值跟该主机路由关联起来来实现。
       PMTUD的确是个非常不错的机制,但是在复杂的实际网络环境中,有时候会失效,因为为了安全起见,有些网络管理员会在路由器、防火墙等中间设备上设置过滤ICMP报文的安全策略,这将导致ICMP差错报文被这些中间设备丢弃,无法达到发送方,从而引起PMTUD的失效,网上有个宫一鸣前辈共享的案例——《错误的网络访问控制策略导致PMTUD 实现故障一例》,该案例正是说明这种情况绝好的例子,大家可以自行百度此文档学习参考。

       值得一提的是PMTUD仅TCP支持,UDP并不支持PMTUD。

       由于PMTUD可能存在ICMP差错报文被过滤的情况,很多中间设备的接口支持adjust tcp mss设置功能,思科路由器一般是在接口模式下使用命令“ip tcp adjust-mss 1400 ”来做设置,其他的品牌产品的相关设置大家可在实际工作环境下自查相关品牌和产品的使用手册。

        这个功能主要是通过由中间设备修改经过其转发的TCP SYN报文中的MSS值,让中间设备参与进TCP 三次握手时SYN报文的MSS协商来避免分片。

       需要注意的是,该功能不像MTU值,只针对出接口,此功能一旦开启,其将针对该接口的收发双向有效。
我做一个简化环境下的工作过程图示以便于大家理解其工作过程:

点击查看原图

阅读全文>>

标签: TCP icmp差错 分片 SYN TCP选项 UDP MTU ICMP PMTUD MSS

评论(4) 引用(0) 浏览(27884)

【转】负载均衡故障诊断:一个MSS值引发的疑案

作者:易隐者 发布于:2012-9-5 22:39 Wednesday 分类:案例讨论

【我的点评】:

1,此案例为服务器端系统异常MSS通告导致的业务应用故障,的确属于疑难故障范畴;

2,关于MSS的知识点,大家可参考本博客《TCP MSS与PMTUD》一文;

3,此案例充分证明,在遇到疑难故障时,站在原始报文交互的角度做深入的解码分析才是分析定位的根本之道;

4,此案例中,使用了正常时与异常时的对比分析法,关于对比分析法,大家可参考本博客《疑难网络故障的分析方法和原理之对比分析法》一文;

5,个人认为,此案例还可以做进一步的分析,如原作者开篇所言“很多东西都在互相影响”,既然经过负载均衡设备访问就出现这种问题,那么是否是负载均衡在发给服务器端的SYN报文跟客户端直接发给服务器端的SYN报文某些地方存在差异导致的呢?

【原文链接】:

http://virtualadc.blog.51cto.com/3027116/692407

【原文全文】:

负载均衡设备位于客户端和真实服务器之间,一旦访问发生问题,在客户经过简单诊断后,负载均衡设备往往会成为首要被怀疑的对象。客户一般这样质疑:为什么我直接访问服务器没有问题,通过你的设备访问就不行了呢? 质疑的确实有道理,但大多数事情往往不是非一即二这样简单,有很多东西都在互相影响,这就使得真相迷雾重重。

某一天接到某客户报障,说是通过负载均衡设备访问某一业务的时候,页面无法打开或者等半天后只打开了部分页面,而客户端如果直接访问服务器,则可以顺利打开页面。

事情很明显,这中间肯定是有问题存在。登录负载均衡设备检查配置和log,并取一些内部诊断信息,没发现什么错误,只剩下唯一的办法:去客户现场抓包分析。

于是开始抓包,同时抓回了出现问题的服务的数据包和其他没有出现问题的服务的数据包。

经过分析,果然有所不同,下面是有问题的抓包内容(抓包1):


10.52.127.108为客户端地址

10.0.1.112VIP

10.0.1.99为真实服务器地址

由于是以旁路方式部署,需要转换源IP, 10.0.1.123为经过负载均衡设备转换的客户端地址(snat地址)

负载均衡的VIP配置为HTTP模式,这表示负载均衡设备是以proxy的方式来处理连接,也就是对每个连接,客户端先跟负载均衡设备完成一个三次握手,然后负载均衡设备再跟真实服务器完成一个三次握手。

访问流程:

1) 10.52.127.108访问10.0.1.112

2) 负载均衡设备与客户端完成三次握手

3)然后负载均衡设备把源IP: 10.52.127.108转换成10.0.1.123向服务器10.0.1.99发起连接

4)服务器10.0.1.99与负载均衡设备完成三次握手。

下图是访问没有问题的服务的抓包内容(抓包2):


10.0.76.2为客户端地址

10.0.1.113VIP

10.0.1.104为真实服务器地址

由于是以旁路方式部署,同样需要把客户端源IP转换为 10.0.1.123

访问流程跟抓包1相同。

仔细比较两个抓包内容,终于发现了差异出现在MSS值的协商上。

首先我们描述一下Client访问Server过程中MSS值的协行过程:

1) 客户端在向服务器发出SYN包的时候,会带上客户端设备可以接受的最大MSS值,意思是服务器发送到客户端的每个包的内容大小都不能大于这个值。

2) 服务器向客户端回复SYN,ACK包的时候,会比较客户端发来的MSS值和自己设定的MSS值,取两者的最小值作为自己可以接受的最大MSS值返回给客户端,意思是告诉客户端发送到服务器的每个包的内容大小都不能大于这个值。

3) 在实际的传输中,双方往往会取二者中的最小值作为双方互相发送的包大小的最大值。

基于以上通信流程我们来分析一下以上的两个抓包内容:

抓包1

客户端发出SYN包,标明自己可接受的最大MSS值为1460,负载均衡设备回应自己可接受的MSS值为1400,协商成功后,双方交互的包大小不会大于1400

负载均衡设备向服务器发出自己的可接受MSS值为1380,服务器回应自己可接受的MSS120,协商成功后,负载均衡设备发给服务器的包就不能大于120了。

问题正是出在最后跟服务器协商出的大小为120MSS值上。

我们看到客户端向负载均衡设备发出的第一个请求包大小为905字节,这个包大小不大于1400,所以负载均衡设备接收到了,接着负载均衡设备要把该请求发给选定的服务器10.0.1.99,由于服务器可接收的包不能大于120,所以负载均衡设备只能把客户端发来的请求包分成八个小包发送给服务器,然后一些不可控制的问题就出现了,客户端发出请求包后,需要等待应答,但由于负载均衡设备把一个包分解成8个包后,使得负载均衡设备跟服务器之间的交互时间变长,这个过程中客户端可能会超时重发请求包,而负载均衡设备跟服务器之间那八个小包的处理还可能出现丢包,重传,重装等问题。最关键是客户端在该连接的所有请求发完后如果是发送一个RST包来关闭连接,那么即使该连接上还有内容没传输完,该条连接也会关闭,由于一个请求包分成太多的小包传输,一旦发生客户端发出RST包的这种情况,基本上都会导致数据不能传输完毕,以上种种原因导致了页面不能打开或者不能完全打开的现象。

我们再分析抓包2

客户端发出SYN包,标明自己可接受的最大MSS值为1460,负载均衡设备回应自己可接受的MSS值为1400,协商成功后,双方交互的包大小不会大于1400。这一点跟抓包1相同。

负载均衡设备向服务器发出自己的可接受最大MSS值为1380,服务器回应自己可接受的MSS1380,协商成功后,所以双方会以1380MSS值互相通信。

无论是客户端跟负载均衡设备还是负载均衡设备跟服务器之间,都是一个请求一个应答就能完成交互,不会发生要把包分割的现象,所以不会出现抓包1所出现的问题。

网络通信中由于MTU的设置不当引发的问题屡见不鲜,比如在存在ADSL设备的情况下,如果把设备的MTU设置成1500, 往往客户端的访问会出现问题,这是因为ADSLPPPoE协议在MTU中占去8个字节,也就是ADSLMTU最大值最多为1492, 如果客户端跟服务器设的很大,传输的数据包恰好大于1492字节,将导致数据包不能通过。  在程序设计中,程序所取MSS值往往是本机的MTU-40TCPIP头各占20个字节,MTU一般设成1500), 所以基本上所有设备所能接受的最大MSS值不可能会大于1500-40=1460, 那么再考虑到网络中可能会存在PPPoEVPN等设备会占用更多MTU字节,所以各家网络设备厂商提供的网络设备会进一步减小MSS值的设置,一般网络设备设定的MSS值大小为1400左右。

显然1400字节左右的MSS值是网络通信中的正常值,所以服务器返回一个120字节的MSS值这是一个不正常的现象,所以问题的根源在于服务器返回的MSS值不合适,那么这个值是谁返回的呢? 是服务器,也就是说该返回哪个值主动权在于服务器,所以我们诊断问题原因出在服务器上。

接下来的处理需要去检查服务器为什么返回这个值,跟负载均衡设备无关了。但仍然有追踪的价值,因为服务器并不是一直返回120这个值,而是有些时候会协商成1380,这时候访问是正常的,有些时候是返回120,这时候就自然访问不正常。

客户的服务器装的是HP操作系统,应用软件是Oracleebs,在我们把问题定位到了服务器后,客户也找了HP的工程师来检查和分析,但无法找出原因。

个人分析问题原因可能出现在如下几个方面:

1) HP操作系统或者网卡驱动程序关于MTU的定义存在可变值,或者

2) Oracle ebs的底层通信程序在MSS值的协商时,会根据一些条件改变MSS

以上仅仅是猜测,因为没有以上两个厂家的资深工程师的深度参与,无法最终定位结果,所以该问题成为了一个疑案。

阅读全文>>

标签: 疑难故障 负载均衡 tcpdump MTU MSS 抓包 A10

评论(0) 引用(0) 浏览(9874)

IP分片(IP Fragment)

作者:易隐者 发布于:2012-9-3 22:22 Monday 分类:网络分析

为什么要分片

       不同的链路类型能够支持的最大传输单元值(MTU: Maxitum Transmission Unit)主要是由相关RFC文档规定的,常见的以太网链路的MTU值为1500,如果需要转发的IP报文超出其转发接口的MTU值,则在转发该报文之前,需要将其分片,分为多个适合于该链路类型传输的报文,这些分片报文在到达接收方的时候,由接收方完成重组。

       各种常见链路类型的MTU值如下图所示: 

点击查看原图


报文的分片和重组

       我们先来看一下分片的过程,为了简单起见,我就用《TCPIP详解卷一》第11章《UDP:用户数据报协议》中关于IP分片的案例,应用进程将1473字节应用字段交给UDP处理,UDP加上8字节的UDP报头之后,交给IP层处理,IP层在转发之前,发现该报文长度超出转发接口的MTU,因此需要分片,分为两个IP分组,如下图所示: 

点击查看原图


       从上图可以看出原始的IP报文经过分片后,只有第一个分片报文是带有四层信息的,后续报文均不带四层信息,为做直观展示,我找了一个实际环境下抓取的分片报文,如下图所示: 

点击查看原图

       这是分片的第一个报文,我们可以看到该报文IP层封装的上层协议为ICMP协议,这是一个ping报文(上层协议信息),我们再来看一下后续分片报文的解码:

点击查看原图

       这是分片后续报文,我们能看到封装的是ICMP协议,但是封装的上层协议的具体信息就无法看到了。

       IP数据报被分片之后,所有分片报文的IP报头中的源IP、目的IP、IP标识、上层协议等信息都是一样的(TTL不一定是一样的,因为不同的分片报文可能会经过不同的路由路径达到目的端),不同的地方在于分片标志位和分片偏移量,而接收方正是根据接收到的分片报文的源IP、目的IP、 IP标识、分片标志位、分片偏移量来对接收到的分片报文进行重组

       接收方根据报文的源IP、目的IP、IP标识将接收到的分片报文归为不同原始IP数据报的分片分组;分片标志中的MF位(More Fragment)标识了是否是最后一个分片报文,如果是最后一个分片报文,则根据分片偏移量计算出各个分片报文在原始IP数据报中的位置,重组为分片前的原始IP报文。如果不是最后一个分片报文,则等待最后一个分片报文达到后完成重组。

分片带来的问题

1, 分片带来的性能消耗

       分片和重组会消耗发送方、接收方一定的CPU等资源,如果存在大量的分片报文的话,可能会造成较为严重的资源消耗;
       分片对接收方内存资源的消耗较多,因为接收方要为接收到的每个分片报文分配内存空间,以便于最后一个分片报文到达后完成重组。

2,分片丢包导致的重传问题

       如果某个分片报文在网络传输过程中丢失,那么接收方将无法完成重组,如果应用进程要求重传的话,发送方必须重传所有分片报文而不是仅重传被丢弃的那个分片报文,这种效率低下的重传行为会给端系统和网络资源带来额外的消耗。

3, 分片攻击

       黑客构造的分片报文,但是不向接收方发送最后一个分片报文,导致接收方要为所有的分片报文分配内存空间,可由于最后一个分片报文永远不会达到,接收方的内存得不到及时的释放(接收方会启动一个分片重组的定时器,在一定时间内如果无法完成重组,将向发送方发送ICMP重组超时差错报文,请大家参考本博客《ICMP重组超时》一文),只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方内存,让接收方无内存资源处理正常的业务,从而达到DOS的攻击效果。

4, 安全隐患

       由于分片只有第一个分片报文具有四层信息而其他分片没有,这给路由器、防火墙等中间设备在做访问控制策略匹配的时候带来了麻烦。
       如果路由器、防火墙等中间设备不对分片报文进行安全策略的匹配检测而直接放行IP分片报文,则有可能给接收方带来安全隐患和威胁,因为黑客可以利用这个特性,绕过路由器、防火墙的安全策略检查对接收方实施攻击;
       如果路由器、防火墙等中间设备对这些分片报文进行重组后在匹配其安全策略,那么又会对这些中间设备的资源带来极大的消耗,特别是在遇到分片攻击的时候,这些中间设备会在第一时间内消耗完其所有内存资源,从而导致全网中断的严重后果。

       基于以上原因,很多应用程序都尽量避免分片的产生,其通过将IP报文的分片标志中的DF位(Don’t Fragment)置一来实现,而这可能给应用带来一些难以预料的麻烦。下一篇我将介绍端系统如何处理这种状况,请大家关注。

分片补充

1,分片既有可能发生在端系统(发送主机)上,也可能发生在转发报文的路由器、防火墙等中间系统上
2,分片只发生在转发出接口上

跟分片有关的案例

        后续我会在本博客里添加一些跟分片有关的案例,有兴趣的同学可关注。

阅读全文>>

标签: ip分片 重组超时 IP标识 icmp差错 分片 ip fragment IPID UDP 分片攻击 分片偏移量 DF位 MF位 MTU 重组 fragment ICMP

评论(6) 引用(0) 浏览(88261)

某单位经过CA认证的业务应用访问缓慢故障分析案例

作者:易隐者 发布于:2012-9-3 9:47 Monday 分类:网络分析

【写在之前】:

1,此案例为业务应用系统客户端程序BUG问题导致的故障;

2,此案例可作为业务系统分析评估的应用场景,为业务系统正式上线前测试阶段通过网络分析技术手段发现业务系统稳定性问题的案例;

3,此案例中涉及到的知识点,请大家参考本博的《TCP重传》一文;

【我的案例】:

故障环境
      故障网络结构如下图所示: 

点击查看原图


       该单位的网络划分有办公区域和服务器区域,办公区域的机器经过防火墙的地址转换,访问服务器区域的相关服务器。

业务应用访问的流程

       业务应用是基于B/S架构的,客户端通过IE浏览器对服务器进行访问;进行访问时,在IE浏览器中输入认证服务器的地址,经过CA认证服务器认证成功后,在通过CA认证服务器的代理,访问业务应用服务器。

故障现象

1,客户端在访问应用服务器时,有时页面打开的速度非常的慢,要等好几分钟才能完全打开页面,打开页面后进行站内访问时,速度也很慢;
2,直接将客户端接在服务器区,访问正常;
3,其他的业务应用全部正常;
4,业务系统开发商与网络集成商均否认是自己维护的系统导致故障了出现。

故障分析

1 分析思路

       通过故障现象,我们可以明确这是单一的业务应用故障,问题应该跟该业务的数据交互有关,因此,我们应该将分析的重点放在该业务交互的详细过程。
       另外,由于这个故障并不是一直出现,因此,我们需要在故障出现时,捕获其数据报文的详细交互过程,从而发现故障原因所在。

2 分析过程

1, 在测试主机上开启网络分析工具,并在故障现象出现时,捕获其交互的数据报文。
2,分析故障时数据报文详细的交互过程,如下图所示: 

点击查看原图

        通过上图交互过程的分析,我们发现,第一个数据报文是客户端向服务器发送的SYN请求报文,第二个报文是服务器对客户端SYN报文的响应,其SYN标志和ACK标志位都置1了,下面5个报文都是第二个报文的重传。在这里我们没有看到正常的TCP三次握手建立连接的过程,客户端并没有响应来自服务器的SYN报文,服务器因此不断地重传SYN报文,正是这个原因导致了客户端与服务器业务交互异常缓慢。
3,由于该报文是在客户端直接捕获的,因此我们可以确定是客户端未响应服务器的SYN报文,而不是中间设备丢弃了客户端对服务器SYN报文的响应报文。那么为什么客户端不响应服务器的SYN报文呢?
4,将上述分析情况与业务系统开发商沟通之后,开发商才确认是自己的业务客户端出现了问题。 

3 分析结论

       通过上面的分析,可以得出该故障是由客户端本身不响应服务器的SYN报文导致的。

故障解决

       通过我们的分析定位,找到故障的源头是客户端,通过与CA认证程序提供厂商沟通后,发现程序中有一段代码编写存在一些问题,当客户端与服务端的IP地址不在同一网段时,有时会出现客户端不响应服务器SYN报文的情况,在业务开发商优化客户端的程序代码后,该故障得到解决。

阅读全文>>

标签: 疑难故障 TCP TCP重传 SYN 重传 SYN重传 CA BUG

评论(5) 引用(0) 浏览(11473)

Powered by 易隐者 基于emlog 皖ICP备12002343号-1