在一个IP数据包中发送多个TCP数据包

13

是否可以通过单个IP数据包发送多个TCP或UDP数据包?协议中有任何规定禁止这样做吗?

如果该协议允许但通常不由TCP / UDP实现执行,您能否指出证明该点的Linux源代码中的相关部分。

是否有一些操作系统上的TCP / UDP实现可以在单个IP数据包上发送多个数据包(如果允许)。

6个回答

9

这是不可能的

TCP段头没有描述它的长度。TCP负载的长度是从IP数据包长度减去IP和TCP头的长度得出的。因此每个IP数据包只有一个TCP段。

然而,通过IP分片,一个TCP段可以在多个IP数据包中进行分段。


1
那就是我得到这个想法的地方! - Rohit Banga
想确认这是否在协议中指定。 - Rohit Banga
1
在TCP中,它们被称为"分段"而不是"数据包"。 - caf
@caf改变了,但是50/50的可能性更容易理解 - Will
UDP有长度字段在它的头部,对吧?如果允许接收者似乎没有问题找出单个数据包,不是吗? - Dhanaraj Durairaj
“一个TCP段可以在多个IP数据包上进行分段” - 这是不可取的,因为如果其中一个数据包丢失,整个段都需要重新传输,这正确吗? - Siddhartha

3
Tcp不会发送数据包,它是一个连续的数据流。你发送消息。
而UDP基于数据包,每次只会发送一个数据包。

这个协议本身不允许这样做。它不会崩溃,只是不会发生。

使用隧道技术的建议是有效的,但警告也同样重要。


1
但最终,通过从字节流中提取数据发送TCP段。 - Rohit Banga
你的答案是基于实现还是协议不允许呢?如果我们有一个发送多个 TCP 段的实现放在一个 IP 包中,会出现什么问题呢? - Rohit Banga

3
TCP是一个公共规范,为什么不直接阅读它呢? RFC4164 是路线图文件,RFC793 是TCP本身,而RFC1122 则包含一些勘误,并展示了它如何与(IPv4)宇宙的其余部分相结合。
但简单来说,因为TCP头部(RFC793第3.1节)没有长度字段,TCP数据从头部填充的末尾延伸到IP数据包的末尾。 数据包中没有其他地方可以放置另一个数据段。

2
您可能想尝试在TCP上隧道化TCP,尽管这通常被认为是一个不好的主意(bad idea)。根据您的需求,效果可能会有所不同。

2
你可以看一下SCTP(流控制传输协议),它允许在单个TCP连接上进行多个数据流。修改 - 我不知道TCP没有自己的头字段,所以没有办法在没有编写包含此信息的自定义TCP等效项的情况下执行此操作。SCTP仍然可能有用,因此我将保留该链接。

1

你不能将多个TCP数据包打包成一个IP数据包 - 这是规范的限制,如上所述。 TCP是最接近面向应用程序的API。或者你想编写发送原始IP消息的程序?告诉我们,你想解决什么问题。考虑如何组织从一个应用程序到另一个应用程序的消息传递,或者提到你想要钩入TCP/IP堆栈。我可以建议你:

  1. 考虑将任何你喜欢的东西打包成UDP数据包。我不确定在远程端启动“未打包”的TCP包的路由有多容易。
  2. 考虑使用PPTP或类似的隧道协议。

1
这个问题的出现是因为我注意到TCP头中没有TCP段字段的长度。所以我想确认一下。非常感谢! - Rohit Banga
UDP有长度字段在它的头部,对吧?如果允许接收者好像没有问题找出各个数据包,是吗? - Dhanaraj Durairaj
@RohitBanga:在这方面,TCP标头确实没有一个带有数据大小的“长度”字段。它依靠底层传输协议(据我所知)总是有它。因此,没有必要添加另一个多余的值。 - dma_k
1
@DhanarajDurairaj:是的,UDP有长度,请查看wikipedia。然而,TCP和UDP提供不同的服务:它们不能混合使用。它们是IP顶层的两个分支:TCP用于数据的顺序流传输,UDP用于短消息交换,其中顺序并不是很重要。 - dma_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接