accept产生的socket为何还是使用原来的端口号?

accept产生的socket为何还是使用原来的端口号?

这样不就无法区分 侦听的socket和新的socket了吗?
还有客户端照旧往原来的端口发送,新的socket能接受到了吗?

客户的socket 进行connect
服务器进程老的socket 在listen,然后 accept 产生新socket, fork 然后子进程使用新的socket,

新的socket和老的socket 使用相同的端口,我们都知道新的socket在和客户的socket 通信,我不明白的就是怎么区分服务器进程老的socket 和新进程的socket。


——————
《TCP/IP Illustrated》中解释就是TCP连接由四个特征值区分,accept返回的socket没有必要使用新的端口号, 也能和其它TCP连接区分开.


处于LISTEN状态的的那个socket的daddr和dport都是0。
linux中处于LISTEN状态的socket和其它状态的socket分别在两个hash
table里,而且是后搜索LISTEN状态的那个hash table.

static inline struct sock __inet_lookup(struct inet_hashinfo hashinfo,
                     const u32 saddr, const u16 sport,
                     const u32 daddr, const u16 hnum,
                     const int dif)
{
    struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr,
                            hnum, dif);
    return sk ? : inet_lookup_listener(hashinfo, daddr, hnum, dif);
}


总结:两台机器(客户+服务器)的IP地址+传输协议+端口 才能真正确定 客户进程,服务器进程

(当有网卡接收到数据后,根据src ip + dest ip + src port + dest port这四个特征来dispatch数据到相应的进程)