10

在 TCP PUSH 功能的大部分描述中,都提到了 PUSH 功能不仅要求发送方立即发送数据(无需等待其缓冲区填满),还要求将数据推送到接收方上的接收应用程序侧,没有被缓冲。

我不明白的是,为什么 TCP 会在接收端缓冲数据?毕竟,TCP 数据段在 IP 数据报中传播,这些数据报被完整地处理(即,在对承载任何给定数据段的 IP 数据报的片段进行任何必要的重组之后,IP 层仅将整个数据段传递给 TCP 层)。那么,为什么接收 TCP 层要等待将这些数据传递给它的应用程序呢?一种情况可能是应用程序在该时间点没有读取数据。但是,如果是这种情况,那么强制将数据推送到应用程序无论如何都是不可能的。因此,我的问题是,为什么 PUSH 功能需要规定有关接收方行为的任何内容?假设应用程序在段到达时正在读取数据,那么无论如何该段都应该直接交付给应用程序。

任何人都可以帮助解决我的疑问吗?

4

2 回答 2

7

TCP必须缓冲接收到的数据,因为它不知道应用程序何时真正读取数据,并且它已经告诉发送者它愿意接收(可用的“窗口”)。所有这些数据都存储在“接收窗口”中,直到它被应用程序读出。

一旦应用程序读取了数据,它就会从接收窗口中删除数据,并增加它使用下一个 ACK​​ 报告给发送者的大小。如果这个窗口不存在,那么发送者将不得不推迟发送,直到接收者告诉它继续,直到应用程序发出读取它才能这样做。这会给每个读取调用增加一个完整的往返延迟延迟,如果不是更多的话。

大多数现代实现还利用此缓冲区来保持接收到的无序数据包,以便发送方可以仅重新传输丢失的数据包,而不是之后的所有数据包。

PSH 位通常不用于操作。是的,实现会发送它,但它通常不会改变接收端的行为。

于 2012-11-04T20:55:52.943 回答
3

请注意,尽管其他注释是正确的(在大多数实现中,PSH 位根本不会影响应用程序行为),但 TCP 仍然使用它来确定 ACK 行为。具体来说,当设置了 PSH 位时,接收 TCP 将立即 ACK,而不是使用延迟的 ACK。小细节;)

于 2012-11-06T16:45:53.457 回答