linux内核如何区分连接套接字和监听套接字?

Posted

技术标签:

【中文标题】linux内核如何区分连接套接字和监听套接字?【英文标题】:How linux kernel distinguish connected socket and listening socket? 【发布时间】:2016-03-09 02:22:33 【问题描述】:

例如,一个 tcp 服务器正在监听地址 10.10.10.1:80。客户端 10.10.10.2:555 连接进来。服务器 accept() 将创建一个新的连接套接字,该套接字由 (10.10.10.1:80,10.10.10.2:555,tcp) 标识。并且服务器为连接的套接字创建一个线程并继续侦听套接字。 当客户端有新数据到服务器时,我的问题是内核如何区分监听套接字和连接套接字? (当然他们有不同的文件手,但是内核如何通过目标地址获得正确的套接字?)内核如何知道这些即将到来的数据将通过连接的套接字而不是监听套接字传递给 APP?不确定我的问题是否清楚。

【问题讨论】:

【参考方案1】:

没必要。传入段的地址为本地 IP:port,并具有另一个 IP:port 的源地址。它所要做的就是找到一个具有该本地 IP:port 和该远程 IP:port 的套接字。侦听套接字根本没有远程 IP:端口,并且连接到其他对等点的具有该本地 IP:端口的套接字将具有不同的远程 IP:端口。

【讨论】:

所以监听socket用(local ip:port, null remote addr)标识,而创建的连接socket用(local ip:port, remote ip:port)标识。内核可以使用 ip/udp 标头找到正确的套接字。我说的对吗?

以上是关于linux内核如何区分连接套接字和监听套接字?的主要内容,如果未能解决你的问题,请参考以下文章

在不相关的进程之间共享套接字(监听)

linux系统实现多个进程监听同一个端口

多端口监听套接字linux

MultiSocket 监听 Linux 套接字编程

Linux/UNIX套接字连接

Linux在Linux中查看进程占用的端口号