Go ListenSocket客户端套接字转到

Go ListenSocket客户端套接字转到,go,Go,在关于Go Web服务器的中,在Go中有监听套接字和客户端套接字 我不明白为什么GoLang需要两个SocketListen Socket,Client Socket,而不仅仅是一个Socket,有人能解释一下它的概念吗 编辑:我更新了我的答案。可能是我误解了图形或者图形画得不好,可能是监听套接字,客户端套接字是同一个套接字,如果套接字没有接受来自客户端的连接,则称为监听套接字,在它接受连接之后,它被重命名为客户端套接字,只有一个套接字具有不同的阶段和名称 更新1: 我找到了一篇关于套接字工

关于
Go Web服务器的
中,在
Go
中有
监听套接字
客户端套接字

我不明白为什么GoLang需要两个Socket
Listen Socket,Client Socket
,而不仅仅是一个Socket,有人能解释一下它的概念吗

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

可能是我误解了图形或者图形画得不好,可能是
监听套接字
客户端套接字
是同一个套接字,如果套接字没有接受来自客户端的连接,则称为
监听套接字
,在它接受连接之后,它被重命名为
客户端套接字
,只有一个套接字具有不同的阶段和名称


更新1:

我找到了一篇关于套接字工作的更好的文章和图表

在本文的grpah中,很明显,当出现新连接时,TCP服务器将 创建一个新套接字来处理连接,然后
侦听套接字
继续侦听其他连接

文章中有一段:

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


更新2

由于第一次更新是在Micrium上进行的,我发现另一个似乎更通用的TCP工作指令

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

连接:

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

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

  • 客户端和服务器发出read()和write()套接字函数,通过套接字交换数据

  • 注意:除了read()和write()套接字函数之外,还有几个SSL API可用于发送和接收数据

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

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

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


    注:

  • 我发现另一个提到了TCP中的工作细节

  • 中,关于
    Socket.Accept Method()
    的解释是
    Accept从侦听套接字的连接请求队列中同步提取第一个挂起的连接请求,然后创建并返回一个新套接字。

  • 在更新1之前,我浏览了,但是我没有看到它提到使用一个套接字的细节,当接受它时,它将创建另一个新套接字

  • 也许彻底的方法是在Go中研究有关创建套接字和连接的源代码,但我现在不打算这样做


  • 这只是试图说明TCP连接是如何处理的,根本不具体。服务器必须接受客户端连接,否则它什么也不做。不,有两个套接字,侦听套接字和已连接套接字。从accept(2)手册页:
    “[accept]提取侦听套接字sockfd的挂起连接队列上的第一个连接请求,并创建一个新的连接套接字”
    。它是一个全新FD的完全独立的插座;但这并不是唯一的,这是TCP套接字的工作原理。你真的在使用micrium实时操作系统吗?我的意思是TCP的一般概念是相同的,但这些系统调用是该操作系统独有的。我在阅读时没有意识到它是特定的操作系统,我在Update2中找到了另一个关于TCP的更一般的说明。您似乎能够找到最模糊的源,那是来自IBM zSeries z/TPF的。我的意思是,这主要是一般信息,但您应该知道这些来源可能有特定于其域的详细信息。