本文首发微信公众号:前端徐徐。
核心概念
TCP
TCP(Transport Control Protocol)即传输控制协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。
UDP
UDP(User Datagram Protocol)即用户数据报协议:是一个简单的面向资料包的通信协议,位于 OSI 模型的传输层。该协议由 David P. Reed 在 1980 年设计且在 RFC 768 中被规范。
连接性和握手
TCP
连接性:
- TCP 是面向连接的协议,通信前需要建立连接,通信结束后需要断开连接。
- 连接建立和断开过程比较复杂,涉及到三次握手和四次挥手。
握手过程:
- 三次握手:
- 客户端发送一个带有 SYN(同步)标志的数据包,请求建立连接。
- 服务器收到后,回复一个带有 SYN 和 ACK(确认)标志的数据包,表示已收到请求并同意建立连接。
- 客户端再次回复一个带有 ACK 标志的数据包,确认服务器的回复。连接建立。
- 四次挥手:
- 客户端发送一个带有 FIN(结束)标志的数据包,表示不再发送数据。
- 服务器收到后,回复一个带有 ACK 标志的数据包,确认客户端的 FIN。
- 服务器发送一个带有 FIN 标志的数据包,表示不再发送数据。
- 客户端收到后,发送一个带有 ACK 标志的数据包,确认服务器的 FIN。连接断开。
UDP
连接性:
- UDP 是无连接的协议,通信前不需要建立连接,通信结束后也不需要断开连接。
握手过程:
- 由于 UDP 是无连接的,因此没有握手过程。发送方可以直接将数据报文发送给接收方,而不需要进行连接建立操作。
- 接收方收到数据后,也不会发送确认回复。
数据传输和可靠性
TCP
数据传输:
- 数据被划分为数据段,每个数据段包含序号和确认号信息,用于保证数据的有序性和可靠性。
- 发送方按照序号发送数据段,接收方根据序号进行数据重组,确保数据有序。
- 数据被拆分成数据段后,TCP 头部会包含序号、确认号、窗口大小等字段。
可靠性:
- TCP 提供可靠的数据传输,通过序号、确认和重传机制保证数据的可靠性。
- 如果数据段丢失、损坏或乱序,TCP 会自动触发重传机制,确保数据的完整性和顺序性。
- 接收方会发送确认来告知发送方数据已经接收。
UDP
数据传输:
- 数据被划分为数据报文(Datagrams),每个数据报文是一个完整的、独立的数据单元。
- 数据报文之间相互独立,没有序号和确认机制,因此不保证数据的有序性。
可靠性:
- UDP 不提供可靠性保证,不会自动进行数据重传。
- 如果数据报文丢失或损坏,接收方不会自动请求发送方重发数据。
- 应用层需要自行处理数据的确认和重传,如果需要。
延迟和效率
TCP
延迟:
- TCP 通常会引入较高的延迟,因为它需要进行握手、确认、重传等机制,以保证数据的可靠性和有序性。
- 三次握手和四次挥手过程以及拥塞控制机制等,都可能导致数据传输的延迟增加。
效率:
- TCP 在保证可靠性和有序性的同时,会引入一些额外的开销,如序号、确认、窗口大小等字段,以及握手和挥手的数据交换。
- 流量控制和拥塞控制机制也会影响数据发送的速率,可能降低效率。
UDP
延迟:
- UDP 通常具有较低的延迟,因为它没有复杂的连接建立和断开过程,也没有确认和重传机制。
- 数据可以直接发送,减少了额外的等待时间。
效率:
- UDP 具有较高的效率,因为它没有确认、重传、流量控制和拥塞控制机制。
- 数据可以更快速地发送,适用于对实时性要求较高的应用。
应用场景
TCP
- 网页浏览:TCP 适用于网页浏览,因为它能够保证数据的可靠性和有序性。在浏览网页时,确保页面的各个元素按正确顺序加载很重要。
- 文件传输:TCP 适用于大文件的传输,如文件下载和上传。它的可靠性保证了文件的完整性,重传机制保证了数据不会丢失。
- 电子邮件:由于电子邮件的内容往往很重要,需要确保数据的可靠性和有序性。因此,TCP 在电子邮件的传输中得到广泛应用。
- 数据库交互:数据库交互需要可靠性,确保查询和更新操作按顺序执行。TCP 提供了保证数据完整性的机制。
- 远程登录: 在远程登录和管理系统时,确保命令的顺序和完整性是关键的。TCP 适用于这种场景。
UDP
- 实时音视频传输:UDP 适用于实时音视频传输,如在线视频会议、音频通话和实时直播。在这些应用中,实时性和低延迟更为重要,而丢失少量数据是可以接受的。
- 在线游戏:在线游戏需要快速的数据传输和实时性,UDP 适合用于传输游戏数据。游戏中的数据包传输速度比可靠性更重要。
- DNS:DNS(Domain Name System)解析域名时通常使用UDP。虽然DNS查询也可以使用TCP,但大多数情况下使用UDP以减少延迟。
- 物联网设备:物联网设备通常需要快速的数据传输和实时性,而且可以容忍一些数据丢失。因此,UDP 适用于与物联网设备通信。
- SNMP:简单网络管理协议(SNMP)用于网络设备的管理和监控。UDP 在这种情况下用于传输SNMP消息。
头部开销
TCP
- TCP 头部包含以下字段:
- 源端口号(16位)
- 目标端口号(16位)
- 序号(32位)
- 确认号(32位)
- 数据偏移(4位)
- 保留位(6位)
- 控制标志位(6位)
- 窗口大小(16位)
- 校验和(16位)
- 紧急指针(16位)
- 选项(可变长度)
- 填充(可变长度)
- TCP 头部总长度不固定,最少为20字节,最多为60字节(当选项和填充都存在时)。
TCP 头部开销相对较大,因为它包含了多个字段,如序号、确认号、窗口大小等,以保证数据的可靠性和有序性。此外,TCP 还支持选项和填充字段,使头部长度变化。
UDP
- UDP 头部包含以下字段:
- 源端口号(16位)
- 目标端口号(16位)
- 长度(16位)
- 校验和(16位)
- UDP 头部固定长度为8字节。
UDP 头部开销较小,仅包含基本的源端口、目标端口、长度和校验和字段。它没有连接建立、确认和重传机制,因此头部较为简单。