TCP 和 UDP 可以使用同一个端口吗?( 三 )
客户端的端口可以重复使用吗?
客户端在执行 connect 函数的时候,会在内核里随机选择一个端口,然后向服务端发起 SYN 报文,然后与服务端进行三次握手 。

文章插图
所以,客户端的端口选择发生在 connect 函数,内核在选择端口的时候,会从 net.ipv4.ip_local_port_range 这个内核参数指定的范围来选取一个端口作为客户端端口 。
该参数的默认值是 32768 61000,意味着端口总可用的数量是 61000 - 32768 = 28232 个 。
当客户端与服务端完成 TCP 连接建立后,我们可以通过 netstat 命令查看 TCP 连接 。
$ netstat -napt 协议 源ip地址:端口 目的ip地址:端口 状态 tcp 192.168.110.182.64992 117.147.199.51.443 ESTABLISHED
那问题来了,上面客户端已经用了 64992 端口,那么还可以继续使用该端口发起连接吗?
这个问题,很多同学都会说不可以继续使用该端口了,如果按这个理解的话,默认情况下客户端可以选择的端口是 28232 个,那么意味着客户端只能最多建立 28232 个 TCP 连接,如果真是这样的话,那么这个客户端并发连接也太少了吧,所以这是错误理解 。
正确的理解是,TCP 连接是由四元组(源IP地址,源端口,目的IP地址,目的端口)唯一确认的,那么只要四元组中其中一个元素发生了变化,那么就表示不同的 TCP 连接的 。所以如果客户端已使用端口 64992 与服务端 A 建立了连接,那么客户端要与服务端 B 建立连接,还是可以使用端口 64992 的,因为内核是通过四元祖信息来定位一个 TCP 连接的,并不会因为客户端的端口号相同,而导致连接冲突的问题 。
比如下面这张图,有 2 个 TCP 连接,左边是客户端,右边是服务端,客户端使用了相同的端口 50004 与两个服务端建立了 TCP 连接 。

文章插图
仔细看,上面这两条 TCP 连接的四元组信息中的「目的 IP 地址」是不同的,一个是 180.101.49.12,另外一个是 180.101.49.11 。
多个客户端可以 bind 同一个端口吗?
bind 函数虽然常用于服务端网络编程中,但是它也适用于客户端的 。
前面我们知道,客户端是在调用 connect 函数的时候,由内核随机选取一个端口作为连接的端口 。
而如果我们想自己指定连接的端口,就可以用 bind 函数来实现:客户端先通过 bind 函数绑定一个端口,然后调用 connect 函数就会跳过端口选择的过程了,转而使用 bind 时确定的端口 。
针对这个问题:多个客户端可以 bind 同一个端口吗?
要看多个客户端绑定的 IP + PORT 是否都相同,如果都是相同的,那么在执行 bind() 时候就会出错,错误是“Address already in use” 。
如果一个绑定在 192.168.1.100:6666,一个绑定在 192.168.1.200:6666,因为 IP 不相同,所以执行 bind() 的时候,能正常绑定 。
所以,如果多个客户端同时绑定的 IP 地址和端口都是相同的,那么执行 bind() 时候就会出错,错误是“Address already in use” 。
一般而言,客户端不建议使用 bind 函数,应该交由 connect 函数来选择端口会比较好,因为客户端的端口通常都没什么意义 。
客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?
针对这个问题要看,客户端是否都是与同一个服务器(目标地址和目标端口一样)建立连接 。
如果客户端都是与同一个服务器(目标地址和目标端口一样)建立连接,那么如果客户端 TIME_WAIT 状态的连接过多,当端口资源被耗尽,就无法与这个服务器再建立连接了 。
但是,因为只要客户端连接的服务器不同,端口资源可以重复使用的 。
所以,如果客户端都是与不同的服务器建立连接,即使客户端端口资源只有几万个,客户端发起百万级连接也是没问题的(当然这个过程还会受限于其他资源,比如文件描述符、内存、CPU 等) 。
如何解决客户端 TCP 连接 TIME_WAIT 过多,导致无法与同一个服务器建立连接的问题?
推荐阅读
- 霉菌和支原体合并感染治疗
- 张凌赫|“新晋男友”张凌赫和“一线小花”白鹿的绯闻恋情无人塌房?
- 罗纳德·里根|泽连斯基和里根,均是演员从政当选总统,谁演戏更成功?
- 和田玉籽料|明以前 熟坑 和田玉籽料 白玉 工字珮 挂件
- 有理数和无理数的区别 无理数包括哪些-有理数和无理数的区别怎么区分-
- 李荣浩|评价杨淳和张艺雯的时候,李荣浩特意加了两个前提,体现了高情商
- 想和你谈一场以结婚为目的的恋爱?抱着结婚的目的谈恋爱
- 时间简史和空间简史的作者?时间飞逝随笔
- TFBOYS|TFBOYS和TNT哪个更火\t呢?
- 傅娟|1995年,33岁傅娟怀孕7个月,才和恋爱10年的欧阳龙举行婚礼