您的位置:首页 > 其它

端口重用 套接字最大连接数

2015-10-26 13:11 225 查看

端口重用引起的麻烦事

一个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)可以无穷变化,这样就可以建立很多个客户端的请求了。

注:

对于http 80, 当accept后一个新的socket描述符,其所占用的本地端口号依然是80,系统不会使用一个新的随机端口.

参考深入浅出Linux TCP/IP协议栈(p294):

但第三次握手时(客户端发送ACK), 服务器从监听socket上新克隆一个struct tcp_sock, 置其状态为TCP_SYN_RECV,然后把新创建的tcp_sock也绑定在跟监听端口相同的本地端口上.最后,把socket的状态改为TCP_ESTABLISH.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: