路由器分片拆分大网络包
网络是怎么链接的
3.37 路由器通过分片功能拆分大网络包
路由器的端口并不只有以太网一种,也可以支持其他局域网或专线通用技术,不同的线路和局域网类型各自传输的最大包长度也不同。
因此输出端口的最大包长度可能会小于输入端口。即便两个端口的最大包长度相同,但也可能出现因为添加了一些头部而导致包的实际长度发生变化。
无论哪种情况,一旦转发包的长度超过了发送端口包的最大长度,就无法直接发送这个包了。
遇到这种情况,可以使用IP协议中定义的分片功能对包进行拆分,缩短每个包的长度。
需要注意,这里和TCP对数据拆分的机制是不同的。TCP拆分数据是在将数据装到包之前进行的,它把已经拆分好的数据块再装到包里,而分片则是对一个已经拆分好的完整的数据包,因为其长度,而再次拆分。
从上图可知,首先,我们需要知道输出端口的MTU(Maximum Transmission Unit,最大传输单元,用这个最大长度减去头部的长度),
看转发的这个包是否在长度范围之内,如果在则直接发送,如果不在则分片处理。
但在此之前还需要查看IP头部中的标志字段Flag,确认是否可以分片,该字段有3个比特,其中2个比特有效,分别代表是否允许分片,以及当前包是否为分片包。
有两种情况不能分片,一为发送方应用程序设置了不允许分片,二是该包已经是分片包。
如果存在不能分片,那么就只能丢弃这个包,并通过ICMP(Internet Control Message Protocol,网络控制报文协议,IP协议中的子协议,简单的说就是报告错误)消息通知发送方。
需要注意的是,包的构成是头部加数据,所以对于IP包来说,它的构成就是IP包 + 数据(TCP头部加用户数据),所以在分片的时候,TCP头部也是数据的一部分。
从上图可知,数据被分片后,每一份数据前面会加上IP头部,其大部分内容都和原本的IP头部一摸一样,但其中有部分字段需要更新,这些字段用于记录分片相关的信息。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步