TCP segment of a reassembled PDU

TCP segment of a reassembled PDU

TCP segment of a reassembled PDU 其实主机响应一个查询或者命令时,如果要回应很多数据(信息),而这些数据超出了TCP的最大MSS时,主机通过发送多个数据包来传送这些数据(注意:这些包并未被分片)。

 

【背景知识】

MTU  最大传输单元

MSS

【分析过程】

    先说说MTU(最大传输单元),这个MTU实际上和链路层协议有着密切的关系。EthnernetII帧的结构:DMAC+SMAC+Type+Data+CRC。由于以太网传输电气方面的限制,每个以太网帧都有最小64bytes和最大1518bytes。对于小于或者大于这个限制的以太网帧我们都视为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。(注:小于64bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518bytes的数据帧我们一般称为Giant帧,这种一般是线路干扰或者坏的以太网接口产生)

    由于以太网EthernetII最大的数据帧是1518bytes,刨去以太网帧的帧头(DMAC(6bytes)+SMAC(6bytes)+Type(2bytes))14bytes和帧尾CRC校验部分4bytes(这个有时候大家把它叫做FCS),那么剩余承载上层协议的地方就是DATA域,最大就只有1500Bytes,这个值我们就把它称为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。

     当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同),通过这段水管最大水量就要由中间最细的水管决定。

     对于网络层的上层协议而言(以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片的最大坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以网络层更高一层(就是传输层)的实现中往往会对此加以注意。有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一 个标签:DF(DonotFragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备 就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于 1500。

对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。

对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。

MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS 就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时 候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方 提供的MSS值得最小值确定为这次连接的最大MSS值。

我们回过头来看前言里面的那个问题,我们试想一下,如 果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小 1492这样就不会造成无法通讯的问题.所以上面的问题可以通过iptcp adjust-mss 1452来解决。

当然问题也可以通过修改PC机的MTU来解决。

 

 

 

TCP segment of a reassembled PDU  

2011-06-19 15:36:43|  分类: 网络协议 |  标签:tcp  ip  mss  ip分片   |举报 |字号 订阅

 

 

 

 

 

上周在公司里遇到一个问题,用wireshark抓系统给网管上报的数据发现里面有好多报文被标识为“TCP segment of a reassembled PDU”,并且每一段报文都是180Byte,当时看到这样的标识,觉得是IP报文分片,以为系统的接口MTU值为设置小了,通过命令查询发现是 1500,没有被重设过,当时有点想不通。

    回来查了一下,发现自己的理解是错的,“TCP segment of a reassembled PDU”指的不是IP层的分片,IP分片在wireshark里用“Fragmented IP protocol”来标识。详细查了一下,发现“TCP segment of a reassembled PDU”指TCP层收到上层大块报文后分解成段后发出去。于是有个疑问,TCP层完全可以把大段报文丢给IP层,让IP层完成分段,为什么要在TCP层分呢? 其实这个是由TCP的MSS(Maximum Segment Size,最大报文段长度)决定的,TCP在发起连接的第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是 TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。

    至于收到一个报文后如何确定它是一个"TCP segment"?如果有几个报文的ACK序号都一样,并且这些报文的Sequence Number都不一样,并且后一个Sequence Number为前一个Sequence Number加上前一个报文大小再加上1的话,肯定是TCP segment了,对于没有ACK标志时,则无法判断。

    既然收到的TCP报文都是180Byte的segment,那么应该是协商的时候PC端告知了MSS为180Byte,至于为什么这样,只能等抓包后确认是MSS的问题再排查了。另外,有一种情况也可能导致这个问题:被测系统因为MTU为220Byte而设置MSS为180Byte,但是这种情况现在可以排除,因为前面讲过,已经查询过MTU值为1500。

今天利用windows查找功能对网络上的一个共享文件夹里的内容进行查找,发现查找网络文件时流量巨大。好奇用wireshark抓包发现 wireshark Info栏里有很多“TCP segment of a reassembled PDU”提示信息。不解百度了一下发现大家都在询问这个问题网上并没有很好的解答。想到“TCP segment of a reassembled PDU”只是wireshark的提示信息,那么在sniffer pro里会给出什么样的提示呢,用sniffer打开同样的trace 发现里面提示“Continuation of missing frame”和"Continuation of frame xx"现在大概知道“TCP segment of a reassembled PDU”是什么意思,其实主机响应一个查询或者命令时如果要回应很多数据(信息)而这些数据超出了TCP的最大MSS时,主机会通过发送多个数据包来传送这些数据(注意:这些包并未被分片)。对wireshark来说这些对相应同一个查询命令的数据包被标记了“TCP segment of a reassembled PDU”

问题,wireshark如何识别多个数据包是对同一个查询数据包的响应? wireshark是根据sequence number来识别,这些数据包ACK number是相同的,当然number的数值与查询数据包中的next sequence number也是一样的。

CIFS/SMB协议对待文件查询效率多么的低下!对待一个文件名的查询要用两个帧长1514字节和一个1294字节的帧长来响应。

 

关于TCP/UDP与IP最大报文长度的区别请见此文 

http://blog.163.com/hlz_2599/blog/static/142378474201341601129121/

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rossini23/archive/2010/03/28/5424850.aspx

 

posted on 2014-09-24 19:30  小西红柿  阅读(9395)  评论(0编辑  收藏  举报

导航