2017-10-11 80 views
-1

this articleGo Web Server,那里是Listen SocketClient SocketGoListenSocket ClientSocket的围棋

我不明白为什么GoLang需要两个插槽Listen Socket, Client Socket但不只是一个插座,任何人都可以解释其概念或放弃一个隐喻?

编辑:更新我的答案。

+2

这只是试图说明如何处理TCP连接,它根本就不是特定的。服务器必须接受客户端连接,否则它不会执行任何操作。 – JimB

回答

-1

也许我误解的图形或图形是不是画得非常好,可能Listen SocketClient Socket是同一个插座,如果插座没有接受来自客户端,它被称为Listen Socket连接,并在其后接受连接,它改名为Client Socket,只有一个插座有不同的舞台和名称。


更新1:

我找到插座工作Here更好的文章和图表。

在文章的grpah中,很明显,当有新的连接时,TCP服务器将 创建一个新的套接字来处理连接,并且Listen Socket继续监听其他连接。

以下是文章中的一段:

由TCP服务器创建的第一个插座,通过NetSock_Open(),通常被指定为listen socket,并调用NetSock_Listen()后,仍然开放无止境,允许服务器响应各种连接请求。而不是使用此套接字与请求客户端交换数据,服务器将为每个请求创建一个新的套接字。


更新2

由于第一次更新正在Micrium公司,我找到另一个似乎更通用的TCP工作instuction Here

TCP连接流程下面的序列显示了TCP

连接的流量:

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

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

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

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

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

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

注:接受()套接字函数结束后通常情况下,服务器将 成两个进程(或线程)。第一个进程处理与客户端的连接 ,第二个进程发出下一个 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. 我已经脱脂RFC about TCP更新1之前,但我没有看到它提到,听使用一个插座上的细节,而当接受它会创建另一个新的套接字。

  4. 也许彻底的方法是研究关于在Go中创建套接字和连接的源代码,但我现在不想做。

+0

不,有2个插座,监听插座和连接的插座。从accept(2)手册页:'“[accept]提取监听套接字的暂挂连接队列中的第一个连接请求,sockfd创建一个新的连接套接字”'。它是一个完全独立的插槽,带有新的FD;但这不是Go的独特之处,它是TCP套接字的工作原理。 – JimB

+0

谢谢,我更新了我的答案。 –

+0

你真的在使用micrium实时操作系统吗?我的意思是TCP的一般概念是相同的,但这些系统调用对于该操作系统是唯一的。 – JimB