在关于Go Web Server
的 this article 中,Listen Socket
中有Client Socket
和Go
,
我无法理解为什么GoLang需要两个套接字Listen Socket, Client Socket
而不仅仅是一个套接字,任何人都可以解释它的概念或给出一个比喻吗?
编辑:我更新了我的答案。
答案 0 :(得分:-1)
也许我误解了图表或图表没有很好地绘制,可能Listen Socket
,Client 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
的流程连接:
服务器创建等待远程客户端连接的侦听器套接字。
客户端发出connect()套接字函数以启动TCP握手(SYN,SYN / ACK,ACK)。服务器发出accept()套接字 函数接受连接请求。
- 醇>
客户端和服务器发出read()和write()套接字函数以通过套接字交换数据。
注意:有几种SSL API可用于发送和接收除read()和write()套接字函数之外的数据。
服务器或客户端决定关闭套接字。这会导致TCP闭包序列(FIN和ACK)发生。
- 醇>
服务器要么关闭侦听器套接字,要么从步骤2开始重复,以接受来自远程客户端的另一个连接。
注意:通常在accept()套接字函数结束后,服务器会分开 进入两个进程(或线程)。第一个进程处理 与客户端的连接和第二个进程发出下一个 accept()套接字函数。图1显示了TCP的示例 连接:
![]()
注意:
我发现另一个 Socker Programming Tutorial 提及TCP中的工作细节。
在 .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.
我在Update 1之前浏览了 RFC about TCP ,但我没有看到它提到Listen使用一个套接字的详细信息,以及何时接受它' ll创建另一个新的Socket。
也许彻底的方法是在Go
中研究有关创建套接字和连接的源代码,但我现在没有考虑这样做。