简单介绍UDP
试想一下,UDP就像是数字世界里的那位自由奔放的冲浪者,他驾着数据包的"浪板",一头扎进互联网的浩瀚海洋,追逐着速度与激情的梦。他不拘泥于规则,也不在意每一次跳跃是否会被完美捕捉------毕竟,他是那个敢于冒险、享受过程的探险家。UDP的口号是:"我传递,我自由!"他特别擅长那些对实时性要求极高的场合,比如视频会议上的欢声笑语、在线游戏中的紧张刺激,还有那场你期待已久的现场直播。在这些时刻,UDP就是那位让欢乐无缝衔接、让心跳同步加速的幕后英雄。
UDP (User Datagram Protocol) 是一种无连接的传输层协议,主要用于需要低延迟而可以容忍数据丢失的场合。它不提供数据包的顺序传递或重传机制,这意味着UDP数据包可能会丢失、重复或乱序到达。由于UDP在发送数据前不需要建立连接,因此它的开销较低,处理速度快,非常适合实时应用,如语音和视频通信、在线游戏和多播/广播服务。
扩展 :我们可以通过创建socket套接字的方式来选择UDP和TCP。标红的地方如果是
SOCK_STREAM
,就是使用字节流传输数据,指的是TCP协议;如果是SOCK_DGRAM
,就是使用数据报传输数据,指的是UDP协议。返回的fd
是指socket句柄,可以理解为socket的身份证号。
TCP为什么慢
TCP (Transmission Control Protocol) 是一种面向连接 的、可靠的 、基于字节流的传输层通信协议。TCP在传输数据之前需要建立一个连接(三次握手),并确保数据按序、无误地送达。为了实现这些功能,TCP使用了以下机制:
- 重传机制:序列号(sequence)和确认应答(ACK)来保证数据的有序和完整传输。如果长时间等不到接受方的确认,TCP就会重新发一次消息,这就是所谓的重传机制。重传本身对性能影响是比较严重的。
- 流量控制机制(如滑动窗口) :来防止发送方过快地发送数据导致接收方无法处理。TCP根据窗口的大小去控制自己发送的数据量,这样能大大减少丢包的概率。流量控制针对的是单个连接数据处理能力的控制。
- 拥塞控制 :即使是最宽敞的道路也会因为车流过多而发生拥堵。于是,TCP运用拥塞控制,监控着整条网络高速公路的车流量,适时调整发送速率,避免出现"大堵车"。这就好比在高峰期自动调节红绿灯的时长,确保车辆能够顺畅通行,避免不必要的等待。拥塞控制针对的是整个网络环境数据处理能力的控制。
这些额外的功能使得TCP在某些方面比UDP"慢",因为它们增加了额外的处理和等待时间。
扩展 :分段重传和数据报乱序
分段重传 :TCP协议在发送数据时,会将数据分割成多个较小的分段 ,每个分段都有一个序列号。当TCP发送一个分段后,它会启动一个重传计时器。如果在这个计时器到期之前没有收到确认(ACK),TCP将认为该分段可能在传输过程中丢失,从而触发重传机制。重传的分段将再次被发送,直到接收到确认为止。
数据报乱序处理 :数据报乱序是指数据分段没有按照发送顺序到达接收方的现象。这通常发生在网络中,因为不同的数据分段可能通过不同的路径或经历不同的延迟。
被误解的UDP
虽然UDP通常被认为比TCP"快",但这并不意味着它在所有情况下都是最佳选择。UDP的"快速"特性来源于它对可靠性和顺序的放弃,这在需要实时交互且能容忍少量数据丢失的场景下非常有用。然而,在需要高可靠性和数据完整性的应用中,UDP的这些特点反而成为劣势。此外,UDP的"快速"也并非绝对,网络条件差时,UDP的数据包丢失率可能非常高,影响整体性能。
有时候用UDP却更慢
- 当网络环境不稳定,数据包丢失严重时,UDP的不可靠性会导致应用程序频繁请求重传,从而增加延迟。
- 在传输很大的数据包时,TCP内部会根据MSS的大小分段,进入到IP层后,每个包大小不超过MTU ,因此IP层不会再进行分片,这时候如果发生丢包了,只需要重传每个MSS分段就够了;但对于UDP本身并不会分段,如果数据过大,到了IP层就会进行分片,此时发生丢包的话,再次重传就会重传整个大数据包。这种情况,UDP就比TCP要慢,对于早期基于UDP的NFS协议就有这个问题。
扩展:MSS(Maximum Segment Size) 和 MTU(Maximum Transmission Unit)
是网络通信中两个重要的概念,它们分别在TCP和链路层起作用,用于限制数据包的大小,确保数据在网络中有效和高效地传输。
MSS - Maximum Segment Size
MSS是指在TCP层上,一个TCP数据段(segment)所能携带的最大数据量(不包括头部)。换句话说,MSS是你在一个TCP数据包中可以发送的最大有效载荷。MSS的值是由TCP连接两端协商确定的,目的是为了优化数据传输效率。如果MSS设置得太大,可能会导致数据包在经过网络中的某些设备时被分片,而分片会增加网络延迟和可能的数据包丢失风险。如果设置得太小,则会增加网络的开销,因为每个数据包的头部信息所占比例会变大。
MTU - Maximum Transmission Unit
MTU是指在链路层上,一个数据帧(frame)所能承载的最大数据量(同样不包括头部)。它定义了在特定网络接口上,不经分片就可以传输的最大数据单元大小。MTU的值取决于具体的网络技术和硬件配置。例如,以太网的MTU通常是1500字节。如果一个数据包的大小超过了MTU,它将被分片,每个分片作为一个独立的数据帧传输。分片可以增加网络的复杂性,因为接收方必须重新组装这些分片才能还原原始数据。
小结
在网络的广阔天地中,UDP与TCP犹如两位性格迥异的侠客,各自驰骋于数据传输的江湖,书写着属于自己的传奇。UDP,那位身手敏捷、崇尚自由的游侠,他穿梭于网络的每一个角落,不受束缚,不拘小节,仿佛一阵清风,来去无踪。他以最快的速度 传递着信息,无论是战场上的实时战报,还是赛场上激动人心的直播,UDP总能第一时间将这份热乎乎的资讯送达你的屏幕前。他不计较每一滴水珠的流失,因为他明白,在这场与时间的赛跑中,速度才是王道。
而TCP,那位沉稳持重、恪守规矩的将军,他指挥着数据的千军万马,每一步都力求精准无误。他建立连接,确认每一次信息的传递,宛如一位严谨的图书管理员,确保每一本书都能按序号归位。在TCP的世界里,没有遗漏,没有错乱 ,只有井然有序的数据流,从一端到另一端,跨越千山万水,却依然保持着那份最初的完整。他深知,有些时候,质量远胜于速度,特别是在那些需要高度可靠性和数据完整性的场合,TCP就是那份坚实的依靠。
但话说回来,UDP与TCP,这对网络世界的双雄,真的能以快慢论英雄吗?其实不然。在不同的应用场景下,他们各有千秋,各领风骚。UDP的"快"源于他对自由的向往,而TCP的"慢"则是对细节的执着。正所谓,"快"与"慢"皆是相对的,没有绝对的优劣,只有最适合的场景。在实时通信的战场上,UDP的"快"是制胜的关键;而在文件传输的领域,TCP的"稳"则成了不二之选。
所以,下一次当你面临选择UDP还是TCP的决策时,不妨想想你的应用需求,是渴望那份速度与激情,还是追求那份稳健与安全。无论是UDP的自由奔放,还是TCP的严谨可靠,他们都以各自独特的方式,诠释着网络世界的无限魅力。在这个数据交织的宇宙中,UDP与TCP,就像两颗璀璨的星辰,照亮着网络通信的星空,让我们的数字生活更加丰富多彩。