求解释: tcp segment of a reassembled PDU

867 views
Skip to first unread message

Moore

unread,
Dec 14, 2011, 9:13:41 PM12/14/11
to Shanghai Linux User Group
wireshark 抓到一个这样的包,啥意思啊,

TCP 难道也要重组? 做网络和设备的来说说。

Chaos Eternal

unread,
Dec 14, 2011, 9:30:21 PM12/14/11
to sh...@googlegroups.com
tcp不需要重组?

2011/12/15 Moore <lyx...@gmail.com>:

Moore

unread,
Dec 14, 2011, 9:40:17 PM12/14/11
to Shanghai Linux User Group
不懂啊,羞愧+悔恨。

追悔莫及啊。

On Dec 15, 10:30 am, Chaos Eternal <chaoseter...@shlug.org> wrote:
> tcp不需要重组?
>

Moore

unread,
Dec 14, 2011, 9:55:51 PM12/14/11
to Shanghai Linux User Group
A "PDU" is a "Protocol Data Unit." One unit of information being
transferred in accordance with a given protocol (e.g., "login USERNAME
very-long-base64-encoded-authentication-data" then wait for server to
respond) will be disassembled into many packets (smaller pieces) if
it's too large to fit in one packet (or segment in this case).

This is normal and is just TCP/IP working as designed.

-- from superuser.com

F.i. in http, the reply often takes more than one packet. All but the
last packet of the reply are marked like this. It just means that this
packet is part of a larger message.

--from fixunix.com

On Dec 15, 10:40 am, Moore <lyx...@gmail.com> wrote:
> 不懂啊,羞愧+悔恨。
>
> 追悔莫及啊。
>

Moore

unread,
Dec 15, 2011, 4:15:04 AM12/15/11
to Shanghai Linux User Group
wireshark 仅写了一个 HTTP reassemble 的模块,

其中主要的是,如果一个 HTTP 协议报文不完整,就会提示 TCP segment of a reassemble PDU

而怎么算HTTP 报文不完整, 见HTTP/1.1 协议,要有头又有尾才行。

Timothy Chen

unread,
Dec 15, 2011, 4:20:46 AM12/15/11
to sh...@googlegroups.com
Wireshark 程序自带的对上层协议(传输之上) 的分析重组功能,在TCP协议没有重组概念。

这个一般表示你当前看到的这个大包是从TCP#1,#2,#5,#10(我随便写的,Wireshark里面有提示的)组合起来的一个完整的应用程序的请求。

针对HTTP, SMB. FTP这类协议(有很多,我忘记了)都有这种重组的功能。

2011/12/15 Moore <lyx...@gmail.com>:

--
================================
Best Regards,
Tim Chen

Moore

unread,
Dec 15, 2011, 5:13:30 AM12/15/11
to Shanghai Linux User Group
为此,我花了10个小时。

Sunny Sunny

unread,
Dec 15, 2011, 6:49:23 AM12/15/11
to sh...@googlegroups.com
楼上部分正解 ~ 

这个reassemble 和上层协议无关,所以不是某些协议(http 等)独有。

tcp也分片,实质上是分的PDU。PDU指的是tcp的上一层(应用层)协议的包。

ip包分片是由于下一层(链路层)MTU不能传输ip包那么长的帧,导致ip包被分割成几个小ip包。
tcp分片是由于应用层的某个PDU很大,一个tcp装不下,于是就会出现多个tcp包。这些包的特点是ACK字段数值都相等(普通情况下,不同的tcp包不可能有相同的ack,除非是错误),但是SN字段和普通包类似,每个都在增长。然后收到这些包的那端,回复的ack包数量与之相等,而且ack包里的sn都是一样的,数值等于刚才tcp分片里的ack值。
你可以看一下收到的分片tcp的flags,只有最后一个包的push被置1,前面的包都是0,和普通不分片的包比较一下,普通的包也是1。当接收端收到push为1的包时,才会给发送端回复ack包(rfc建议接收端端缓存push未被置1的包,不发给上层,直到收到最后一个置1的包),同时重组数据段内容,形成一个PDU发给上层,至于push标志位是否用某些接口函数传递给应用层,是不一定的(rfc建议)。所以我不太理解tim的说法,在我看来这个功能是虽然与上层、上层PDU有关,但是实质是tcp协议进行监测、分片、重组、完成的。可以看看这个,虽然是英文的:http://freesoft.org/CIE/RFC/1122/88.htm ,还有rfc http://www.faqs.org/rfcs/rfc793.html 。

如果你不想看到wireshark这个提示,可以修改:
edit->preferences->protocols->tcp->Allow subdissector to desegment TCP streams

附:

Timothy Chen

unread,
Dec 15, 2011, 8:29:28 PM12/15/11
to sh...@googlegroups.com
抱歉,一时匆忙,我可能没写明白,Wireshark针对HTTP, SMB. FTP这类协议(有很多,我忘记了)都有这种分析重组的功能。
 
同时也感谢Sunny的指正,的确,跟上层应用没关系,我本意是强调其分析功能。
 
2011/12/15 Sunny Sunny <sunny...@gmail.com>:
338.gif

Moore

unread,
Dec 15, 2011, 8:42:34 PM12/15/11
to Shanghai Linux User Group
Wireshark针对HTTP, SMB. FTP这类协议(有很多,我忘记了)都有这种分析重组的功能。

看到wireshark 的一个开发人员说,只做了HTTP重组,你确定其他的还有?

Wizard

unread,
Dec 15, 2011, 8:46:21 PM12/15/11
to sh...@googlegroups.com
在 2011年12月15日 下午7:49,Sunny Sunny <sunny...@gmail.com> 写道:
> 楼上部分正解 ~
>
> 这个reassemble 和上层协议无关,所以不是某些协议(http 等)独有。
>
> tcp也分片,实质上是分的PDU。PDU指的是tcp的上一层(应用层)协议的包。
>
那就是pdu是tcp上面一层的概念。 udp上面传送的(比如tftp),是不是也叫pdu?
那是不是也会在udp层分割?

> ip包分片是由于下一层(链路层)MTU不能传输ip包那么长的帧,导致ip包被分割成几个小ip包。
那这么说,一个应用层的包在发送的时候可能被两次分割。 一次在tcp/udp层。
另一次在ip层。


> tcp分片是由于应用层的某个PDU很大,一个tcp装不下,于是就会出现多个tcp包。这些包的特点是ACK字段数值都相等(普通情况下,不同的tcp包不可能有相同的ack,除非是错误),但是SN字段和普通包类似,每个都在增长。然后收到这些包的那端,回复的ack包数量与之相等,而且ack包里的sn都是一样的,数值等于刚才tcp分片里的ack值。
> 你可以看一下收到的分片tcp的flags,只有最后一个包的push被置1,前面的包都是0,和普通不分片的包比较一下,普通的包也是1。当接收端收到push为1的包时,才会给发送端回复ack包(rfc建议接收端端缓存push未被置1的包,不发给上层,直到收到最后一个置1的包),同时重组数据段内容,形成一个PDU发给上层,至于push标志位是否用某些接口函数传递给应用层,是不一定的(rfc建议)。所以我不太理解tim的说法,在我看来这个功能是虽然与上层、上层PDU有关,但是实质是tcp协议进行监测、分片、重组、完成的。可以看看这个,虽然是英文的:http://freesoft.org/CIE/RFC/1122/88.htm ,还有rfc http://www.faqs.org/rfcs/rfc793.html
>
> 如果你不想看到wireshark这个提示,可以修改:
> edit->preferences->protocols->tcp->Allow subdissector to desegment TCP
> streams
>
> 附:
> http://www.wireshark.org/lists/wireshark-users/200806/msg00047.html
> http://hi.baidu.com/yuanhuiyong/blog/item/c2e4404d5ffd7d02b2de0500.html
>

--
Wizard

liyaoshi

unread,
Dec 15, 2011, 8:59:01 PM12/15/11
to sh...@googlegroups.com
udp 我记得没有fragment

Wizard

unread,
Dec 15, 2011, 9:18:12 PM12/15/11
to sh...@googlegroups.com
在 2011年12月16日 上午9:59,liyaoshi <liya...@gmail.com> 写道:
> udp 我记得没有fragment
>
哦,那就是整个大包直接给了ip,然后ip来分?

--
Wizard

chengshiding

unread,
Dec 15, 2011, 9:24:10 PM12/15/11
to sh...@googlegroups.com
PDU是ISO参考模型里面的吧,怎么扯到TCP/IP了呢?

Timothy Chen

unread,
Dec 15, 2011, 9:26:35 PM12/15/11
to sh...@googlegroups.com
至少Wireshark对SMBv1 [MS-CIFS]的分析我经常用到~ 你可以尝试抓一个文件共享的包研究看看。复制文件的时候。

2011/12/16 Moore <lyx...@gmail.com>

Moore

unread,
Dec 15, 2011, 9:27:27 PM12/15/11
to Shanghai Linux User Group
如果是 UDP-L2TP 封装 ,也没有 fragment ?

On Dec 16, 9:59 am, liyaoshi <liyao...@gmail.com> wrote:
> udp 我记得没有fragment
>

> 在 2011年12月16日 上午9:46,Wizard <wizarddewh...@gmail.com> 写道:
>
>

Timothy Chen

unread,
Dec 15, 2011, 9:40:53 PM12/15/11
to sh...@googlegroups.com
就我之前所说,TCP没有所谓重组的概念。这个概念只有在IP层(网络层)才有。对应的操作自然就是Fragmentation。
 
Wireshark带的Reassemble,其实我认为是混淆了TCP/IP协议里面的IP层Reassemble。
 
Wireshark user guide
 
7.6. Packet Reassembling
 

Wireshark calls this mechanism reassembling, although a specific protocol specification might use a different term for this (e.g. desegmentation, defragmentation, ...).

 
...
 
作为我们自然人,我们自然能够把几个TCP数据报的内容组合起来使得它更容易理解。但是,在TCP这个协议上,它没有定义TCP如何去重组data。因此,运作在4层的设备无法为TCP包分片重组。
 
而在IP层上(ipv4),我们有在IP Header上定义了Flag,其包含了DF/MF。另外还有Fragment Offset用以定位。因此在IP层上(比如路由器设备),我们就可以通过这些标志/字段来分片重组。
 
Wireshark作为Application,对整个包有一个全局的分析,才可以做到所谓的TCP Reassemable。
 
希望我的解释有所帮助?当然有不足的,欢迎指正。

 
2011/12/16 Wizard <wizard...@gmail.com>

Chaos Eternal

unread,
Dec 15, 2011, 11:56:04 PM12/15/11
to sh...@googlegroups.com
tftp不需要分割,如果包大于mtu, 传送会失败。

2011/12/16 Wizard <wizard...@gmail.com>:

Yiling Cao

unread,
Dec 16, 2011, 5:20:31 AM12/16/11
to sh...@googlegroups.com
tcp 超过mtu size 会被disassemble成mtu尺寸的包, 每个包前160bits 端口, sequence number, checksum和其他东西  然后每个包到接收段再reassemble吧

这样一个包checksum 或ACK 错了, 可以只要重传这个包. 

wireshark印象中可以把一组包个直接拼接起来

以前大学时候写个这个, 印象蛮深的.

2011/12/16 Chaos Eternal <chaose...@shlug.org>

Sunny Sunny

unread,
Dec 16, 2011, 7:08:24 AM12/16/11
to sh...@googlegroups.com
我这个纸上谈兵的还要跟你多学习~ 
不知道是不是我对这部分理解有问题, http://tools.ietf.org/html/rfc1122#page-82 , 我的理解是, TCP包在传输过程中不会发生分片,但是在发送时候会发生. 在接收端, data部分会被tcp重组成pdu.

Sunny Sunny

unread,
Dec 16, 2011, 7:09:08 AM12/16/11
to sh...@googlegroups.com

Sunny Sunny

unread,
Dec 16, 2011, 7:14:02 AM12/16/11
to sh...@googlegroups.com
tcp的flags里有个push

Wizard

unread,
Dec 18, 2011, 9:18:51 AM12/18/11
to sh...@googlegroups.com
恩。。。每个网络的mtu是不一样的。
所以在传输的过程中,ip层不能保证不被分片吧。

--
Wizard

Sunny

unread,
Dec 18, 2011, 9:24:29 AM12/18/11
to sh...@googlegroups.com
�� 2011��12��18�� 15:18, Wizard �:
> ��������ÿ�������mtu�Dz�һ��ġ�
> �����ڴ���Ĺ���У�ip�㲻�ܱ�֤������Ƭ�ɡ�
>
> �� 2011��12��16�� ����8:08��Sunny Sunny <sunny...@gmail.com> ���
>> �����ֽ��̸��Ļ�Ҫ�����ѧϰ~
>> ��֪���Dz����Ҷ��ⲿ�����������, http://tools.ietf.org/html/rfc1122#page-82 , �ҵ������,
>> TCP���ڴ������в��ᷢ���Ƭ,�����ڷ���ʱ��ᷢ��. �ڽ��ն�, data���ֻᱻtcp�����pdu.
>
>
������������ip���ܻ��Ƭ�����ipͷ��д���������Ƭ��

Wizard

unread,
Dec 18, 2011, 9:27:50 AM12/18/11
to sh...@googlegroups.com
在 2011年12月18日 下午10:24,Sunny <BinSu...@gmail.com> 写道:
> 恩,传输过程中ip可能会分片,除非ip头里写明不允许分片。
那要真是这样,这个ip包遇到mtu小的网络 不就被扔了?

--
Wizard

Sunny

unread,
Dec 18, 2011, 9:51:02 AM12/18/11
to sh...@googlegroups.com
�� 2011��12��18�� 15:27, Wizard �:
> �� 2011��12��18�� ����10:24��Sunny <BinSu...@gmail.com> ���
> ��Ҫ�����������ip������mtuС������ ���ͱ����ˣ�
>
>
>
�ԣ��������Ƭ�İ�����ȥ���ͻᶪ����Ȼ�����һ��icmp��ִ��

Timothy Chen

unread,
Dec 21, 2011, 4:38:34 AM12/21/11
to sh...@googlegroups.com
好久没开Gmail啦,回得晚了。
 
首先,我并不认为Push就是TCP对分段重组的实现。
 
就目前的OS来讲,TCP的PUSH的含义其实很就是把buffer 中的 data 直接 push 给 Application。
 
根据滑动窗口协议,OS会为TCP连接分配 buffer临时储存发送或接收的数据。Sunny提供的RFC中写的很明确,
 
When an application issues a series of SEND calls without setting the PUSH flag, the TCP MAY aggregate the data internally without sending it.  Similarly, when a series of segments is received without the PSH bit, a TCP MAY queue the data internally without passing it to the receiving application.

PUSH的用处在于使得这些被Queue着的数据被推出去 (发送)/推上去 (推给上层应用)。而 并不是TCP对上层应用传递下来的数据的分段标识。
 
不足之处,请指正呀。
 
On Fri, Dec 16, 2011 at 8:14 PM, Sunny Sunny <sunny...@gmail.com> wrote:
tcp的flags里有个push
Reply all
Reply to author
Forward
0 new messages