4. 传输层核心协议:TCP三次握手与四次挥手、端口号与Socket概念、UDP协议特点
传输层位于OSI模型的第四层,是端到端通信的核心。它负责为上层应用提供可靠的或不可靠的数据传输服务。本章将深入剖析TCP协议的三次握手与四次挥手过程、端口号与Socket的概念,以及UDP协议的特点,这些都是网络故障排查中必须掌握的基础知识。
4.1 TCP三次握手:建立可靠连接
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。在数据传输开始前,通信双方必须通过“三次握手”建立一个虚拟连接,以确保双方都具备收发数据的能力。
三次握手的过程涉及三个关键标志位:SYN(同步序列号)、ACK(确认)和序列号(seq)。
4.1.1 三次握手详细流程
- 第一次握手(SYN):客户端向服务器发送一个SYN报文,其中包含客户端的初始序列号(seq=x)。此时客户端进入SYN_SENT状态。
- 第二次握手(SYN+ACK):服务器收到SYN报文后,如果同意建立连接,则回复一个SYN+ACK报文。该报文包含服务器的初始序列号(seq=y)和对客户端SYN的确认号(ack=x+1)。服务器进入SYN_RCVD状态。
- 第三次握手(ACK):客户端收到服务器的SYN+ACK后,回复一个ACK报文,其中包含对服务器SYN的确认号(ack=y+1)和客户端的下一个序列号(seq=x+1)。客户端进入ESTABLISHED状态。服务器收到此ACK后,也进入ESTABLISHED状态,连接建立完成。
4.2 TCP四次挥手:优雅断开连接
当数据传输完成后,通信双方需要通过“四次挥手”来终止连接。TCP连接是全双工的,因此断开连接时需要双方各自关闭自己的数据通道。
四次挥手涉及的关键标志位包括:FIN(结束)、ACK(确认)。
4.2.1 四次挥手详细流程
- 第一次挥手(FIN):主动关闭方(假设为客户端)发送一个FIN报文,表示客户端不再发送数据,但可以继续接收数据。客户端进入FIN_WAIT_1状态。
- 第二次挥手(ACK):被动关闭方(服务器)收到FIN后,回复一个ACK报文,确认号为ack=u+1。服务器进入CLOSE_WAIT状态。客户端收到ACK后进入FIN_WAIT_2状态。
- 第三次挥手(FIN):服务器处理完剩余数据后,发送一个FIN报文,表示服务器也不再发送数据。服务器进入LAST_ACK状态。
- 第四次挥手(ACK):客户端收到服务器的FIN后,回复一个ACK报文,确认号为ack=w+1。客户端进入TIME_WAIT状态,等待2MSL(最大报文生存时间)后进入CLOSED状态。服务器收到ACK后立即进入CLOSED状态。
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通信中,一个连接由四元组唯一标识:
例如,一个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)
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只支持单播。
tcpdump -i any udp port 53 抓取DNS查询报文,观察是否有响应。
4.5 本章小结
传输层是网络通信的枢纽,TCP和UDP各有适用场景。TCP通过三次握手建立可靠连接,通过四次挥手优雅断开,适合对数据完整性要求高的应用;UDP则以其低延迟、无连接的特性,在实时通信领域占据重要地位。端口号和Socket是定位网络服务的基础,熟练掌握这些概念对于网络故障排查至关重要。