我在客户端进程和服务器进程之间有一个套接字连接,两者都在我的计算机上运行。连接显示有两个条目,如下所示:
sudo netstat -ntp | grep 56442
tcp 1 0 127.0.0.1:56442 127.0.0.1:8002 CLOSE_WAIT 8276/python
tcp 0 0 127.0.0.1:8002 127.0.0.1:56442 FIN_WAIT2 -
在这种情况下我怎样才能知道哪个是服务器?
我知道 TCP 服务器正在 port 上运行8002
,并且客户端从 port 连接到侦听服务器56442
。
我试图通过查看netstat
输出条目来找出区分服务器和客户端的方法。
为什么当套接字处于FIN_WAIT2
状态时不出现进程 ID/描述?
答案1
如果运行时netstat
不带grep
,您将看到中心左侧的列具有“本地地址”之类的标题,中心右侧的列具有“外部地址”之类的标题。显示包含服务器端口号的本地地址的行是服务器。
如果您同时启动两个客户端进程然后运行,您可能会对此有更好的感觉
sudo netstat -ntp | grep -E "Address|8002"
当套接字处于
FIN_WAIT2
状态时,为什么进程 ID/描述没有出现?
可能是因为进程已经终止;毕竟,FIN
代表“完成”或“最终”。FIN 数据包和FIN_
状态与关闭(关闭)TCP 连接有关,这通常仅在进程完成时发生(并且当一个或两个进程死亡时会自动发生)。套接字可以在打开它的进程消失后在系统中停留一段时间。同样,您可能可以通过netstat
在两个进程都正常的情况下运行,然后观察它们关闭时它如何变化来更好地理解这一点。
答案2
我相信netstat -ntp
只会显示客户端(非监听)套接字本地地址柱子。
这-l
标志应该导致netstat
仅列出服务器(侦听)套接字,并且-a
你应该两者都得到,然后你可以根据状态s。