gpt4 book ai didi

Python 3.8 TLSv1.3 套接字关闭导致 ConnectionResetError 或 ConnectionAbortedError

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:08 26 4
gpt4 key购买 nike

客户端:

data = b'\xff' * 1000000
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
#context is created by ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
ssock = context.wrap_socket(ssock, server_hostname='xd1337sv')
ssock.connect((SERVERADDR, SERVERPORT))
ssock.sendall(data)
#time.sleep(3)
ssock.close()

如果我只使用常规的非 SSL 套接字,则一切正常,服务器接收到准确数量的数据。如果我使用 TLS 套接字,则行为取决于版本。

如果我在 Python 3.6 上运行服务器或客户端,因此将使用 TLSv1.2,没有问题。只有在使用 TLSv1.3 时才会出现问题,这取决于 data 的大小以及执行客户端 ssocket.close() 行的时间。

如果我根据数据的大小在 ssocket.close() 之前放置适量的 time.sleep,那么我就不会出错。否则,服务器将得到 ConnectionResetError [WinError 10054] An existing connection was forculously closed by the remote host 并且只接收部分数据,或者抛出 ConnectionAbortedError [WinError 10053] An established connection was被主机中的软件中止并且没有收到任何数据。

我在本地地址 192.168.1.2 的本地机器上测试服务器和客户端。

最佳答案

差异是由 TLS 1.3 在 TLS 握手后发送 session 票证引起的,而对于以前的 TLS 版本, session 票证是在 TLS 握手中发送的。因此,对于 TLS 1.3,来自服务器的数据( session 票证)将在 ssock.connect(...) 完成后到达。由于您的应用程序在 connect 之后未读取任何数据,因此它关闭了套接字,而未读数据仍在底层 TCP 套接字的套接字缓冲区中。这将导致 RST 发送到服务器并导致连接重置错误。

这是应用程序从不尝试从服务器读取的已知问题。如果应用程序期望来自服务器的响应并使用 recv 获取它,这也将隐式读取 session 票证。

要在您不希望服务器返回任何应用程序数据时解决这种情况,请在关闭套接字之前对套接字进行适当的 SSL 关闭。由于这将读取服务器 SSL 关闭消息,因此它还将隐式读取服务器之前发送的 session 票证。

try:
ssock = ssock.unwrap()
except:
True
ssock.close()

有关更多信息,另请参阅 this issuethis documentation .

关于Python 3.8 TLSv1.3 套接字关闭导致 ConnectionResetError 或 ConnectionAbortedError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com