4. 传输层核心协议:TCP三次握手与四次挥手、端口号与Socket概念、UDP协议特点

传输层位于OSI模型的第四层,是端到端通信的核心。它负责为上层应用提供可靠的或不可靠的数据传输服务。本章将深入剖析TCP协议的三次握手与四次挥手过程、端口号与Socket的概念,以及UDP协议的特点,这些都是网络故障排查中必须掌握的基础知识。

4.1 TCP三次握手:建立可靠连接

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。在数据传输开始前,通信双方必须通过“三次握手”建立一个虚拟连接,以确保双方都具备收发数据的能力。

三次握手的过程涉及三个关键标志位:SYN(同步序列号)、ACK(确认)和序列号(seq)。

核心要点:三次握手的本质是确认双方的接收与发送能力正常,并同步初始序列号(ISN)。

4.1.1 三次握手详细流程

  1. 第一次握手(SYN):客户端向服务器发送一个SYN报文,其中包含客户端的初始序列号(seq=x)。此时客户端进入SYN_SENT状态。
  2. 第二次握手(SYN+ACK):服务器收到SYN报文后,如果同意建立连接,则回复一个SYN+ACK报文。该报文包含服务器的初始序列号(seq=y)和对客户端SYN的确认号(ack=x+1)。服务器进入SYN_RCVD状态。
  3. 第三次握手(ACK):客户端收到服务器的SYN+ACK后,回复一个ACK报文,其中包含对服务器SYN的确认号(ack=y+1)和客户端的下一个序列号(seq=x+1)。客户端进入ESTABLISHED状态。服务器收到此ACK后,也进入ESTABLISHED状态,连接建立完成。
TCP三次握手流程图 客户端 服务器 CLOSED LISTEN ① SYN (seq=x) SYN_SENT SYN_RCVD ② SYN+ACK (seq=y, ack=x+1) ③ ACK (seq=x+1, ack=y+1) ESTABLISHED ESTABLISHED 三次握手关键点 • 第一次:客户端发送SYN,证明客户端的发送能力正常 • 第二次:服务器回复SYN+ACK,证明服务器的接收和发送能力正常 • 第三次:客户端回复ACK,证明客户端的接收能力正常,连接建立
故障排查提示:如果连接建立失败,可以通过抓包工具(如tcpdump、Wireshark)观察握手过程。常见问题包括:只看到SYN没有SYN+ACK(服务器端口未监听或防火墙拦截)、只看到前两次握手没有第三次ACK(客户端被防火墙拦截或半连接队列满)。

4.2 TCP四次挥手:优雅断开连接

当数据传输完成后,通信双方需要通过“四次挥手”来终止连接。TCP连接是全双工的,因此断开连接时需要双方各自关闭自己的数据通道。

四次挥手涉及的关键标志位包括:FIN(结束)、ACK(确认)。

4.2.1 四次挥手详细流程

  1. 第一次挥手(FIN):主动关闭方(假设为客户端)发送一个FIN报文,表示客户端不再发送数据,但可以继续接收数据。客户端进入FIN_WAIT_1状态。
  2. 第二次挥手(ACK):被动关闭方(服务器)收到FIN后,回复一个ACK报文,确认号为ack=u+1。服务器进入CLOSE_WAIT状态。客户端收到ACK后进入FIN_WAIT_2状态。
  3. 第三次挥手(FIN):服务器处理完剩余数据后,发送一个FIN报文,表示服务器也不再发送数据。服务器进入LAST_ACK状态。
  4. 第四次挥手(ACK):客户端收到服务器的FIN后,回复一个ACK报文,确认号为ack=w+1。客户端进入TIME_WAIT状态,等待2MSL(最大报文生存时间)后进入CLOSED状态。服务器收到ACK后立即进入CLOSED状态。
TCP四次挥手流程图 客户端(主动方) 服务器(被动方) ESTABLISHED ESTABLISHED ① FIN (seq=u) FIN_WAIT_1 ② ACK (ack=u+1) FIN_WAIT_2 CLOSE_WAIT ③ FIN (seq=w) LAST_ACK ④ ACK (ack=w+1) TIME_WAIT (2MSL) CLOSED CLOSED 四次挥手关键点 • 前两次挥手关闭客户端到服务器的数据通道(半关闭) • 后两次挥手关闭服务器到客户端的数据通道(完全关闭) • TIME_WAIT状态持续2MSL,确保最后一个ACK能被服务器收到
常见故障:大量TIME_WAIT状态连接通常出现在高并发短连接场景(如HTTP/1.0),会占用系统资源。可以通过调整内核参数(如tcp_tw_reuse、tcp_tw_recycle)或改用长连接来缓解。大量CLOSE_WAIT状态通常表示应用程序未正确关闭socket,需要检查代码逻辑。

4.3 端口号与Socket概念

端口号是传输层的重要概念,用于标识主机上的不同应用程序或服务。Socket则是IP地址与端口号的组合,是网络通信的端点。

4.3.1 端口号分类

端口范围 分类 说明 常见示例
0 - 1023 Well-Known Ports(知名端口) 由IANA分配,通常需要root/管理员权限才能使用 HTTP(80)、HTTPS(443)、SSH(22)、FTP(21)
1024 - 49151 Registered Ports(注册端口) 可由用户注册使用,通常用于特定应用 MySQL(3306)、Redis(6379)、Docker(2375)
49152 - 65535 Dynamic/Private Ports(动态/私有端口) 临时端口,通常由客户端操作系统自动分配 浏览器发起连接时使用的源端口

4.3.2 Socket概念

Socket(套接字)是应用层与传输层之间的抽象接口。一个完整的Socket由IP地址 + 端口号组成,用于唯一标识网络中的一个通信端点。

在TCP/IP通信中,一个连接由四元组唯一标识:

四元组:(源IP, 源端口, 目的IP, 目的端口)

例如,一个Web服务器可以同时处理多个客户端连接,每个连接的四元组都是唯一的:

  • 连接1: (192.168.1.10:54321, 93.184.216.34:80)
  • 连接2: (192.168.1.10:54322, 93.184.216.34:80)
  • 连接3: (192.168.1.20:49152, 93.184.216.34:80)
Socket与四元组概念图 客户端 IP: 192.168.1.10 Port: 54321 (临时) 服务器 IP: 93.184.216.34 Port: 80 (HTTP) TCP连接四元组 源IP: 192.168.1.10 源端口: 54321 目的IP: 93.184.216.34 目的端口: 80
故障排查提示:使用 netstat -an 或 ss -tan 命令可以查看当前系统的所有Socket连接状态。如果发现大量连接处于SYN_RCVD状态,可能是SYN Flood攻击;如果大量连接处于TIME_WAIT状态,需要优化应用的长连接策略。

4.4 UDP协议特点

UDP(User Datagram Protocol,用户数据报协议)是传输层的另一个重要协议,与TCP不同,它是一种无连接、不可靠的传输协议。

4.4.1 TCP与UDP对比

特性 TCP UDP
连接方式 面向连接(三次握手) 无连接
可靠性 可靠传输(确认、重传、排序) 不可靠(尽力而为)
数据边界 字节流,无边界 数据报,有边界
传输速度 较慢(头部开销大、确认机制) 较快(头部开销小、无确认)
头部大小 20-60字节 8字节
流量控制 支持(滑动窗口) 不支持
拥塞控制 支持 不支持
典型应用 HTTP、FTP、SSH、SMTP DNS、DHCP、VoIP、视频直播、游戏

4.4.2 UDP协议特点详解

  • 无连接:UDP在发送数据前不需要建立连接,直接发送数据报,减少了握手延迟。
  • 不可靠:UDP不保证数据报一定能到达目的地,也不保证数据报的顺序。如果数据报丢失或乱序,UDP不会通知发送方。
  • 数据报边界:UDP保留消息边界,每个send()调用对应一个数据报,接收方recv()调用返回的也是完整的数据报。
  • 低开销:UDP头部只有8字节(源端口、目的端口、长度、校验和),比TCP的20字节头部小得多。
  • 支持广播和多播:UDP天然支持一对多通信,而TCP只支持单播。
UDP数据报结构图 UDP数据报结构 源端口 (16位) 2字节 目的端口 (16位) 2字节 长度 (16位) 2字节 校验和 (16位) 2字节 数据部分(可变长度) UDP头部固定8字节,数据部分最大65507字节(受IP层限制)
故障排查提示:UDP通信故障排查比TCP更困难,因为没有握手和确认机制。常见问题包括:防火墙拦截UDP端口、MTU导致的分片丢失、NAT设备对UDP会话超时处理不当。排查时可以使用 tcpdump -i any udp port 53 抓取DNS查询报文,观察是否有响应。

4.5 本章小结

传输层是网络通信的枢纽,TCP和UDP各有适用场景。TCP通过三次握手建立可靠连接,通过四次挥手优雅断开,适合对数据完整性要求高的应用;UDP则以其低延迟、无连接的特性,在实时通信领域占据重要地位。端口号和Socket是定位网络服务的基础,熟练掌握这些概念对于网络故障排查至关重要。