ListenSocket ClientSocket Go

时间:2017-10-11 12:55:10

标签: go

在关于Go Web Server this article 中,Listen Socket中有Client SocketGo

我无法理解为什么GoLang需要两个套接字Listen Socket, Client Socket而不仅仅是一个套接字,任何人都可以解释它的概念或给出一个比喻吗?

编辑:我更新了我的答案。

1 个答案:

答案 0 :(得分:-1)

也许我误解了图表或图表没有很好地绘制,可能Listen SocketClient Socket是相同的套接字,如果套接字没有接受来自客户端,它被称为Listen Socket,在接受连接后,它被重命名为Client Socket,只有一个具有不同阶段和名称的套接字。

更新1:

我找到了一篇关于Socket Working Here 的更好的文章和图表。

在文章的内容中,当有新的连接时,它很清楚,TCP Server会 创建一个新的套接字来处理连接,Listen Socket继续监听其他连接。

这是文章中的一个段落:

  

TCP服务器通过NetSock_Open()创建的第一个套接字通常被指定为listen socket,并且在调用NetSock_Listen()之后,无限期地保持打开状态,以允许服务器响应各种连接请求。服务器不是使用此套接字与请求客户端交换数据,而是为每个请求创建一个新套接字。

更新2

由于第一次更新正在使用Micrium,我发现另一个似乎更常见的TCP工作原理 Here

  

TCP连接流以下序列显示了TCP

的流程      

连接:

     
      
  1. 服务器创建等待远程客户端连接的侦听器套接字。

  2.   
  3. 客户端发出connect()套接字函数以启动TCP握手(SYN,SYN / ACK,ACK)。服务器发出accept()套接字   函数接受连接请求。

  4.   
  5. 客户端和服务器发出read()和write()套接字函数以通过套接字交换数据。

  6.         

    注意:有几种SSL API可用于发送和接收除read()和write()套接字函数之外的数据。

         
        
    1. 服务器或客户端决定关闭套接字。这会导致TCP闭包序列(FIN和ACK)发生。

    2.   
    3. 服务器要么关闭侦听器套接字,要么从步骤2开始重复,以接受来自远程客户端的另一个连接。

    4.         

      注意:通常在accept()套接字函数结束后,服务器会分开    进入两个进程(或线程)。第一个进程处理    与客户端的连接和第二个进程发出下一个    accept()套接字函数。图1显示了TCP的示例    连接:

           


注意:

  1. 我发现另一个 Socker Programming Tutorial 提及TCP中的工作细节。

  2. .NET Framework MSDN 中,有关Socket.Accept Method()的说明Accept synchronously extracts the first pending connection request from the connection request queue of the listening socket, and then creates and returns a new Socket.

  3. 我在Update 1之前浏览了 RFC about TCP ,但我没有看到它提到Listen使用一个套接字的详细信息,以及何时接受它' ll创建另一个新的Socket。

  4. 也许彻底的方法是在Go中研究有关创建套接字和连接的源代码,但我现在没有考虑这样做。