Go ListenSocket客户端套接字转到
在关于Go ListenSocket客户端套接字转到,go,Go,在关于Go Web服务器的中,在Go中有监听套接字和客户端套接字 我不明白为什么GoLang需要两个SocketListen Socket,Client Socket,而不仅仅是一个Socket,有人能解释一下它的概念吗 编辑:我更新了我的答案。可能是我误解了图形或者图形画得不好,可能是监听套接字,客户端套接字是同一个套接字,如果套接字没有接受来自客户端的连接,则称为监听套接字,在它接受连接之后,它被重命名为客户端套接字,只有一个套接字具有不同的阶段和名称 更新1: 我找到了一篇关于套接字工
Go Web服务器的中,在Go
中有监听套接字
和客户端套接字
我不明白为什么GoLang需要两个SocketListen 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的。我的意思是,这主要是一般信息,但您应该知道这些来源可能有特定于其域的详细信息。