在大多数TCP PUSH功能的描述中,提到PUSH功能不仅要求发送方立即发送数据(不等待其缓冲区填充),还要求将数据推送到接收应用程序在接收器方面,没有被缓冲。
我不明白为什么TCP会在接收端缓冲数据?毕竟,TCP段在IP数据报中传播,IP数据报全部处理(即,在对任何给定段进行任何必要的IP数据报片段重组之后,IP层仅将整个段传送到TCP层)。那么,为什么接收TCP层会等待将这些数据传递给它的应用程序呢?一个案例可能是应用程序在那个时间点没有读取数据。但是,如果是这种情况,那么无论如何强行将数据推送到应用程序是不可能的。因此,我的问题是,为什么PUSH功能需要指示接收器端行为的任何内容?鉴于某个应用程序在段到达时正在读取数据,该段应该直接传送到应用程序。
有人可以帮我解决疑问吗?
答案 0 :(得分:7)
TCP 必须缓冲接收的数据,因为它不知道应用程序何时将实际读取数据并且它已告知发送方它愿意接收(可用的“窗口”) 。所有这些数据都存储在“接收窗口”中,直到应用程序读出它为止。
一旦应用程序读取数据,它就会从接收窗口中删除数据,并增加使用下一个ACK向发送方报告的大小。如果此窗口不存在,那么发送方将不得不推迟发送,直到接收方告诉它继续进行,直到应用程序发出读取才能执行。这将为每次读取调用增加一个完整的往返延迟值,如果不是更多的话。
大多数现代实现还利用此缓冲区来保持接收到的无序数据包,以便发送方只能重新传输丢失的数据包,而不是其后的所有内容。
PSH位通常不被使用作用。是的,实现发送它但它通常不会改变接收端的行为。
答案 1 :(得分:3)
请注意,尽管其他注释是正确的(PSH位在大多数实现中根本不会影响应用程序行为),但TCP仍然使用它来确定ACK行为。具体地,当PSH位置位时,接收TCP将立即发出ACK而不是使用延迟的ACK。细节;)