networking - IP分片和重组

标签 networking tcp network-protocols fragmentation defragmentation

我目前正在浏览我的网络幻灯片,想知道是否有人可以帮助我了解分段和重组的概念。

enter image description here

我理解它是如何工作的,即数据报是如何被分割成更小的 block 的,因为网络链路有一个 MTU。然而,图片中的例子让我感到困惑。

所以前两节显示长度为 1500,因为这是 MSU,但这不应该意味着最后一个应该有 1000(总共 4000 字节)而不是 1040?这些额外的 40 个字节从何而来?我的猜测是因为前两个片段都有 20 字节的 header ,这额外的 40 字节数据需要去某个地方,所以它会到达最后一个片段?

Fragflag 本质上意味着还有另一个片段,所以除了最后一个片段为零之外,所有片段的 Fragflag 都为 1。但是我不明白什么是偏移量或它是如何计算的。为什么第一个偏移量为零?为什么我们将数据字段 (1480) 中的字节除以 8 以获得第二个偏移量?这个8是哪里来的?除此之外,我假设每个片段偏移量只会增加这个值?

例如,第一个片段的偏移量为 0,第二个 185,第三个 370,第四个 555? (370+185)

感谢您的帮助!

最佳答案

每个数据包中有一个 20 字节的 header 。所以原始数据包包含 3,980 字节的数据。这些片段包含 1480、1480 和 1020 字节的数据。 1480 + 1480 + 1020 = 3980

header 中的每一位都是宝贵的。将偏移量除以 8 使其适合 13 位而不是 16 位。这意味着除了最后一个数据包之外的每个数据包都必须包含一些数据字节,这些数据字节是 8 的倍数,这不是问题。

关于networking - IP分片和重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15999739/

相关文章:

iphone - 验证网络请求是否由 iOS 应用程序发送

Spring集成TCP,强制重连

http - 如何在 Golang 中间件中读取两次请求体?

web-applications - 是否可以从保留的 IP block 接收 Web 客户端请求?

sql-server - SQL Server 2005 - 同时启用命名管道和 TCP/IP 协议(protocol)?

c# - 如何通过网络发送原始数据?

Java:jvm 全局超时是否通过代理工作?

android - 使用 ping 列出本地网络上的设备

ios - 应用程序在 IPv6 网络上进行审核。请确保您的应用程序支持 IPv6 网络,因为需要 IPv6 兼容性

tcp - HAProxy 关闭长期存在的 TCP 连接,忽略 TCP keepalive