tcp链接端口的理解

tcp端口

tcp中的端口,一直以为tcp的端口是个类似的实体的东西,类似于存储数据的数据包的队列那种,所以一个server的端口只能处理一个链接,当server开启listen端口后,服务器接受到链接请求,server会分配一个随机的没有用到的端口给tcp链接。但是这是错的!

tcp使用本地地址和远端地址组成的4元组(目的ip,目的端口,本地ip,本地端口)来处理多个链接请求。这个端口在tcp内核中紧紧是协议中的一部分,内核中仅仅通过目的端口无法确定是哪个进程接受到请求,所以需要server端的端口才能确定和客户端的链接。另外只有处于listen状态中的进程才能接受新的链接请求。当有新的请求到达并且被接受,内核会创建一个处于estableished状态的链接,而且端口号不变与listen的端口号一致。

看个🌰

我们起一个服务,我这里起了个hexo服务,使用4000端口号
使用命令,查看链接

netstat -a -n -f inet

可以看到一个处于listen的4000端口,显示本地地址*.4000, 远端地址是*.*,这表明可以接受任意主机的请求

tcp4       0      0  *.4000                 *.*                    LISTEN     

这时候我们telnet 4000这个端口,可以看到有两个新的请求,一个本地端口4000 远端端口60352,这是server上的链接,另一个本地60352,远端4000,这是telnet客户端的链接

tcp4       0      0  *.4000                 *.*                    LISTEN     
tcp4       0      0  127.0.0.1.4000         127.0.0.1.60352        ESTABLISHED
tcp4       0      0  127.0.0.1.60352        127.0.0.1.4000         ESTABLISHED

关于tcp的更多知识,tcp详解 18章,unix网络编程,都有对tcp进行详细的描述。