TCP和UDP有什么区别?
我知道 TCP 用于非时间要求严格的应用程序,而 UDP 用于需要快速传输数据的游戏或应用程序。我知道 TCP 用于 HTTP、HTTPS、FTP、SMTP 和 Telnet。我知道 UDP 用于 DNS 和 DHCP。
但为什么? TCP 和 UDP 的哪些特性使其对各自的用例有用?
TCP
是 IP 网络上面向连接的流。它保证所有发送的数据包都以正确的顺序到达目的地。这意味着使用发送回发送者的确认包和自动重传,导致额外的延迟和一般比UDP
低效率的传输。
UDP
是一种无连接协议。通信是以数据报为导向的。仅在单个数据报上保证完整性。数据报到达目的地并且可能乱序到达或根本不到达。它比 TCP
更有效,因为它使用非 ACK。它通常用于实时通信,在这种情况下,丢包率的一小部分比 TCP
连接的开销更可取。
在某些情况下使用 UDP
,因为它允许广播数据包传输。这有时在像 DHCP
协议这样的情况下是基本的,因为客户端机器还没有收到 IP
地址(这是 DHCP
协商协议的目的)并且没有任何方法可以建立 {5 } 流本身没有 IP
地址。
TCP(传输控制协议)是 Internet 上最常用的协议。这是因为 TCP 提供了纠错功能。当使用 TCP 协议时,存在“保证交付”。这在很大程度上是由于一种称为“流量控制”的方法。流量控制确定何时需要重新发送数据,并停止数据流,直到成功传输先前的数据包。这是有效的,因为如果发送数据包,可能会发生冲突。发生这种情况时,客户端会从服务器重新请求数据包,直到整个数据包完成并且与原始数据包相同。 UDP(User Datagram Protocol)是Internet上另一个常用的协议。但是,UDP从不用于发送网页、数据库信息等重要数据; UDP 通常用于流式传输音频和视频。 Windows Media 音频文件 (.WMA)、Real Player (.RM) 等流媒体使用 UDP,因为它提供速度! UDP 比 TCP 快的原因是没有任何形式的流量控制或纠错。通过 Internet 发送的数据会受到冲突的影响,并且会出现错误。请记住,UDP 只关心速度。这是流媒体质量不高的主要原因。
2) TCP 需要在网络接口级别进行更多处理,而在 UDP 中则不需要。
3) TCP 使用 3 次握手、拥塞控制、流量控制等机制来保证可靠传输。
4) UDP 多用于包延迟比丢包更严重的情况。
is the most commonly used protocol on the Internet
语句是有争议的,并且实际上取决于您如何定义 most commonly used
、protocol
和 the Internet
。例如,互联网协议更有可能成为该王冠的竞争者。
将 TCP 视为两个地点之间专门安排的 UPS/FedEx 取件/投递包裹,而 UDP 相当于将明信片扔进邮箱。
UPS/FedEx 将竭尽全力确保您邮寄的包裹能及时送达。有了明信片,如果它真的到达了,你就很幸运了,它可能会出现乱序或迟到(你有多少次从某人那里得到一张明信片?)
TCP 尽可能接近有保证的交付协议,而 UDP 只是“尽力而为”。
UDP 用于 DNS 和 DHCP 的原因:
DNS - TCP 需要来自服务器(侦听连接)的资源多于来自客户端的资源。特别是,当 TCP 连接关闭时,服务器需要在称为 TIME_WAIT_2 的状态期间记住连接的详细信息(将它们保存在内存中)两分钟。这是一项防止来自先前连接的错误重复数据包被解释为当前连接的一部分的功能。维护 TIME_WAIT_2 会耗尽服务器上的内核内存。 DNS 请求很小,并且经常来自许多不同的客户端。与客户端相比,这种使用模式加剧了服务器上的负载。人们相信,使用在客户端或服务器上都没有连接也没有需要维护的状态的 UDP 可以改善这个问题。
DHCP - DHCP 是 BOOTP 的扩展。 BOOTP 是客户端计算机在客户端启动时用于从服务器获取配置信息的协议。为了定位服务器,会发送一个广播请求 BOOTP(或 DHCP)服务器。广播只能通过无连接协议(例如 UDP)发送。因此,BOOTP 至少需要一个 UDP 数据包,用于服务器定位广播。此外,因为 BOOTP 在客户端...启动时正在运行,而这是客户端可能没有加载并运行其整个 TCP/IP 堆栈的时间段,UDP 可能是客户端准备处理的唯一协议时间。最后,一些 DHCP/BOOTP 客户端只有 UDP。例如,某些 IP 恒温器仅实现 UDP。原因是它们是用非常小的处理器和小内存构建的,以至于无法执行 TCP——但它们在启动时仍然需要获取 IP 地址。
正如其他人所提到的,UDP 也可用于流媒体,尤其是音频。如果您只是丢弃延迟的数据包,则在网络延迟下对话听起来会更好。您可以使用 UDP 来做到这一点,但使用 TCP,您在延迟期间得到的只是一个暂停,然后是音频,该音频总是会延迟与已经暂停一样多的时间。对于双向电话式对话,这是不可接受的。
差异之一是简而言之
UDP:发送消息,到达目的地不回头,无连接协议 TCP:发送消息并保证到达目的地,面向连接的协议
TCP 在实际数据传输发生之前建立连接,而 UDP 没有。这样,UDP 可以提供更快的传递。因此,DNS、时间服务器访问等应用程序使用 UDP。
与 UDP 不同,TCP 使用拥塞控制。它响应网络负载。与 UDP 不同,当网络拥塞迫在眉睫时,它会减慢速度。因此,喜欢恒定吞吐量的多媒体等应用程序可能会选择 UDP。
此外,UDP 是不可靠的,它不会对数据包丢失做出反应。因此,多媒体传输等对丢失敏感的应用程序更喜欢 UDP。但是,TCP 是一种可靠的协议,因此需要可靠性的应用程序(例如 Web 传输、电子邮件、文件下载)更喜欢 TCP。
此外,在今天的互联网中,由于中间框,UDP 不如 TCP 受欢迎。当假设 UDP 连接被阻止时,某些应用程序(如 Skype)会落入 TCP。
跑进这个线程,让我试着用这种方式表达。
TCP
3 次握手
Bob:嘿,Amy,我想告诉你一个秘密 Amy:好的,继续,我准备好了 Bob:好的
通讯 Bob:'I',这是第一封信 Amy:收到第一封信,请发给我第二封信 Bob:' ',这是第二封信 Amy:收到第二封信,请给我发第三封信 Bob:'L ',这是第三封信 过了一会儿 Bob:'L',这是第三封信 Amy:收到第三封信,请把第四封信发给我 Bob:'O',这是第四封信 Amy:…… ...
4 次握手 Bob:我的秘密暴露了,现在,你知道我的心了。艾米:好的。我无话可说了。鲍勃:好的。
UDP
Bob: I LOVE U Amy 收到:OVI LE
TCP 比 UDP 更可靠,保证了均匀的消息顺序,这就是为什么 UDP 更轻量级和更高效的原因。
Tcp 和 Udp 协议之间的简短区别:
1) Tcp - 传输控制协议和 Udp - 用户数据报协议。
2) Tcp 是可靠协议,而 Udp 是不可靠协议。
3) Tcp 是面向流的,而 Udp 是面向消息的协议。
4) Tcp 比 Udp 慢。
这句话是一个 UDP 玩笑,但我不确定你会明白。下面的对话是一个 TCP/IP 玩笑:
A: Do you want to hear a TCP/IP joke?
B: Yes, I want to hear a TCP/IP joke.
A: Ok, are you ready to hear a TCP/IP joke?
B: Yes, I'm ready to hear a TCP/IP joke.
A: Well, here is the TCP/IP joke.
A: Did you receive a TCP/IP joke?
B: Yes, I **did** receive a TCP/IP joke.
TCP 和 UDP 是传输层协议,是 OSI(开放系统互连模型)中的第 4 层协议。主要区别以及优缺点如下。 TCP
优点:
致谢
保证交货
基于连接
订购的数据包
拥塞控制
缺点:
更大的数据包
更多带宽
慢点
有状态的
消耗内存
UDP
优点:
数据包更小
消耗更少的带宽
快点
无状态
缺点:
没有确认
没有保证交付
无连接
没有拥塞控制
无订单包
TLDR;
TCP - 面向流,需要连接,可靠,慢
UDP - 面向消息的、无连接的、不可靠的、快速的
在我们开始之前,请记住,某事物的所有缺点都是其优点的延续。工作只有正确的工具,没有灵丹妙药。 TCP/UDP 共存了几十年,这是有原因的。
TCP
它被设计为非常可靠,并且它的工作非常好。它之所以如此复杂,是因为它完成了一项艰巨的任务:通过不可靠的 IP 协议提供可靠的传输。
由于所有 TCP 的复杂逻辑都封装在网络堆栈中,因此您无需在应用层做大量费力且容易出错的低级工作。
当您通过 TCP 发送数据时,您将字节流写入发送方的套接字,在那里它被分解为数据包,向下传递堆栈并通过线路发送。在接收端,数据包再次重新组合成连续的字节流。
维护这种良好的抽象在复杂性和性能方面是有代价的。如果字节流中的第一个数据包丢失,接收方将延迟处理后续数据包,即使这些数据包已经到达(所谓的“行头阻塞”)。
另外,为了可靠,TCP实现了这个:
TCP 需要已建立的连接,这需要 3 次往返(“臭名昭著”的 3 次握手)
TCP 有一个称为“慢启动”的功能,它在建立连接后逐渐提高传输速率以允许接收器跟上数据速率
每个发送的数据包都必须得到确认,否则发送者将停止发送更多数据
不断地不断地......
所有这些在缓慢不可靠的无线网络中更加严重,因为 TCP 是为有线网络设计的,在这种网络中延迟是可预测的,并且丢包并不常见。此外,就像许多人已经提到的那样,对于某些事情,TCP 根本不起作用(DHCP)。但是,在相关的情况下,TCP 的工作仍然非常出色。
使用邮件类比 TCP 会话类似于向您的秘书讲故事,秘书将其分解成邮件并通过蹩脚的邮件服务发送给出版商。在另一边,另一位秘书将邮件组合成一条文本。有些邮件会丢失,有些会损坏,因此需要非常复杂的程序才能可靠地传递,而您的 10 页故事可能需要很长时间才能到达您的出版商。
UDP
另一方面,UDP 是面向消息的,因此接收方将消息(数据包)写入套接字,然后按原样传输到接收方,而无需在传输层进行任何拆分/组装。
与 TCP 相比,它的规范非常简单。本质上,它为您所做的只是向数据包添加校验和,以便接收器可以检测到它的损坏。其他一切都必须由您,一个软件开发人员来实现。现在阅读大量的 TCP 规范并尝试考虑重新实现它的一小部分。
有些人这样做并得到了非常不错的结果,以至于 HTTP/3 使用了 QUIC——一种基于 UDP 的协议。然而,这更像是一个例外。 UDP 的常见应用是音频/视频流和会议应用,如 Skype、Zoom 或 Google Hangout,与 TCP 引入的延迟相比,丢失数据包并不那么重要。
类比简单说明
TCP是这样的。
想象一下,你在火星上有一个笔友(在互联网出现之前的美好时光,我们通过书面信件进行交流)。
您需要向您的笔友发送高效能人士的七个习惯。所以你决定用七个单独的字母发送它:
第 1 封信 - 积极主动 第 2 封信 - 以终为始......
等等
等等……第 7 封信 - 磨刀
要求:
您想确保您的笔友按顺序收到您的所有信件,并且它们完美送达。如果您的 pen pay 在字母 1 之前收到字母 7,那就不好了。如果您的笔友收到除字母 3 之外的所有字母 - 那也不好。
以下是我们如何确保满足我们的要求:
确认信:所以你的笔友会发送一封确认信说“我收到了第 1 封信”。这样你就知道你的笔友已经收到了。如果一封信没有到达,或者到达的顺序不正确,那么你必须停下来,然后回去重新发送那封信,以及所有后续的信件。
流量控制:大约在圣诞节的时候,你知道你的笔友会收到很多邮件,所以你放慢了速度,因为你不想压倒你的笔友。 (您的笔友会不断向您发送有关笔友邮箱中未读邮件数量的更新 - 如果您的笔友说收件箱因为太满而即将爆炸,那么您会放慢发送信件的速度 - 因为您的笔友将无法阅读它们。
完美的到来。有时,当您通过邮件发送信件时,它可能会被撕裂,或者蜗牛可以吃掉一半。你怎么知道你所有的信都完好无损地送达了?好吧,您的笔友会给您一个机制,您可以通过该机制检查他们是否收到了完整的信件,并且这正是您发送的信件。 (例如通过字数统计等)。一个基本的类比。