当我们不使用keep-alive时,客户端的操作系统发送EOF标志(文件结束),以指示服务器文件已完成传输
不,它不是。通过接收分隔空行(对于没有正文的请求),或者通过读取请求的“Content-Length”标头中指定的确切字节数(对于具有固定长度正文的请求来说),或者读取0字节块(对于分块请求来说)来检测HTTP请求的结尾。
从另一个答案链接而来的RFC 9112非常详细地讨论了消息帧,特别是第6.3节“消息正文长度”。
现在我们使用keep-alive,所以服务器上的EOF不会关闭连接,所以可以通过相同的连接发送第二个文件,并以EOF结束
这是不对的。TCP没有其他“发送EOF标志”的方式,除非通过关闭连接发送方的一端(关闭(SHUT_WR)操作),这是最终的–无法在该方向发送更多数据,通常也会导致另一个方向的关闭。
更一般地说,“EOF”不是一条实际的消息;在编程语言中,它由缺席消息–从read()操作获得0字节的结果后引发EOF。但TCP无法任意发出这种信号,因为它不会向接收方报告消息边界;它实际上无法传递0字节的消息。(事实上,空TCP段通常被用作“keep-alive”机制,因为它们不要使接收器看到0字节的读取。)
(换句话说:您不能通过发送EOF信号来关闭TCP连接,而是通过关闭TCP连接来发送EOF。)
这就是RFC 9112使用术语“关闭”的原因,例如在“请求消息从不关闭-分隔[…]”中,而不是在“EOF-分隔”中。