有没有什么方法可以测试(验证/演示) SSH 传输连接中大于 65,535 字节的数据包是否会被丢弃?
答案1
最简单的方法是重新构建现有的开源客户端或服务器,并对其进行修改以设置更大的尺寸。请参阅https://www.rfc-editor.org/rfc/rfc4254.html了解详情。最大数据包大小为 4,294,967,296(大小为 uint32)。
本页上的另一个答案是错误的 - SSH 通过 TCP/IP 构建自己的数据包 - 较低传输级别切割的大小与您提出的问题无关,该问题涉及 SSH 数据包大小,而不是 TCP 数据包大小。
RFC 4253 的 6.1 节的标题有误 -最低限度数据包长度,而不是最大值。它没有提到最大值,只是说你应该支持大于 35000。请注意,你不允许超过另一方所说的接受值 - 这就是为什么我说你需要从源重新构建“另一端”并专门选择一个更大的尺寸,否则你测试的任何东西都不会被允许发送那么大的尺寸。
实际上 - 既然您说“丢弃” - 您可能需要“破解”您构建的东西,以便它能够发送比它知道的另一方已经表示接受的更大的数据包 - 否则您将无法测试另一方是否正确丢弃任何东西,因为它不会被发送。
答案2
有什么方法可以测试大于 65535 字节的数据包是否被丢弃?
不。
SSH 在 TCP/IP 上运行,因此受到底层协议的限制。
您不能创建大于 65535 字节的数据包,因为这是 Internet 协议 RFC 允许的最大大小。
如果您无法创建这样的数据包,那么您就无法发送一个数据包来测试它是否被丢弃。
互联网标头格式包含一个 16 位的总长度字段(如果所有位都设置为 1,则最大值可以为 65535)。
3.1. 互联网报头格式
互联网标头的内容摘要如下:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
总长度:16位
总长度是数据报的长度,以八位字节为单位,包括互联网标头和数据。此字段允许数据报的长度最大为 65,535 个八位字节。如此长的数据报对于大多数主机和网络来说都不切实际。所有主机都必须准备好接受最大 576 个八位字节的数据报(无论它们是完整到达还是分段到达)。建议主机仅在确信目标已准备好接受更大的数据报时才发送大于 576 个八位字节的数据报。
选择 576 这个数字是为了允许除了所需的报头信息之外,还允许传输合理大小的数据块。例如,这个大小允许一个数据报中容纳 512 个八位字节的数据块加上 64 个报头八位字节。最大的互联网报头是 60 个八位字节,典型的互联网报头是 20 个八位字节,为更高级别协议的报头留出了余地。
进一步阅读
答案3
您可以使用 Golang SFTP 客户端自定义最大数据包大小并尝试上传一定数量的字节。您可以在此处找到更多详细信息https://stackoverflow.com/questions/65726482/pkg-sftp-much-slower-than-linux-scp-why