为什么TCP在接收端缓冲数据

use*_*194 10 networking tcp

在大多数TCP PUSH功能的描述中,提到PUSH功能不仅要求发送方立即发送数据(不等待其缓冲区填充),还要求将数据推送到接收方的接收应用程序.一边,没有缓冲.

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

谁能帮助解决我的疑问?

Bri*_*ite 7

TCP 必须缓冲接收的数据,因为它不知道应用程序何时将实际读取数据并且它已告知发送方它愿意接收(可用的"窗口").所有这些数据都存储在"接收窗口"中,直到应用程序读出它为止.

一旦应用程序读取数据,它就会从接收窗口中删除数据,并增加使用下一个ACK向发送方报告的大小.如果此窗口不存在,那么发送方将不得不推迟发送,直到接收方告诉它继续进行,直到应用程序发出读取才能执行.这将为每次读取呼叫增加一个完整的往返延迟值,如果不是更多的话.

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

通常不使用 PSH位.是的,实现发送它但它通常不会改变接收端的行为.