3

如果客户端有多个文件要通过HTTPPost方法发布到服务器,则会有两个api调用。因为我不想创建两个TCP连接,并且我想重用TCP连接,所以我对第一个请求使用Http keep-alive头,现在我只需要在第一个请求时建立一个TCP连接来发送多个文件

但是服务器如何区分这两个文件呢?当我们不使用keep-alive时,客户端的操作系统发送EOF标志(文件结束),以指示服务器文件已完成传输

以下是我的假设,不确定是否正确:

现在我们使用keep-alive,因此服务器上的EOF不会关闭连接,因此可以通过相同的连接发送第二个文件,并以EOF结束。但是,当客户端不想再发送任何文件时,如何关闭TCP连接?如果客户端发送了另一个EOF,服务器可能会认为他要发送另一个文件?

我唯一能想到的是,假设您只有5个文件要发送,在第5个HTTP请求中,您不发送keep-alive头,但第一、第二、第三和第四个请求都需要使用keep-allive头发送,我的理解正确吗?

3个答案3

重置为默认值
10

当我们不使用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-分隔”中。

1
  • TCP具有财务总监标志以指示EOF。在套接字API中发送任何一个通过关闭套接字或使用关闭()与的通话关闭(_W)参数。
    – 巴尔马
    4月18日14:55
5

这个连接:keep-alive头在HTTP/1.1中是隐式的,即仅在HTTP/10.0中需要。在持久HTTP/1中,一个请求会在另一个请求之后发送,响应会以相同的顺序返回。HTTP/1还明确定义了消息(请求、响应)的结束位置(Content-Length、Transfer-Encoding头),因此正确实现HTTP/1的应用程序可以检测消息边界。

有关具体技术细节,请参见标准

2

如果客户端发送EOF不能通过同一连接发送另一个文件。与文件和终端不同,TCP中的EOF是该连接的永久条件。它通过发送包含财务总监标志,除确认从另一端发送的段外,不能发送其他数据。

当使用keep-alives时,使用不同的方法来指示发送的数据的结束位置。如果在传输之前知道数据的大小内容物-长度报头通常被发送,而接收者只是读取那么多字节。如果数据是动态生成的,传输编码:分块使用。这将数据作为以下序列发送<数据大小><数据字节>块,通过发送大小为0的块来表示结束。分块编码最常用于由脚本生成的服务器动态回复,而不是上传和下载文件,因为文件大小可以在发送之前确定。

3
  • 谢谢你的回答。因此,如果客户端应用程序希望重用单个TCP连接向同一主机发出多个请求,因为无法发送EOF以保持连接打开,那么每个客户端的请求都必须指定发送文件的内容长度,以便服务器重新组装,我的理解正确吗?另外,客户端是否需要定期向服务器发送虚拟数据以保持TCP连接打开,因为服务器可能会因客户端不活动而关闭连接? 4月19日8:53
  • 是的,这就是它的工作原理。持久连接通常仅用于快速发送的请求,如果客户端没有任何新内容要立即发送,则应关闭连接。服务器也会在超时后关闭空闲连接。客户端不应该仅仅为了保持其打开而发送虚拟请求,因为这是在浪费服务器资源。
    – 巴尔马
    4月19日15:30
  • 预期用途是当您加载一个HTML页面时,它有很多图像、脚本和CSS文件——您可以使用多个持久连接来高效地获取所有这些文件。但一旦你完成了,你就关闭了连接。
    – 巴尔马
    4月19日15:33

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.