昨天,实习的导师向我提了一个问题,关于TCP连接时绑定的端口问题,由于最近一直在阅读PG的源码,PG和MYSQL不同的地方在于PG对于多连接时的处理是开启多进程,而MYSQL的处理是多线程。那么为何多进程连接时绑定的是同一个端口呢,还有多线程连接时的端口信息又是如何区分的呢。
https://blog.csdn.net/zsxy309/article/details/6739262读了这篇博客之后,我了解到socket连接是由源IP、源端口、宿IP、宿端口来区分,对于一个MYSQL服务端,它的进程绑定了端口,而由不同的线程完成了socket连接。这些连接的宿IP和宿端口是不变的,如果是本地连接的话源IP不变,由随机分配的源端口区分。
https://blog.csdn.net/yanzongshuai/article/details/82056057而对于PG而言,PG的整体流程是由主进程接收到socket连接后会fork给子进程。这里查阅了很多c++的资料,父进程fork给子进程时,子进程是可以继承这种socket绑定状态共享端口,而当子进程结束时也会关掉父进程的socket连接。
自我理解总结,TCP对于多线程也好多进程也好,服务端bind端口后,不同连接的消息都会通过此端口来传输,而区分消息具体的传输对象就是根据socket来区分。通过对PG的简单抓包分析验证了结论。