关于单机单网卡最大连接数的一些思考

date
Mar 28, 2020
slug
关于单机单网卡最大连接数的一些思考
status
Published
tags
开发相关
summary
type
Post
说起端口号范围基本都可以信手拈来0-65535,但是为什么是0-65535而不是其他数值呢?这个是TCP数据包结构决定的,先看下TCP数据包结构图:
 
notion image
可以看到源端口号和目的端口号都是16位,所以端口范围就是0-(2^16-1),也就是0-65535,同理,UDP的数据包结构中,源端口号和目的端口各占16位,端口范围也是0-65535。
 
那么单机单网卡维持的连接能超过65535吗?
 
这就涉及到五元组的概念,五元组:源IP,源端口,协议,目的IP,目的端口;一个五元组确定一个TCP会话,对于TCP而言,协议已经确定了,所有由端口源IP,源端口,协议,目的IP来确定一个TCP会话,TCP是多路复用的,参考RFC文档
To allow for many processes within a single Host to use TCP communication facilities simultaneously, the TCP provides a set of addresses or ports within each host. Concatenated with the network and host addresses from the internet communication layer, this forms a socket. A pair of sockets uniquely identifies each connection. That is, a socket may be simultaneously used in multiple connections.
  • 服务端
    • 服务端的监听端口和地址确定的了,只要目的IP或者目的端口不通都算一个会话,理论上没有限制,受限于CPU和内存资源。
  • 客户端
    • 由于客户端是发起连接的,发起TCP会随机选择本地端口,而0-1023低位端口又是留给特定服务的,实际客户端自身能发起的连接数理论不会超过64512。
 
那么NAT设备(例如:路由器)的最大连接数是多少?
 
NAT设备负责网络转发,其背后不止一台设备,NAT设备会篡改源IP地址或者源端口,准确来说是一定会改源IP,端口不一定改,相对于外网而言,由于nat后面的设备可以看做一个整体,而nat发起的连接是有限的(65535?),所以一个nat的带机量是有限(是否可以通过多层nat设备解决?)
由此想到一个案例,以前住出租屋的时候网络用的大内网,很多人共用一条光纤,我在阿里云上搭建了一个FTP服务器(被动模式),用出租屋的网络一直都连不上,用公司网络就没问题,或者经过VPN中转也是没问题的,百思不得其解。然后就看FTP的调试日志,由于FTP控制端口和数据端口是分开的,发现控制端口的连接和数据传输端口的连接源地址不一样,也就是说,服务端接受控制端口的连接后开始传输数据时发现客户端的IP变了,然后终端数据传输。故我猜测是网络同构了多层nat造成的(未经验证)。

© Ryan Tang 2021 - 2025