如果IP层分片了, 那么谁来指这个分片重新组装好?

时间:2021-04-29 17:58:49
我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

那么有几个问题:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
3, 如果有1片丢了怎么办?

另外再附带问一个:
4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

每个问题50分哈, 多谢多谢.
 

78 个解决方案

#1


我也想知道,呵呵。最好能结合NDIS协议说下流程

NDIS那里接收到的是mac帧。然后住上层给谁,然后他怎么整。

#2


1.2. IP只负责发送包,上层来决定包的重组,TCP有校验机制等,当发现包没有收到或者包的数据损坏时,接收端会要求发送端重新发送对应的包..
3. 当发送端收到要求重发请求时,发送端会重新发送1片的IP包

4.TCP会有确认机制,以及滑动窗口等,来提高效率

#3


1以及2,3的答案

 任何IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口的MTU。IP把MTU与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。IP数据报分片后,只有到达目的主机后才进行重装。
IP首部与分片有关的字段: 
 
(1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。
 
(2)标志字段用其中一个bit表示“更多的片”,除最后一片外,其他每个分片都要设置为1。
 
(3)片偏移字段指的是该片偏移原始数据报开始处的位置。
 
(4)数据报被分片后,每个片的总长度要改为该片的长度值。
 
(5)标志字段中有一个bit表示“不分片”,如果该位1,IP将不对数据报进行分片。 
   IP报即使丢失一片数据报也要重传整个数据报。为什么呢?因为IP层没有超时重传的机制,必须由更高层负责超时重传。

关于第四个问题,觉得还是硬件的支持吧,数据在网络中传输的时候失真以及噪声都相对比较小。所以传输效率比较高吧。

#4


这东东是在tcpip.sys里面负责吗?ndis系列协议驱动处理完后就是传到tcpip.sys?

#5


1 2 3.IP协议时网络层的东西
它是管把数据传过去,甚至丢不丢它也是不管的,分片也不是它的事情了,假如是TCP丢了把,TCp会再重新发这个IP包过去
4.TCP的滑动窗口机制让它提高了效率,并不是你发的每一个包它都要确认

#6


关于IP分片的问题, 书上讲得不多, 所以有点迷糊...不大敢下定论, 所以来向各位高手确认一下.

#7


1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐? 
由传输层(在IP协议之上,例如TCP、UDP协议)组装,处理方法没有统一要求,不过一般都有超时机制。

3, 如果有1片丢了怎么办? 
丢弃报文,相当于都没收到。

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢? 
TCP采用的是滑动窗机制,发送端连续发包,接收端在应答时反馈自己第1个缺少的包的编号(如果没有丢失,则反馈下一个要接收的编号),发送端根据收到的应答信息及数据发出的时间决定重发。

#8


本帖最后由 wenxy1 于 2009-12-24 09:35:22 编辑
我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

那么有几个问题:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗? 
Answer: yes

2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
3, 如果有1片丢了怎么办?
Answer: 会有定时器,但超时后,就会把前接收到的2片丢弃,超时重发是TCP的事,要是UDP,那就不管了。


另外再附带问一个:
4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
Answer: TCP算法里有 Nagle算法,慢启动,快速重传与快速恢复算法等等。像TFP是成块数据流,会把 Nagle算法打开,数据捎带ACK。

#9


IP分片,重组应该是路由器做的事情。每经过一道路由,又重新分片,重组,与上层tcp无关。不知是不是这样。

#10


引用 9 楼 fee_chong 的回复:
IP分片,重组应该是路由器做的事情。每经过一道路由,又重新分片,重组,与上层tcp无关。不知是不是这样。

IP分片,即可能在发送主机上分片,也可能在Internet上的路由器上发生,但是,重组分片一定是接收主机的IP层。

#11


study

#12


1,接收端IP协议层检查到报文被分片了,那么该接收端IP协议负责组装好;
2,是的;
3,超时就整个包都丢掉。

4,不一定收到确认包之后才能发第2个包。比如如果窗口大小为2,那么在收到对方确认包之前也可以发第2个包,对方可以一个ACK包确认收到的2个包

#13


学习了

#14


围观来着

#15


IP不支持分片,上层TCP可以,低层PPP也可以.

#16


学习

#17


引用 15 楼 my_love 的回复:
IP不支持分片,上层TCP可以,低层PPP也可以.


IP不支持分片?
那路由器里面分片是属于啥的

#18


学习了

#19


引用 7 楼 cnzdgs 的回复:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
由传输层(在IP协议之上,例如TCP、UDP协议)组装,处理方法没有统一要求,不过一般都有超时机制。

3, 如果有1片丢了怎么办?
丢弃报文,相当于都没收到。

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
TCP采用的是滑动窗机制,发送端连续发包,接收端在应答时反馈自己第1个缺少的包的编号(如果没有丢失,则反馈下一个要接收的编号),发送端根据收到的应答信息及数据发出的时间决定重发。

前两点记错了,更正一下,分片组装是由网络层(IP协议)处理的,在目标主机上进行,有超时机制。

#20


围观来看

#21


Mark!

#22


mark!

#23


瞧了一下,,不是很懂

#24


路过的

#25


引用 17 楼 vincent_1011 的回复:
引用 15 楼 my_love 的回复:
IP不支持分片,上层TCP可以,低层PPP也可以.


IP不支持分片?
那路由器里面分片是属于啥的

我的理解是:
其实不是IP不分片,分片是IP层来做的,但是一个已经成型的IP包是不会再分的
至于路由的分片,是因为路由对于网络层来说是一端了

#26


就这样的

#27


ip分片,对方ip层来组合
路由分片,其实可以把这时的路由器当做主机的ip层,OSI没有规定路由器就非得属于哪一层,这只是ipv4.
ipv6中路由根本不分片!

#28


貌似很复杂啊!~

#29


学习了

#30


学习一下

#31



我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

 那么有几个问题:
 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
   对。
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
 3, 如果有1片丢了怎么办?
 ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

 另外再附带问一个:
 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

 每个问题50分哈, 多谢多谢.

#32


我是LZ, 统一一下各位的看法:

1, 由谁来将这个分片重新组装好? 接收端的IP协议吗? 
-----由接收端IP协议组装.
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐? 
-----启用定时器.
3, 如果有1片丢了怎么办? 
-----丢弃, 等待发送端超时重传.

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
-----使用滑动窗口

但我又有一个问题, 前面cnzdgs提到滑动窗口选择重传机制会用到"包的编号", TCP首部没有编号这么个东西啊, 是不是"序号"字段?

#33


这里用“编号”不太准确,应该说是序列号和确认号。

#34


  学习,学习。

#35


引用 32 楼 femalelover 的回复:
我是LZ, 统一一下各位的看法:

 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 -----由接收端IP协议组装.
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 -----启用定时器. 但只是一个针对分片重组的定时器。
 3, 如果有1片丢了怎么办?
 -----丢弃, 等待发送端超时重传. 这个超时重传靠的是ip的上层如tcp或应用程序提供的,而不是ip本身。

 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
 -----使用滑动窗口

 但我又有一个问题, 前面cnzdgs提到滑动窗口选择重传机制会用到"包的编号", TCP首部没有编号这么个东西啊, 是不是"序号"字段?

#36


建议楼主用 wireshark 捕捉网络数据包分析。这样学习起来事半功倍。

#37


这些东西还是不要这么讨论了,会误导各位朋友。需要了解TCP/IP的协议以及通信机制,请参考TCP/IP协议卷1、2、3,其实搜索几篇文章也就了解各大概了。这么讨论,按照自己的理解进行讨论,只会弄得云里雾里。数据网络通信协议还是挺复杂的,如果感兴趣,可以访问这么几个网站。此外,自己安装个wireshark捕获下自己上网的数据包也有助于理解数据通信协议的学习理解。

www.cnpaf.net
www.netexpert.cn

#38


引用 37 楼 teleinfor 的回复:
这些东西还是不要这么讨论了,会误导各位朋友。需要了解TCP/IP的协议以及通信机制,请参考TCP/IP协议卷1、2、3,其实搜索几篇文章也就了解各大概了。这么讨论,按照自己的理解进行讨论,只会弄得云里雾里。数据网络通信协议还是挺复杂的,如果感兴趣,可以访问这么几个网站。此外,自己安装个wireshark捕获下自己上网的数据包也有助于理解数据通信协议的学习理解。

www.cnpaf.net
www.netexpert.cn


支持

#39


引用 31 楼 wangmu7206 的回复:
我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

  那么有几个问题:
  1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 对。
  2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
  3, 如果有1片丢了怎么办?
 ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

  另外再附带问一个:
  4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

  每个问题50分哈, 多谢多谢.


还是不太懂,
问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

#40


圣蛋快乐,不懂技术来混分的

#41


学习中……

#42


引用 39 楼 vincent_1011 的回复:
引用 31 楼 wangmu7206 的回复:
 我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

   那么有几个问题:
   1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
  对。
   2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
  没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
   3, 如果有1片丢了怎么办?
  ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

   另外再附带问一个:
   4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

   每个问题50分哈, 多谢多谢.



 还是不太懂,
 问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。

#43


引用 42 楼 wangmu7206 的回复:
引用 39 楼 vincent_1011 的回复:
 引用 31 楼 wangmu7206 的回复:
  我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

    那么有几个问题:
    1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
   对。
    2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
   没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
    3, 如果有1片丢了怎么办?
   ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

    另外再附带问一个:
    4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

    每个问题50分哈, 多谢多谢.


  还是不太懂,
  问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

 是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。


这里的重发应该不是TCP负责的,TCP负责的重传应该是校验数据的错误的时候发出的。

丢片的重传应该是IP层发送一个ICMP来要求重传的,继续探讨!!

#44


唉 感觉各位都挺强的,网络协议我看了不少 里面的东西太复杂了 感觉单看协议不好学,还是抓抓包去看来的更实际,TCP/IP第1卷协议讲的很清楚的 可以参考着看

#45


引用 43 楼 vincent_1011 的回复:
引用 42 楼 wangmu7206 的回复:
 引用 39 楼 vincent_1011 的回复:
  引用 31 楼 wangmu7206 的回复:
   我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

     那么有几个问题:
     1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
    对。
     2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
    没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
     3, 如果有1片丢了怎么办?
    ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

     另外再附带问一个:
     4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

     每个问题50分哈, 多谢多谢.


   还是不太懂,
   问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

  是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。


 这里的重发应该不是TCP负责的,TCP负责的重传应该是校验数据的错误的时候发出的。

 丢片的重传应该是IP层发送一个ICMP来要求重传的,继续探讨!!

要命,你是从哪里听到这种观点的?!

#46


别信哥,哥只是个传说。

#47


我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

那么有几个问题:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
YES
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
YES
3, 如果有1片丢了怎么办?
分片丢失,重传

另外再附带问一个:
4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
这个在网络的世界里面,是以毫秒为单位的,所以有人觉得这样一来会加重协议堆栈的负担,
二来速度不快,就用UDP自己设计了一套重传机制,例如酷狗,PPS(另外一个原因是可以越过NAT)

#48


没看懂,有时间再研究一下

#49



我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

 那么有几个问题:
 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 YES
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 YES
 3, 如果有1片丢了怎么办?
 分片丢失,重传 (由上层协议负责重传,并且是整个数据报,不只是一个分片。)

 另外再附带问一个:
 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
 这个在网络的世界里面,是以毫秒为单位的,所以有人觉得这样一来会加重协议堆栈的负担,
 二来速度不快,就用UDP自己设计了一套重传机制,例如酷狗,PPS(另外一个原因是可以越过NAT)



#50


补充:这里负责重传的上层是指TCP或者使用了UDP的自行实现超时重传的应用层。

#1


我也想知道,呵呵。最好能结合NDIS协议说下流程

NDIS那里接收到的是mac帧。然后住上层给谁,然后他怎么整。

#2


1.2. IP只负责发送包,上层来决定包的重组,TCP有校验机制等,当发现包没有收到或者包的数据损坏时,接收端会要求发送端重新发送对应的包..
3. 当发送端收到要求重发请求时,发送端会重新发送1片的IP包

4.TCP会有确认机制,以及滑动窗口等,来提高效率

#3


1以及2,3的答案

 任何IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口的MTU。IP把MTU与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。IP数据报分片后,只有到达目的主机后才进行重装。
IP首部与分片有关的字段: 
 
(1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。
 
(2)标志字段用其中一个bit表示“更多的片”,除最后一片外,其他每个分片都要设置为1。
 
(3)片偏移字段指的是该片偏移原始数据报开始处的位置。
 
(4)数据报被分片后,每个片的总长度要改为该片的长度值。
 
(5)标志字段中有一个bit表示“不分片”,如果该位1,IP将不对数据报进行分片。 
   IP报即使丢失一片数据报也要重传整个数据报。为什么呢?因为IP层没有超时重传的机制,必须由更高层负责超时重传。

关于第四个问题,觉得还是硬件的支持吧,数据在网络中传输的时候失真以及噪声都相对比较小。所以传输效率比较高吧。

#4


这东东是在tcpip.sys里面负责吗?ndis系列协议驱动处理完后就是传到tcpip.sys?

#5


1 2 3.IP协议时网络层的东西
它是管把数据传过去,甚至丢不丢它也是不管的,分片也不是它的事情了,假如是TCP丢了把,TCp会再重新发这个IP包过去
4.TCP的滑动窗口机制让它提高了效率,并不是你发的每一个包它都要确认

#6


关于IP分片的问题, 书上讲得不多, 所以有点迷糊...不大敢下定论, 所以来向各位高手确认一下.

#7


1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐? 
由传输层(在IP协议之上,例如TCP、UDP协议)组装,处理方法没有统一要求,不过一般都有超时机制。

3, 如果有1片丢了怎么办? 
丢弃报文,相当于都没收到。

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢? 
TCP采用的是滑动窗机制,发送端连续发包,接收端在应答时反馈自己第1个缺少的包的编号(如果没有丢失,则反馈下一个要接收的编号),发送端根据收到的应答信息及数据发出的时间决定重发。

#8


本帖最后由 wenxy1 于 2009-12-24 09:35:22 编辑
我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

那么有几个问题:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗? 
Answer: yes

2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
3, 如果有1片丢了怎么办?
Answer: 会有定时器,但超时后,就会把前接收到的2片丢弃,超时重发是TCP的事,要是UDP,那就不管了。


另外再附带问一个:
4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
Answer: TCP算法里有 Nagle算法,慢启动,快速重传与快速恢复算法等等。像TFP是成块数据流,会把 Nagle算法打开,数据捎带ACK。

#9


IP分片,重组应该是路由器做的事情。每经过一道路由,又重新分片,重组,与上层tcp无关。不知是不是这样。

#10


引用 9 楼 fee_chong 的回复:
IP分片,重组应该是路由器做的事情。每经过一道路由,又重新分片,重组,与上层tcp无关。不知是不是这样。

IP分片,即可能在发送主机上分片,也可能在Internet上的路由器上发生,但是,重组分片一定是接收主机的IP层。

#11


study

#12


1,接收端IP协议层检查到报文被分片了,那么该接收端IP协议负责组装好;
2,是的;
3,超时就整个包都丢掉。

4,不一定收到确认包之后才能发第2个包。比如如果窗口大小为2,那么在收到对方确认包之前也可以发第2个包,对方可以一个ACK包确认收到的2个包

#13


学习了

#14


围观来着

#15


IP不支持分片,上层TCP可以,低层PPP也可以.

#16


学习

#17


引用 15 楼 my_love 的回复:
IP不支持分片,上层TCP可以,低层PPP也可以.


IP不支持分片?
那路由器里面分片是属于啥的

#18


学习了

#19


引用 7 楼 cnzdgs 的回复:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
由传输层(在IP协议之上,例如TCP、UDP协议)组装,处理方法没有统一要求,不过一般都有超时机制。

3, 如果有1片丢了怎么办?
丢弃报文,相当于都没收到。

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
TCP采用的是滑动窗机制,发送端连续发包,接收端在应答时反馈自己第1个缺少的包的编号(如果没有丢失,则反馈下一个要接收的编号),发送端根据收到的应答信息及数据发出的时间决定重发。

前两点记错了,更正一下,分片组装是由网络层(IP协议)处理的,在目标主机上进行,有超时机制。

#20


围观来看

#21


Mark!

#22


mark!

#23


瞧了一下,,不是很懂

#24


路过的

#25


引用 17 楼 vincent_1011 的回复:
引用 15 楼 my_love 的回复:
IP不支持分片,上层TCP可以,低层PPP也可以.


IP不支持分片?
那路由器里面分片是属于啥的

我的理解是:
其实不是IP不分片,分片是IP层来做的,但是一个已经成型的IP包是不会再分的
至于路由的分片,是因为路由对于网络层来说是一端了

#26


就这样的

#27


ip分片,对方ip层来组合
路由分片,其实可以把这时的路由器当做主机的ip层,OSI没有规定路由器就非得属于哪一层,这只是ipv4.
ipv6中路由根本不分片!

#28


貌似很复杂啊!~

#29


学习了

#30


学习一下

#31



我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

 那么有几个问题:
 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
   对。
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
 3, 如果有1片丢了怎么办?
 ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

 另外再附带问一个:
 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

 每个问题50分哈, 多谢多谢.

#32


我是LZ, 统一一下各位的看法:

1, 由谁来将这个分片重新组装好? 接收端的IP协议吗? 
-----由接收端IP协议组装.
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐? 
-----启用定时器.
3, 如果有1片丢了怎么办? 
-----丢弃, 等待发送端超时重传.

4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
-----使用滑动窗口

但我又有一个问题, 前面cnzdgs提到滑动窗口选择重传机制会用到"包的编号", TCP首部没有编号这么个东西啊, 是不是"序号"字段?

#33


这里用“编号”不太准确,应该说是序列号和确认号。

#34


  学习,学习。

#35


引用 32 楼 femalelover 的回复:
我是LZ, 统一一下各位的看法:

 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 -----由接收端IP协议组装.
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 -----启用定时器. 但只是一个针对分片重组的定时器。
 3, 如果有1片丢了怎么办?
 -----丢弃, 等待发送端超时重传. 这个超时重传靠的是ip的上层如tcp或应用程序提供的,而不是ip本身。

 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
 -----使用滑动窗口

 但我又有一个问题, 前面cnzdgs提到滑动窗口选择重传机制会用到"包的编号", TCP首部没有编号这么个东西啊, 是不是"序号"字段?

#36


建议楼主用 wireshark 捕捉网络数据包分析。这样学习起来事半功倍。

#37


这些东西还是不要这么讨论了,会误导各位朋友。需要了解TCP/IP的协议以及通信机制,请参考TCP/IP协议卷1、2、3,其实搜索几篇文章也就了解各大概了。这么讨论,按照自己的理解进行讨论,只会弄得云里雾里。数据网络通信协议还是挺复杂的,如果感兴趣,可以访问这么几个网站。此外,自己安装个wireshark捕获下自己上网的数据包也有助于理解数据通信协议的学习理解。

www.cnpaf.net
www.netexpert.cn

#38


引用 37 楼 teleinfor 的回复:
这些东西还是不要这么讨论了,会误导各位朋友。需要了解TCP/IP的协议以及通信机制,请参考TCP/IP协议卷1、2、3,其实搜索几篇文章也就了解各大概了。这么讨论,按照自己的理解进行讨论,只会弄得云里雾里。数据网络通信协议还是挺复杂的,如果感兴趣,可以访问这么几个网站。此外,自己安装个wireshark捕获下自己上网的数据包也有助于理解数据通信协议的学习理解。

www.cnpaf.net
www.netexpert.cn


支持

#39


引用 31 楼 wangmu7206 的回复:
我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

  那么有几个问题:
  1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 对。
  2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
  3, 如果有1片丢了怎么办?
 ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

  另外再附带问一个:
  4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

  每个问题50分哈, 多谢多谢.


还是不太懂,
问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

#40


圣蛋快乐,不懂技术来混分的

#41


学习中……

#42


引用 39 楼 vincent_1011 的回复:
引用 31 楼 wangmu7206 的回复:
 我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

   那么有几个问题:
   1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
  对。
   2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
  没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
   3, 如果有1片丢了怎么办?
  ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

   另外再附带问一个:
   4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

   每个问题50分哈, 多谢多谢.



 还是不太懂,
 问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。

#43


引用 42 楼 wangmu7206 的回复:
引用 39 楼 vincent_1011 的回复:
 引用 31 楼 wangmu7206 的回复:
  我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

    那么有几个问题:
    1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
   对。
    2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
   没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
    3, 如果有1片丢了怎么办?
   ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

    另外再附带问一个:
    4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

    每个问题50分哈, 多谢多谢.


  还是不太懂,
  问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

 是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。


这里的重发应该不是TCP负责的,TCP负责的重传应该是校验数据的错误的时候发出的。

丢片的重传应该是IP层发送一个ICMP来要求重传的,继续探讨!!

#44


唉 感觉各位都挺强的,网络协议我看了不少 里面的东西太复杂了 感觉单看协议不好学,还是抓抓包去看来的更实际,TCP/IP第1卷协议讲的很清楚的 可以参考着看

#45


引用 43 楼 vincent_1011 的回复:
引用 42 楼 wangmu7206 的回复:
 引用 39 楼 vincent_1011 的回复:
  引用 31 楼 wangmu7206 的回复:
   我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

     那么有几个问题:
     1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
    对。
     2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
    没有定时器,由更高层来负责超市和重传(tcp有超时和重传机制,udp没有,一些udp应用程序自己实现超时和重传机制)
     3, 如果有1片丢了怎么办?
    ip层自己没有超时和重传机制,所以如果有一片丢失了,tcp层或者使用的udp协议但在应用程序中启用了自己的超时和重传机制的时候,tcp层或这样的应用程序将在超时后要求对方重传整个数据报,而不是一个ip分片,因为它们都根本不知道ip分片这回事;如果是使用udp协议的而且应用程序自己也没有实现一个超时和重传机制的,那么也就永远不会再重传了。

     另外再附带问一个:
     4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?

     每个问题50分哈, 多谢多谢.


   还是不太懂,
   问题:如果传来1,3片,的时候IP层就开始重组是吗?可是发现还有第2片,然后就等待,是吗??

  是的,当有一片第一个到来时IP就启动重组定时器。如果在IP重组计时器超时前还没有收齐所有分片,则丢弃本次IP报的所有分片,并且不做任何其它的动作。等到TCP计时器超时后,TCP会要求对方重发。


 这里的重发应该不是TCP负责的,TCP负责的重传应该是校验数据的错误的时候发出的。

 丢片的重传应该是IP层发送一个ICMP来要求重传的,继续探讨!!

要命,你是从哪里听到这种观点的?!

#46


别信哥,哥只是个传说。

#47


我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

那么有几个问题:
1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
YES
2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
YES
3, 如果有1片丢了怎么办?
分片丢失,重传

另外再附带问一个:
4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
这个在网络的世界里面,是以毫秒为单位的,所以有人觉得这样一来会加重协议堆栈的负担,
二来速度不快,就用UDP自己设计了一套重传机制,例如酷狗,PPS(另外一个原因是可以越过NAT)

#48


没看懂,有时间再研究一下

#49



我假设发送端IP报文的DF位置0, 允许分片. 在路径上某个路由器限于MTU, 将该IP报文分成了3片才发送出去.

 那么有几个问题:
 1, 由谁来将这个分片重新组装好? 接收端的IP协议吗?
 YES
 2, 如果是IP协议, 那么IP协议是不是也要像TCP协议一样, 启动一个定时器, 等到3片都到齐?
 YES
 3, 如果有1片丢了怎么办?
 分片丢失,重传 (由上层协议负责重传,并且是整个数据报,不只是一个分片。)

 另外再附带问一个:
 4, 一个TCP连接启动一个定时器, 每发出一个包, 收到对端确认之前不发第二个包, 这样效率应该很低吧? 为什么使用TCP的FTP传文件有时还挺快的呢?
 这个在网络的世界里面,是以毫秒为单位的,所以有人觉得这样一来会加重协议堆栈的负担,
 二来速度不快,就用UDP自己设计了一套重传机制,例如酷狗,PPS(另外一个原因是可以越过NAT)



#50


补充:这里负责重传的上层是指TCP或者使用了UDP的自行实现超时重传的应用层。