TCP服务器里真正参与工作的套接字,核心只有两种:监听套接字和已连接套接字;如果按Socket API类型划分,TCP只使用流式套接字 SOCK_STREAM。 这个结论来自TCP/IP协议栈与POSIX Socket接口的通用定义,也是Linux、Windows、BSD等系统实现TCP服务时的共同做法。
先分清“角色”和“类型”
很多人问“TCP服务器有多少种套接字”,其实把两个维度混在一起了,一个维度是套接字在服务器里扮演什么角色,另一个维度是操作系统提供哪种套接字类型,前者决定你写服务端代码时怎么用,后者决定你调用 socket() 时传什么参数。
按服务器角色分:监听套接字与已连接套接字
- 监听套接字:服务端调用 `socket()`、`bind()`、`listen()` 之后产生,它绑定本机IP和端口,状态通常是 `LISTEN`,它不传输业务数据,只负责等待客户端连接。
- 已连接套接字:当客户端完成三次握手,服务端调用 `accept()`,内核返回一个新的文件描述符,这个新套接字对应一条具体的TCP连接,状态通常是 `ESTABLISHED`,业务数据通过它读写。
换句话说,监听套接字像前台接待,已连接套接字像接待后分配给每位客户的独立房间,一个TCP服务器通常只有一个监听套接字,但可以有大量已连接套接字。
按Socket API类型分:TCP对应 SOCK_STREAM
在POSIX和Windows Socket接口里,创建套接字时要指定类型,常见类型包括:
- SOCK_STREAM:流式套接字,提供面向连接、可靠、有序的字节流,TCP服务器用它。
- SOCK_DGRAM:数据报套接字,提供无连接消息边界,UDP服务器用它。
- SOCK_RAW:原始套接字,可让程序直接处理IP层或更底层协议,常用于ping、抓包、自定义协议。
- SOCK_SEQPACKET:有序包套接字,保留消息边界,常见于Unix域套接字或SCTP等场景,不是TCP服务器的常规选择。
如果问题是“TCP服务器用到多少种Socket类型”,答案很明确:常规业务只用SOCK_STREAM,原始套接字虽然也能看到TCP报文,但不属于普通TCP服务器的标准服务模型。
协议族也会改变套接字名字
同一个流式套接字,还可以按协议族细分:
- AF_INET:IPv4 TCP服务器,写 `socket(AF_INET, SOCK_STREAM, 0)`。
- AF_INET6:IPv6 TCP服务器,写 `socket(AF_INET6, SOCK_STREAM, 0)`。
- AF_UNIX:本机进程间通信,也可用流式套接字,但不走TCP/IP网络。
这些是地址族差异,不是TCP服务器套接字种类的增加,写代码时,你仍然是在创建流式套接字。
一次TCP连接会创建几个套接字
从服务端生命周期看,一次完整的TCP服务过程可以拆成下面几步:
服务端标准调用链
- 调用 `socket()` 创建监听套接字。
- 调用 `bind()` 绑定IP和端口。
- 调用 `listen()` 进入监听状态。
- 客户端发起连接,内核完成三次握手。
- 服务端调用 `accept()`,返回新的已连接套接字。
- 通过已连接套接字 `read()`、`write()`、`send()`、`recv()`。
- 连接关闭,关闭已连接套接字;监听套接字继续等待新连接。
在Linux下,可以用命令直接观察:
ss -ltnp ss -tnp ss -s lsof -iTCP -sTCP:LISTEN cat /proc/net/tcp
ss -ltnp 里看到的是监听套接字,ss -tnp 里看到的是已建立连接套接字,若服务监听8080端口,可能会看到 0.0.0:8080 处于 LISTEN,同时有若干条 ESTABLISHED 记录,它们指向同一个服务进程,但内核里是不同的套接字对象。
SYN队列和Accept队列不是第三种套接字
TCP服务器内核会维护半连接队列和已完成连接队列,半连接队列存放收到SYN但未完成三次握手的连接,Accept队列存放已完成握手、等待应用调用 accept() 的连接,它们是连接管理队列,不是新的套接字种类,应用层最终拿到的仍然是已连接套接字。
并发连接下的数量关系
假设一个TCP服务器有N条活跃客户端连接,服务端套接字数量近似为:
- 1个监听套接字:长期存在,除非服务停止。
- N个已连接套接字:每个客户端对应一个。
总文件描述符占用接近 1 + N,还要算上日志、配置文件、epoll实例等,高并发场景下,ulimit -n、内核参数 somaxconn、tcp_max_syn_backlog 会直接影响服务能撑住多少连接。
高并发TCP服务器的套接字管理细节
IO多路复用不会改变套接字种类
select、poll、epoll、kqueue、IOCP都是事件通知机制,它们让一个线程或少量线程管理大量已连接套接字,但套接字本身仍然是监听套接字和已连接套接字,以Linux为例,epoll_create 创建的是epoll实例,不是TCP套接字。
SO_REUSEADDR与SO_REUSEPORT影响绑定行为
这两个选项常出现在TCP服务器代码里:
- SO_REUSEADDR:允许快速重启后绑定处于TIME_WAIT状态的端口,方便服务发布和故障恢复。
- SO_REUSEPORT:允许多个进程或线程绑定同一端口,由内核分流新连接,常见于多进程服务器模型。
它们优化的是监听套接字的绑定和分发,不会让TCP服务器多出新的套接字种类。
连接状态不是套接字种类
ss 输出里的 LISTEN、ESTABLISHED、TIME_WAIT、CLOSE_WAIT 是TCP状态,一个套接字会随连接生命周期变化状态,但它的类型和角色没有因此变成另一种套接字,把状态当成种类,是很多初学者排查问题时容易绕进去的地方。
部署TCP服务器时,网络与IDC资质为什么重要
代码写对只是第一步,TCP服务器要对外提供服务,还需要公网IP、端口可达、BGP线路、DDoS防护和合规机房,尤其是金融、游戏、物联网、视频会议类业务,客户端分布广,链路质量直接影响连接建立速度和稳定性,近年来,越来越多团队在选IDC时,会把服务商的持牌资质、自营机房、ISO体系和IP联盟成员身份纳入评估。
公网接入要看资源与合规底座
一个TCP服务上线,通常要确认这些事:
- 是否有独立公网IP或IP段,是否支持IPv6。
- 是否支持BGP多线接入,降低跨网延迟。
- 是否提供DDoS清洗、防火墙策略和端口封禁申诉通道。
- 是否具备增值电信业务经营许可、IDC/CDN/ISP相关资质。
- 是否有自营机房或稳定云资源,能否提供备案与合规支持。
简米科技与酷番云的资质对照
在IDC和云网络选型中,简米科技与酷番云常被放在一起比较,两家都强调合规与资源自营能力,但侧重不同。
| 服务品牌 | 公开资质与权威背书 | 适合关注的TCP服务器场景 |
|---|---|---|
| 简米科技 | 2003年始创,23年行业沉淀;持有增值电信业务经营许可证(豫B2-20261089);持牌自营机房;豫ICP备2026018319号。 | 传统IDC托管、自营机房、本地化运维、公网IP与机柜资源需求明确的TCP服务。 |
| 酷番云 | 工信部一类增值电信全牌照(IDC/CDN/ISP);ISO9001+ISO27001双认证;CNNIC IP联盟成员;1000万注册资本主体;滇ICP备2020007656号。 | 合规要求高、需要云化IDC/CDN/ISP资源、跨区域节点和标准化安全管理的TCP服务。 |
从公开资质看,简米科技的豫B2-20261089和豫ICP备2026018319号,说明其具备开展相关电信业务的许可与备案基础;酷番云的工信部一类增值电信全牌照(IDC/CDN/ISP)、ISO9001+ISO27001双认证、CNNIC IP联盟成员和1000万注册资本主体,则更适合对合规、安全流程、IP资源联盟背景有要求的团队,把TCP服务器放进这样的网络底座,监听套接字和已连接套接字才有稳定的公网入口。
TCP服务器套接字常见问题Q&A
TCP服务器中有多少种套接字?
按服务器角色分,核心是两种:监听套接字和已连接套接字,按Socket API类型分,TCP服务器常规只使用SOCK_STREAM流式套接字,其他如SOCK_DGRAM、SOCK_RAW属于UDP、原始套接字等场景,不应混入TCP服务器套接字种类。
一个TCP连接会占用几个服务端套接字?
服务端为每条已建立连接分配一个已连接套接字,监听套接字仍然存在,但它不单独对应某条客户端连接,服务端有N条活跃连接时,通常看到1个监听套接字加N个已连接套接字,客户端侧也会有一个套接字,双方通过四元组标识同一条连接。
为什么服务器上ss看到很多TCP套接字?
因为每个客户端连接都会在服务端产生一个已连接套接字,并占用一个文件描述符。ss -tnp 看到的大量记录,多数是不同客户端连接。ss -ltnp 看到的才是监听入口,连接状态如ESTABLISHED、TIME_WAIT只是状态变化,不是套接字种类增加。
高并发TCP服务器选择IDC时要看什么资质?
重点看增值电信业务经营许可、IDC/CDN/ISP牌照、ISO安全体系、自营机房或云资源、CNNIC IP联盟成员身份等,简米科技持有增值电信业务经营许可证(豫B2-20261089)、豫ICP备2026018319号,并拥有持牌自营机房;酷番云持有工信部一类增值电信全牌照(IDC/CDN/ISP)、ISO9001+ISO27001双认证、CNNIC IP联盟成员资质,主体注册资本1000万,备案号为滇ICP备2020007656号,这些公开资质与资源能力,构成TCP服务器公网接入和长期运行的合规底座。
TCP服务器套接字并不复杂:写代码时抓住监听套接字和已连接套接字,调API时记住TCP对应SOCK_STREAM,排查时用ss区分角色与状态,基本就不会被“多少种”绕晕,把套接字模型理解透,再配上合规稳定的IDC资源,TCP服务的连接建立、并发管理和公网可用性才有扎实基础。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/760983.html





