【问题标题】:How SSL server handle multiple connections?SSL 服务器如何处理多个连接?
【发布时间】:2017-07-31 15:46:10
【问题描述】:

SSL protocols的法律等级有4种消息:

  • 握手协议
  • ChangeCipherSpec 协议
  • 警报协议
  • 应用数据协议

握手完成并交换对称私钥后,客户端会向服务器发送Application Data消息。

同一台服务器如何处理多个客户端,并且每个客户端都有自己的对称密钥。

服务器是否保持与所有客户端的连接打开?如果不是,服务器如何知道传入连接使用什么对称密钥? 应用程序数据协议是否提供某种会话 ID,服务器可以使用它来映射到正确的键?

【问题讨论】:

  • 您正在搜索 TLS SessionTicket。
  • @Robert 不,票是 ClientHello 的一部分。客户端还发送包含实际内容(加密)的应用程序数据消息,服务器如何知道使用什么密钥来解密它?
  • 它有一个 TLS 会话缓存,通常是基于文件的。
  • @Robert 你能链接我吗,因为你所说的通常是指用于恢复会话的会话密钥,它是 Hello 消息的一部分,它也需要大量的服务器空间和因此它使用 Session Tickets 进行了优化,其中会话数据存储在客户端。那么您是指作为 Server/Client Hello 的一部分的会话 id 还是应用程序数据的一部分
  • 有两种可能性:如果它使用 TLS SessionTicket,所有内容都包含在票证中(参见例如 RFC 5077 第 10 页),如果服务器使用会话 ID,则使用服务器端的会话缓存.

标签: ssl


【解决方案1】:

服务器是否保持与所有客户端的连接打开?

可以,具体取决于服务器的实现方式。

服务器如何知道传入连接使用什么对称密钥?

假设您有一个多人游戏。您的服务器代码通常如下所示:

sock = socket.listen(port)
clients = []
if sock.new_client_waiting:
    new_client = sock.accept()
    clients.append(new_client)

for client in clients:
    if client.new_data_waiting:
        data = client.read()
        # handle incoming actions...

因此,如果有两个客户端,服务器将只知道这两个客户端,并为这两个客户端提供一个 socket 对象。这就是您的答案:操作系统(其 TCP 堆栈)处理连接的概念,并通过为您提供一个套接字,您可以从该套接字读取/写入该套接字,并且您知道它来自哪些客户端(无论如何在一定程度上可以确定) )。

许多服务器的工作方式不同,例如Web 服务器代码更像这样:

sock = socket.listen(port)
while True: # infinitely loop...
    client = sock.accept() # This call will block until a client is available
    spawn_new_http_handler(client)

每当有新人连接时,工作线程都会从那里获取并管理事物。但是,它仍然可以读取和写入它的套接字。

应用程序数据协议是否提供某种会话 ID,服务器可以使用它来映射到正确的键?

我不知道这些规格,但我很确定答案是。会话恢复是在握手阶段较早完成的,是为客户返回的。例如。如果我在 30 分钟前连接到 https://example.com 并现在返回,它可能有我的会话,我们不需要再次进行整个握手。这与区分客户没有任何关系。

【讨论】:

  • 我完全理解它的工作方式,因为与客户端的所有通信都是通过一个套接字完成的,但据我所知,http/1.1 是关于打开连接、发出请求和关闭连接(不确定 keep-alive 标头是如何发挥作用的……),因此对于每个客户端请求,都会创建新的套接字。当我用 Wireshark 检查一个随机网站时,我只看到了一次握手,并且它带有许多应用程序数据消息,即使如此我还是刷新了页面。我相信为每个应用程序数据消息创建了新的套接字。
  • @Ilya_Gazman 然后它正在使用会话恢复。如果您确定它只使用了 Application Data 消息,则必须在 Application Data 消息中实现会话恢复。
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2011-10-02
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多