socket.connect()在内部做什么?

时间:2016-09-17 01:25:22

标签: python sockets tcp udp

所以我试图了解一般的网络,尤其是套接字。我正在使用Python套接字库来玩游戏。

我在互联网上遇到了很多通过简单的ECHO服务器演示TCP和UDP套接字的例子。

对于TCP对应方,资源表明TCP echo客户端使用

  

socket_object.connect()连接到服务器并通过它交换数据。   同样,TCP echo服务器使用   listen()和accept()来处理与客户端的连接和交互。

问题

  1. 现在这些资源提到它是一个TCP连接,因此 面向连接(我从概念上理解)。请帮忙 我理解说面向连接意味着什么 实施明智吗?如何connect(),listen()和 accept()API有助于实现这个目标吗?
  2. 同样,对于UDP对应物,resources表示 UDP echo客户端不使用任何connect(),也不使用UDP echo服务器使用任何listen()或accept()。这有助于实现 无连接行为。请帮我理解具体怎么样?要么 可能是答案,上面的问题1将帮助我理解这一点 同样。

  3. 此外,在我们的情况下,如果是UDP echo客户端,为什么它不需要 绑定到套接字。甚至能够将数据发送到远程 服务器,它仍然不需要实际发送的套接字端点 数据并在服务器发回数据时接收数据?或者基本上,我想,了解bind()内部的确实会帮助我理解这一点。

2 个答案:

答案 0 :(得分:1)

  

请帮助我理解明确说出面向连接的实现意味着什么?

这意味着TCP协议依赖于开放连接来工作。换句话说,必须是一个开放式连接,通过套接字发送的消息包通过该连接。

  

connect(),listen()和accept()API如何帮助实现这一目标?

我从未使用过这个Python套接字库,但我认为我对套接字的相关基础知识足以解释这一点。 connect方法用于打开我在上一个答案中提到的这个连接。服务器使用另外两种方法来接收通过此打开连接从客户端发送的消息。

  

同样,对于UDP对应物,资源表明UDP echo客户端不使用任何connect(),UDP echo服务器也不使用任何listen()或accept()。这有助于实现无连接行为。请帮我理解一下究竟是什么?

您可能知道UDP协议与TCP协议不同,它不依赖于开放连接。这意味着消息包以原子方式发送" (彼此独立),这将使以前的方法无用。如您在问题中链接的文档中所述:

由于没有连接本身,服务器不需要监听和接受连接。它只需要使用bind()将其套接字与端口关联,然后等待单个消息。

这意味着使用UDP进行套接字通信的服务器所必须做的就是注册它所期望的套接字消息的端口,这些端口将从客户端发送并通过recvfrom方法接收。客户端也使用此方法从服务器接收消息。

  

即使能够将数据发送到远程服务器,它仍然不需要套接字端点来实际发送数据并在服务器发回数据时也接收数据吗?

API可能不公开一个方法来执行该客户端,因为客户端动态选择端口并阻止其他程序成为该端口中的服务器,或者至少应该这样做。

答案 1 :(得分:0)

也许我错了,但是据我了解,connect()只是检查IP和端口是否正确,并且另一侧的应用程序已准备就绪。 listen()和bind()向OS发送有关端口的信息-“如果某个软件包将进入xxx端口,请发送给我”。 accept()将信息发送到第一个应用程序,表明一切正常,我们可以互相交谈。 这种方法(而非接受)只是通知OS接受或拒绝来自另一个应用程序的程序包。接受通知其他应用,一切正常,我们可以开始说话还是不说话