【问题标题】:How to know the status of tcp connect in python?如何知道python中tcp connect的状态?
【发布时间】:2018-01-04 15:43:11
【问题描述】:

在 python 中,即使连接请求在服务器端的队列中,tcp connect 也会返回成功。有什么方法可以在客户端知道是否发生了接受或在服务器的队列中?

【问题讨论】:

  • 不..该线程与我的问题@jwpfox无关
  • 在阻塞模式下,当 connect(2) 返回时,您已经建立了连接。 (accept(2) 是否已经在远端执行没有意义。)
  • 是的。再想一想。
  • @LorinczyZsigmond 只有在服务器端执行 accept 后,才能建立完整的连接并可以进行数据传输。当套接字在队列中时,我们无法将数据从客户端发送到服务器。

标签: python sockets tcp tcpclient


【解决方案1】:

该问题与 Python 无关,而是由底层的套接字机制引起的,该机制尽最大努力向程序隐藏低级别的网络事件。我能想象的最好的方法是尝试更高级别的协议握手(发送一个问候字符串并设置接收答案的超时时间),但这与以下问题没有区别:

  • 连接已在对等方排队,但仍未被接受
  • 连接已被接受,但由于任何其他原因,服务器无法在分配的时间内处理它
  • (仅当超时非常短时)机器(包括发送方)和网络上的拥塞导致延迟大于超时

我的建议很简单,你甚至不想担心如此低级的细节。由于接受连接后服务器端可能会出现问题,因此您将不得不处理可能的更高级别的协议错误、超时或连接丢失。只是说接受连接后的超时和接受连接的超时没有区别。

【讨论】:

    【解决方案2】:

    如果connect 返回并且没有错误,则TCP 3-Way Handshake 已成功进行。

    1. 客户端:connect 发送SYN(和块)
    2. 服务器:(阻止accept)发送SYN,ACK
    3. 客户端:connect 发送ACK

    3 之后,connect 将控制权交还给客户端,accept 还将控制权交还给服务器端的调用者。

    当然,如果服务器满载,不能保证accept的唤醒就意味着请求的实际处理,但是connect已经唤醒并且没有错误返回是一个保证已成功建立 TCP 连接。

    可以发送数据包。

    为了更好的解释,例如:

    然后前往The 3-way TCP handshake 部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多