TCP server 为什么一个端口可以建立多个连接?(网络讨论)

TCP server 为什么一个端口可以建立多个连接?

我一直对这个问题有个疑问,今天看到一个论坛里面的讨论,看到了一些回答,解决了我的疑惑,并且我搜索了一些其他资料,记录在这里。

  1. TCP server 可以,TCP client 也可以。一个套接字只能建立一个连接,无论对于 server 还是 client。

    TCP server 可以,TCP client 也可以。一个套接字只能建立一个连接,无论对于 server 还是 client。

    注意报错消息是:

    [Errno 106] (EISCONN) Transport endpoint is already connected
    man 2 connect 说得很清楚了:

    Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
    就是说,TCP 套接字最多只能调用 connect 一次。那么,你的监听套接字调用 connect 了几次?

    来点有意思的。

    一个套接字不能连接两次,并不代表一个本地地址不能用两次,看!*加粗文字加粗文字*

>>> import socket
>>> s = socket.socket()
# since Linux 3.9, 见 man 7 socket
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s2 = socket.socket()
>>> s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s.bind(('127.0.0.1', 12345))
>>> s2.bind(('127.0.0.1', 12345))
# 都可以使用同一本地地址来连接哦
>>> s.connect(('127.0.0.1', 80))
>>> s2.connect(('127.0.0.1', 4321))
>>> netstat -npt | grep 12345
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:4321          127.0.0.1:12345         ESTABLISHED 18284/python3
tcp        0      0 127.0.0.1:12345         127.0.0.1:4321          ESTABLISHED 4568/python3
tcp        0      0 127.0.0.1:80            127.0.0.1:12345         ESTABLISHED -
tcp        0      0 127.0.0.1:12345         127.0.0.1:80            ESTABLISHED 4568/python3
  1. 端口重用引发的惨案

    再接下来分析:
    一个TCP连接需要由四元组来形成,即(src_ip,src_port,dst_ip,dst_port)。
    假设有客户端建立了连接(src_ip1,src_port1,dst_ip1,dst_port1),那么,如果我们还有listen在(src_ip1,src_port1),那么当(dst_ip1,dst_port1)发送消息过来,系统应该把消息给谁?所以就说明了客户端占用了某一端口时,该端口就不能被其它进程listen了。

    那么,对于有些童鞋,可能还有这样的疑问,是否一台机器就只能建立65535个连接了(端口16位限制)?非也,一个连接由四元组(src_ip,src_port,dst_ip,dst_port)形式,那么当(src_ip,src_port)一定时,变化的(dst_ip,dst_port)就可以建立更多连接了。

    可能有些童鞋还有疑问,作为一个服务器监控一个端口,比如80端口,它为什么可以建立上百万个连接?首先要明白一点,当accept出来后的新socket,它所占用的本地端口依然是80端口,很多新手都以为是一个新的随机端口。由四元组就很容易分析到了,同一个(src_ip,src_port),它所对应的(dst_ip,dst_port)可以无穷变化,这样就可以建立很多个客户端的请求了。

    以后遇到奇怪的问题,可以简单的采用四元组原理分析一下了。

  2. 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

  3. 一个人也可以建立 TCP 连接呢

你可能感兴趣的:(网络)