【问题标题】:How Does HTTP Response get sent back to correct Client in TCP?HTTP 响应如何在 TCP 中被发送回正确的客户端?
【发布时间】:2015-03-26 00:19:51
【问题描述】:

我试图了解 HTTP 服务器如何确保将正确的响应发送回正确的客户端。

在非常高的水平上:

  1. 在服务器实现的 TCP 层,一些 ServerSocket(侦听请求所针对的主机:端口)创建一个“客户端套接字”来处理请求

  2. (如果我们假设它是一个线程服务器)- 在应用程序中分配一个线程并且工作完成

问题:-

A.) 响应是否必须通过处理请求的同一个套接字返回?

B.) 如果是,响应如何映射到处理请求的同一个套接字?

C.) 是套接字负责维护响应数据包需要返回到的客户端 IP/主机,还是由 HTTP 标头维护此信息,然后用于将响应返回到正确的客户?

如果 HTTP 标头信息用于将响应路由回调用客户端,那么我假设响应不一定必须由处理相关请求的同一套接字处理

非常感谢任何帮助。 詹姆斯

【问题讨论】:

    标签: sockets http tcp


    【解决方案1】:

    套接字是双向的。

    当 ServerSocket 接收到一个新的连接时,它会创建一个新的 Socket 并将其交给将处理该请求的线程。此套接字已连接并支持双向通信。然后,该线程将通过此套接字将响应发送回,这将导致它被路由回连接的客户端。工作线程不需要明确知道另一端的 IP/主机,因为套接字是双向的。它只需要通过套接字发送响应并在完成后关闭连接。

    【讨论】:

    • 感谢 cmets Erick。那么听起来处理请求的同一个套接字必须处理响应 - 我猜是因为这个套接字是调用客户端的详细信息?在异步模型中,处理请求 (A) 的线程不一定是创建响应 (B) 的线程 - 这是否意味着线程需要共享正在等待响应消息的套接字的详细信息?
    • 是的,接收请求和发送响应必须使用同一个套接字。线程无关紧要。一个线程可以读取请求,将其交给另一个线程进行处理,然后将其交给另一个线程进行响应。重要的是必须从头到尾使用相同的套接字。所有必要的路由信息​​都存储在该套接字中,您只需根据需要读取并写入即可。
    • 雷米,感谢您添加此内容。我仍然不清楚响应如何绑定到套接字背后的机制。在非阻塞模型中,我们可能会调用远程 Web 服务作为服务请求的一部分,此时没有线程在等待此响应。当 Web 服务响应返回并分配一个线程来处理它时,响应如何映射回原始套接字?
    • 无论为响应分配一个线程,还必须管理套接字并将正确的套接字传递给处理程序。这是 Web 服务器有如此多线程计数、超时值等配置参数的原因之一。每个应用程序都需要进行调整以处理工作流程的独特性能需求。
    • 谢谢埃里克。对不起,我不能投票,因为我是新手。一旦我有更多积分,我会回来投票给你:)
    猜你喜欢
    • 2017-05-29
    • 2013-09-14
    • 2011-01-08
    • 2019-05-31
    • 2011-08-15
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多