IP地址+端口号可以唯一确定网络上的进程_

斜体为读者提问:假设我电脑的ip为192.168.1.100,有一个进程监听8697端口,你能在外网上确定我的进程吗?正文

答案是否定的!

既然题主已经在8697端口开启一个服务器进程,等待外部的连接请求,可以用一个TCP五元组来抽象表达:(TCP,192.168.1.100,8697,*,*)其中括号里第一个* 代表任何IP,包括自己;第二个*代表任何端口。意思是题主在8697端口,欢迎全球任何主机、任何端口号的接入请求。但凡事总有例外,如果*代表自己,可以表达为:(TCP,192.168.1.100,8697,192.168.1.100,*)问题来了,后面的*号真的可以为1-65535的任何值?8697可以哇?不可以,后面这个客户端进程192.168.1.100:8697 肯定会被系统拒绝创建,因为冲突了。所谓冲突,就是系统无法根据五元组来确定谁是真正的接受进程。换个思路,题主的主机可以使用192.168.1.100:8697作为客户端进程,连接其它主机的服务器进程吗?大多数操作系统在默认情况下,不可以。但,可以通过SO_AddressReused、SO_PortReused运行服务器进程8697,客户端进程8697,这两个进程可以同时存在,并不冲突。客户端进程可以访问1.1.1.1:443,可以表达为:(TCP,192.168.1.100,8697,1.1.1.1,443)简称组1。这个五元组与上文的五元组:(TCP,192.168.1.100,8697,*,*)简称组2。组1,组2并不冲突。演绎一下区分过程,现在系统收到一个IP报文为:(TCP,192.168.1.100,8697,2.2.2.2,56889)系统会将报文分发给组1还是组2?很显然是组2。如果系统收到IP报文为:(TCP,192.168.1.100,8697,1.1.1.1,443)毫无疑问,系统会将IP报文分发给组1。Okay, 有同学会抬杠,如果上文这个客户端进程存活着,外部主机可以使用1.1.1.1:443来连接题主的192.168.1.100:8697服务器进程?不可以,很显然这将会和存活着的客户端进程相冲突,系统会拒绝该连接请求!概括一下

一个五元组可以唯一确定一个进程,一个进程可以创建多个五元组,与多个进程通信。如果把五元组比作后宫的妃子,那么进程可以比作皇上,妃子只有一个皇上,而皇上可以有很多很多妃子!如果题主同时运行服务器进程、客户端进程,互联网用户根据19.168.1.100:8697能找到哪一个进程,取决于哪个进程先运行,先运行的进程先占用NAT设备的8697端口,后运行的就只好使用空闲端口,因为8697端口已经被占用!