我知道TCP窗口的大小可以扩展到64KB以上,但是查看以太网数据包数据报,例如这样的数据报:



它看起来像第2层数据包被限制在比它小得多的尺寸上。如果单个TCP请求需要在接收方处组装多个网络请求,则ACKing如何在TCP层起作用?

评论

我认为您将窗口与MSS(最大段大小)混淆了。

我是@RonMaupin(实际上我不知道有什么区别)

#1 楼

TCP窗口大小通常与最大段大小无关,后者取决于最大传输单位,而最大传输单位又取决于最大帧大小。

从低开始。

最大帧大小是网络(网段)可以传输的最大帧。对于以太网,按照定义,这是1518字节。

帧封装了IP数据包,因此最大的数据包-最大传输单位MTU-是最大的帧大小减去帧开销。对于以太网,这是1518-18 = 1500字节。

IP数据包封装了一个TCP段,因此,最大段大小MSS为MTU减去IP开销减去TCP开销(MSS不包括TCP标头)。对于不带选项的基于IPv4的以太网和TCP,这是1500-20(IPv4开销)-20(TCP开销))= 1460字节。

现在,TCP是一种传输协议,将其自身呈现为流应用程序的套接字。这意味着应用程序可以跨该套接字传输任意大小的数据。为此,TCP将数据流拆分为所述段(0到MSS字节长{1}字节),通过IP传输每个段,并将它们放回目的地。

TCP段由确认保证交货的目的地。想象一下,源节点将仅发送单个段,等待确认,然后发送下一个段。无论实际带宽如何,此TCP连接的吞吐量都将受到往返时间(RTT,即数据包从源到目的地再返回的时间)的限制。

因此,如果您在两个节点之间建立1 Gbit / s的连接,且RTT为10 ms,则可以有效地每10 ms或146 kB / s发送1460个字节。那不是很令人满意。

因此,TCP使用发送窗口-可以同时“运行中”的多个段被发送出去并等待确认。它也称为滑动窗口,它在每次确认窗口开头的分段时都会前进,从而触发窗口前进到的下一个分段的发送。这样,段大小无关紧要。使用传统上为64 KiB的窗口,我们可以在运行中获得该数量,因此,每10 ms = 6.5 MB / s传输64 KiB。更好,但对于千兆位连接仍然不是很满意。
但是为什么不是所有数据都一次发送,为什么我们需要这个发送窗口?如果您尽可能快地(在本地)发送所有内容,并且(很可能)在到目标路径的某处有较慢的链接,则需要对大量数据进行排队。没有交换机或路由器能够缓冲超过几MB(如果有的话)的缓冲区,因此多余的流量将需要被丢弃。如果未确认,则需要重新发送,多余的再次丢弃。这将是非常低效的,并且将严重阻塞网络。 TCP通过其拥塞控制来解决此问题,并使用有效算法根据有效带宽和当前往返时间调整窗口大小。

{1}空段可用于防止连接超时,方法是使用保持活动选项。 Thx重复数据删除器

评论


好吧,如果tcp-packets仅用于tcp-keepalive,则根本没有有效负载。

–重复数据删除器
18-10-22在1:37



@Deduplicator绝对-TCP比这里描述的要复杂得多。

– Zac67
18-10-22在5:12

很好的解释。一个相关的情况是,即使数据速率相对较慢,RTT也非常大,例如行星际互联网所要求的。瑟夫先生就此发表了很好的讲话。行星际发送窗口事先是阿西莫夫先生短篇小说“物理学家我的儿子”的核心元素(在1962年的性别定型观念中也很重要)。

– jonathanjo
18-10-22在9:49

好答案。希望您继续以实际的方式来解释tcp的事情。或者您在解释它们的链接

–终结者
18-10-22在15:24

@Terminator这里已经有很好的TCP问题答案,只需检查类别或搜索关键字即可。

– Zac67
18-10-22在18:14