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

端口重用引起的麻烦事

 

一个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.

posted @ 2015-10-26 13:11  静之深  阅读(996)  评论(0编辑  收藏  举报