SSL服务器如何处理多个连接?

时间:2017-07-31 15:46:11

标签: ssl

关于SSL protocols的法律lvl,有4种类型的消息:

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

完成握手并交换对称私钥后,客户端会将应用程序数据消息发送到服务器。

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

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

1 个答案:

答案 0 :(得分:0)

  

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

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

  

服务器如何知道用于传入连接的对称密钥?

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

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...

因此,如果有两个客户端,服务器将只知道这两个客户端并且两者都有套接字对象。你的答案就在于:操作系统(它的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并立即返回,它可能会有我的会话,我们不需要再次进行整个握手。它与告诉客户分开没有任何关系。