服务器通过“IP地址+端口号”的组合唯一标识客户端,并在TCP连接建立时通过三次握手确认身份,后续通信则依赖会话状态或Token维持区分。
想象一下,服务器就像是一个巨大的呼叫中心,而客户端就是打进来的电话,如果所有电话都混在一起,客服根本不知道谁在说话,更别提处理各自的业务了,在数字世界里,这种“区分”是系统稳定运行的基石,没有这种机制,互联网将陷入混乱,数据错乱,服务中断。
网络层:IP地址与端口号的精准定位
IP地址:客户端的数字身份证
每一个连接到互联网的设备,无论是一台高性能工作站,还是你手中的智能手机,都必须拥有一个唯一的网络地址,这就是IP地址,IPv4地址由32位二进制数组成,通常表示为四个十进制数,如192.168.1.1,IPv6则扩展到了128位,以应对设备数量的爆炸式增长。
业内专家指出,IP地址的主要作用是路由寻址,当数据包从客户端发往服务器时,IP头部包含了源IP和目标IP,服务器收到数据包后,首先检查目标IP是否为自己,如果是,则进一步解析内部结构,仅靠IP地址是不够的,因为一个IP可能对应多个设备(如NAT网络),或者一个设备可能同时运行多个服务。
端口号:服务的细分通道
为了解决IP地址的局限性,TCP/IP协议引入了端口号概念,端口号是一个16位的整数,范围从0到65535,0-1023是公认端口,如HTTP的80端口,HTTPS的443端口,这些端口通常被系统保留给特定服务。
客户端在发起连接时,会随机选择一个 ephemeral port(临时端口),通常大于1023,服务器则监听特定的服务端口,当你访问一个网站时,你的浏览器会生成一个临时端口(如54321),连接服务器的80或443端口,服务器通过“源IP:源端口”到“目标IP:目标端口”的四元组,唯一标识一个连接。
动态端口与静态端口的区别
- 静态端口:服务器端固定监听,如Web服务器始终监听80端口。
- 动态端口:客户端随机分配,每次连接可能不同,确保并发连接不冲突。
传输层:TCP三次握手与状态维护
建立连接的信任机制
TCP协议通过三次握手建立可靠连接,这不仅是技术流程,更是服务器区分客户端身份的关键步骤。
- SYN:客户端发送SYN包,携带初始序列号(ISN),表示请求连接。
- SYN-ACK:服务器收到后,回复SYN-ACK包,确认客户端的请求,并携带自己的ISN。
- ACK:客户端再发送ACK包,确认服务器的响应。
服务器在内存中创建了一个连接控制块(TCB),记录了该客户端的IP、端口、序列号等信息,这个TCB就是服务器区分该客户端的“临时档案”。
状态维持与超时清理
连接建立后,服务器并非一直记住每个客户端,它通过状态机管理连接,如果客户端长时间无活动,服务器会发送探测包,若多次无响应,服务器会关闭连接并释放资源,这种机制防止了资源耗尽,确保服务器能区分活跃客户端与非活跃客户端。
应用层:会话标识与身份验证
Cookie与Session:Web应用的区分逻辑
在HTTP这种无状态协议中,服务器无法天然记住谁是谁,应用层引入了Cookie和Session机制。
- Cookie
:服务器在响应中设置Set-Cookie头,客户端浏览器保存该Cookie,后续请求中,浏览器自动携带Cookie,服务器通过解析Cookie中的Session ID,找到对应的服务器端Session数据。
- Session:服务器在内存或数据库中存储Session数据,如用户ID、权限信息等,Session ID是区分不同用户的关键。
Token机制:现代API的通用方案
随着微服务和移动端的发展,JWT(JSON Web Token)成为主流,客户端登录后,服务器生成一个加密的Token返回,客户端在后续请求中携带该Token,服务器验证Token签名,提取用户信息,这种方式无需服务器存储会话状态,更适合分布式系统。
Token与Session的对比
| 特性 | Session | Token (JWT) |
|---|---|---|
| 存储位置 | 服务器端 | 客户端 |
| 服务器负载 | 高,需维护大量会话数据 | 低,无状态 |
| 扩展性 | 差,需会话共享 | 好,天然支持分布式 |
| 安全性 | 依赖服务器安全 | 依赖签名密钥安全 |
高并发场景下的区分策略
连接池与复用
在高并发场景下,频繁创建和销毁TCP连接成本极高,服务器采用连接池技术,复用现有连接,每个连接仍由四元组唯一标识,但服务器内部通过线程或异步事件循环处理不同客户端的请求。
负载均衡器的角色
当流量巨大时,单台服务器无法承受,负载均衡器(如Nginx、HAProxy)介入,将请求分发到后端多台服务器,区分客户端的责任部分转移到了负载均衡器,它通过会话保持(Session Affinity)技术,确保同一客户端的请求始终路由到同一台后端服务器,避免会话丢失。
WebSocket长连接
对于实时应用,如聊天室或游戏,WebSocket提供全双工通信,连接建立后,TCP连接保持打开,服务器通过维护一个全局的连接映射表,将WebSocket连接对象与客户端标识绑定,任何消息发送,都通过查找该映射表找到对应的连接对象。
常见问题与解答
服务器怎么区分不同客户端的IP地址是否真实?
服务器无法完全保证IP地址的真实性,因为存在IP伪造和代理技术,但可以通过反向DNS查询、IP信誉库比对、行为分析等手段辅助判断,来自同一IP的大量异常请求可能被标记为恶意。
为什么同一个IP地址会有多个不同的客户端连接?
这通常发生在NAT(网络地址转换)环境下,多个内网设备共享一个公网IP,服务器通过区分不同的源端口号来识别这些内网设备,每个设备发起连接时,NAT设备会分配不同的临时端口,服务器据此区分。
服务器怎么区分不同客户端的会话状态?
服务器通过会话标识(如Session ID或Token)区分,客户端在请求中携带该标识,服务器根据标识查找对应的会话数据,若标识无效或过期,服务器视为新客户端或非法请求。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/471790.html



