【发布时间】:2015-06-19 21:11:59
【问题描述】:
我运行了命令sudo lsof -i -n -P | grep TCP,我想知道是否可以对其输出进行更多说明。
具体来说,在这张图片中:
为什么我有一个 IP:PORT 指向另一个 IP:PORT,然后又用标签“ESTABLISHED”返回自身?我对这到底意味着什么感到困惑。
【问题讨论】:
标签: linux network-programming lsof
我运行了命令sudo lsof -i -n -P | grep TCP,我想知道是否可以对其输出进行更多说明。
具体来说,在这张图片中:
为什么我有一个 IP:PORT 指向另一个 IP:PORT,然后又用标签“ESTABLISHED”返回自身?我对这到底意味着什么感到困惑。
【问题讨论】:
标签: linux network-programming lsof
我不确定您对网络和 TCP 的总体了解程度,因此我将尝试提供一个包含几个细节的简短描述。从您的问题来看,您似乎对网络内部不太熟悉,因此可能很难理解其中一些概念,但我希望这会有所帮助:
TCP 协议有多种状态。把它想象成一个状态机。客户端状态包括CLOSED、SYN_SENT、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2和TIME_WAIT。
因此,ESTABLISHED 标签表示 TCP 连接处于ESTABLISHED 状态。处于建立状态意味着两台主机都成功完成了 TCP 3 次握手(并在此过程中从SYN_SENT 转换为ESTABLISHED)。从CLOSED 到SYN_SENT 的转换发生在客户端向服务器发送TCP SYN 请求时。
在已建立的连接中,双方都发送和接收特定于应用程序的数据。基本上,会话已建立,并且双向字节流在两个终端系统之间流动。
TCP 套接字由 4 元组 (source-ip, source-port, destination-ip, destination-port) 唯一标识。 IP 标识终端系统的网络接口,端口号用于复用和解复用到达该网络接口的数据包(以便目标系统知道将数据包传递到哪个服务)。这就是IP:PORT 字段的含义。
我不确定为什么同一连接有两个条目。这可能与系统有关,尽管这很奇怪(在我的系统中,每个套接字只有一个条目)。但是套接字是双向的,因此您的系统可能会将每个数据包流向显示为一个不同的条目。这也可能取决于系统如何实现套接字。
【讨论】:
ESTABLISHED 表示 TCP 连接已经完成了 3 次握手。 (不确定是否必须调用accept)。见TCP state diagram。
为什么我有一个 IP:PORT 指向另一个 IP:PORT 然后又回到自己
这意味着您的进程中有两个 TCP 套接字打开。最有可能的是,一个监听端口 9092,另一个从端口 57633 连接到该监听套接字。 57633端口属于ephemeral port range,即操作系统自动分配给调用connect但没有调用bind分配特定端口的套接字的端口范围。
【讨论】:
HostA:PortA -> HostB:PortB,那么你就不能有一个 distinct 套接字HostB:PortB -> HostA:PortA。 HostA 如何区分针对PortA 的流量并将其传递到正确的套接字?这是不可能的 - 我认为这只是 lsof 在同一个套接字中显示每个流向的不同条目。
accept(2) 在这里并不重要。我们调用accept(2) 的套接字始终处于LISTEN 状态,它是accept(2) 返回的new 套接字,最终从SYN_RCVD 转换为ESTABLISHED。所以我不明白你为什么在回答中提到accept(2)。
accept 返回的套接字在ESTABLISHED 中声明,即accept 永远不会返回未完成3 次握手的套接字。 (TCP Fast open 不同)。