TCP和UDP是两种最为著名的传输层协议,二者都使用IP作为网络层协议。
传输控制协议(TCP,TransmissionControl Protocol)
尽管TCP和UDP都使用相同的网络层(IP),TCP 却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
TCP: 传输控制协议,面向连接的协议
面向连接意味着两个使用 TCP 的应用(通常是一个客户和一个服务器)彼此交换数据之前必须先建立一个TCP连接,一对一传输。
三次握手(建立连接)
就像两个人打电话前确认对方是否在线:
1.客户端 → 服务器:发送 SYN
(同步请求)包,告诉服务器「我想和你建立连接」,附带一个随机初始序列号(比如 seq=x
)。
2.服务器 → 客户端:返回 SYN+ACK
包,表示「我同意连接」,同时发送自己的序列号(seq=y
),并确认客户端的序列号(ack=x+1
)。
3.客户端 → 服务器:发送 ACK
包,确认服务器的序列号(ack=y+1
),表示「我收到你的确认了」。
结果:双方确认彼此的接收能力,连接建立完成(状态为 ESTABLISHED
)。
四次挥手(断开连接)
就像通话结束后双方确认挂断:
1.客户端 → 服务器:发送 FIN
(结束请求)包,告诉服务器「我数据发完了,准备断开」,状态变为 FIN_WAIT_1
。
2.服务器 → 客户端:返回 ACK
包,确认收到 FIN
,状态变为 CLOSE_WAIT
,继续处理未发送完的数据。
3.服务器 → 客户端:数据处理完毕后,发送 FIN
包,告诉客户端「我也准备断开了」,状态变为 LAST_ACK
。
4.客户端 → 服务器:返回 ACK
包,确认服务器的 FIN
,状态变为 TIME_WAIT
,等待一段时间(确保服务器收到 ACK
)后彻底关闭连接。
关键区别
- 三次握手:服务器可以在第二步同时发送
SYN
和ACK
,因为此时服务器已确认客户端的请求。 - 四次挥手:服务器需要分两次发送
ACK
和FIN
,因为可能需要先处理完数据再断开。
为什么需要这些步骤?
- 可靠性:通过确认机制确保双方都能正确接收和发送数据。
- 避免资源浪费:防止旧连接的重复请求占用资源(如网络延迟导致的过时
SYN
包)。
TCP包头
以下是对 TCP 包头的详细解释:
TCP 包头结构(固定部分)
TCP 包头通常包含 20 字节的固定部分(不含可选字段),各字段功能如下:
字段名 | 位数 | 说明 |
---|---|---|
源端口 | 16 | 发送方端口号(标识应用程序) |
目的端口 | 16 | 接收方端口号(标识目标应用程序) |
序列号 | 32 | 数据段的第一个字节序号(用于保证数据按顺序传输) |
确认号 | 32 | 期望接收的下一个字节序号(用于确认对方数据已接收) |
数据偏移 | 4 | 包头长度(以 4 字节为单位,最小值 5 → 20 字节,最大值 15 → 60 字节) |
保留 | 6 | 保留位,通常为 0 |
控制位 | 6 | 6 个标志位,用于控制连接状态和数据传输: - URG:紧急指针有效 - ACK:确认号有效 - PSH:立即推送数据 - RST:重置连接 - SYN:同步序列号(建立连接) - FIN:结束连接(断开连接) |
窗口大小 | 16 | 接收方的接收窗口大小(流量控制,单位:字节) |
校验码 | 16 | 对包头和数据进行校验,确保数据完整性 |
紧急指针 | 16 | 紧急数据的末尾位置(URG 标志有效时使用) |
关键字段详解
1.序列号(Sequence Number)
- 用于标记 TCP 数据段的顺序,确保接收方按序重组数据。
- 示例:若序列号为
x
,数据段长度为 100 字节,则下一个数据段的序列号应为x+100
。
2.确认号(Acknowledgment Number)
- 表示接收方期望收到的下一个字节序号。
- 示例:若确认号为
y
,表示接收方已成功接收序号y-1
之前的所有数据。
3.控制位(Flags)
- SYN:同步序列号(三次握手第一步和第二步使用)。
- ACK:确认号有效(除了第一个 SYN 包,其他包必须设置 ACK=1)。
- FIN:断开连接请求(四次挥手第一步和第三步使用)。
- RST:强制重置连接(用于异常情况,如端口不可达)。
4.窗口大小(Window Size)
- 接收方告知发送方自己当前的可用缓冲区大小,用于流量控制。
- 示例:若窗口大小为 5000,表示发送方最多可发送 5000 字节未确认的数据。
可选字段(Options)
- 最大段大小(MSS):协商双方能接收的最大数据段长度。
- 时间戳(Timestamp):用于计算往返时间(RTT),优化性能。
- 窗口扩大因子:扩展窗口大小(当 16 位窗口字段不够用时)。
TCP 包头的作用
1.建立连接:通过 SYN、ACK 标志位完成三次握手。
2.数据传输:序列号和确认号确保数据按序、可靠传输。
3.流量控制:窗口大小限制发送速率,避免接收方缓冲区溢出。
4.断开连接:通过 FIN 标志位完成四次挥手。
常见问题
- 为什么控制位需要分两次挥手?
因为服务器可能需要先处理完剩余数据,再发送 FIN。 - 校验码的作用是什么?
检测数据在传输过程中是否损坏,若损坏则丢弃并请求重传。
UDP协议
UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP提供了无连接通信,适合于一次传输少量数据,UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
可以一对一、一对多传输、多对一和多对多的交互通信
UDP(用户数据报协议)是一种轻量级、无连接的传输层协议,其包头结构比TCP简单得多。
以下是对UDP包头的详细解释:
UDP 包头结构(固定8字节)
UDP 包头仅包含 8字节的固定部分,各字段功能如下:
字段名 | 位数 | 说明 |
---|---|---|
源端口 | 16 | 发送方端口号(可选,全零表示无明确端口) |
目的端口 | 16 | 接收方端口号(标识目标应用程序) |
长度 | 16 | UDP 数据报总长度(包括包头和数据,最小值 8 字节,最大值 65535 字节) |
校验码 | 16 | 可选字段,用于校验数据完整性(可设置为全零表示不校验) |
关键字段详解
1.源端口(Source Port)
- 发送方应用程序的端口号,用于接收方回传数据。
- 示例:若发送方未指定端口,可能使用动态端口(如 50000+)。
2.目的端口(Destination Port)
- 接收方应用程序的端口号,用于识别目标服务。
- 示例:DNS 默认使用 53 端口,DHCP 使用 67/68 端口。
3.长度(Length)
- UDP 数据报的总字节数(包头 + 数据)。
- 最小值:8 字节(仅包头,无数据)。
- 最大值:65535 字节(受 IP 层 MTU 限制,通常实际数据小于 1500 字节)。
4.校验码(Checksum)
- 对包头、数据码伪首部(包含 IP 地址等信息)进行校验。
- 可选性:某些场景下可跳过校验以提高速度(如局域网视频流)。
UDP 包头的特点
1.轻量级
- 仅 8 字节固定开销,适合需要快速传输的场景(如实时音视频)。
2.无连接
- 无需三次握手,直接发送数据,延迟低。
3.不可靠
- 不保证数据到达、顺序或完整性(无重传、确认机制)。
4.无流量控制
- 发送方不会根据接收方状态调整速率,可能导致数据丢失。
UDP 与 TCP 的对比
特性 | UDP | TCP |
---|---|---|
连接 | 无连接(尽力而为) | 面向连接(可靠传输) |
包头大小 | 8 字节 | 20-60 字节(含选项) |
可靠性 | 不可靠(无重传/确认) | 可靠(序列号、ACK、超时重传) |
流量控制 | 无 | 有(窗口大小) |
适用场景 | DNS、视频流、实时游戏 | HTTP、邮件、文件传输 |
为什么 UDP 包头如此简单?
- 效率优先:减少协议开销,适合对延迟敏感的应用(如直播、在线游戏)。
- 按需设计:某些场景不需要可靠性(如 DNS 查询只需单次请求)。
常见问题
-
UDP 校验码必须启用吗?
否。校验码可选,但建议启用以检测传输错误。 -
UDP 如何处理丢包?
不处理,由应用层自行实现重传逻辑(如游戏中的心跳包)。
TCP与UDP区别:
1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付,Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3.UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5.TCP对系统资源要求较多,UDP对系统资源要求较少。