TCP和UDP的区别?
Posted
技术标签:
【中文标题】TCP和UDP的区别?【英文标题】:Difference between TCP and UDP? 【发布时间】:2011-08-23 15:29:21 【问题描述】:TCP和UDP有什么区别?
我知道 TCP 用于非时间关键的应用程序,而 UDP 用于需要快速传输数据的游戏或应用程序。我知道 TCP 用于 HTTP、HTTPS、FTP、SMTP 和 Telnet。我知道 UDP 用于 DNS 和 DHCP。
但是为什么呢? TCP 和 UDP 的哪些特性使其对各自的用例有用?
【问题讨论】:
而这个 (skullbox.net/tcpudp.php)——这是谷歌的第一个热门——还不够清楚吗?有什么令人困惑的地方?也许这更好? tcpipguide.com/free/… 我真的很好奇为什么这个问题(在撰写本文时)得到了 3 次赞成。第一句话甚至没有意义,如果搜索的话,有很多关于这个主题的材料。 @MattH: 1) 这是一个很好的问题,如果相当广泛并且重复已经得到很好的回答。 2)你有足够的声誉来纠正第一句话中的错字。 3) 与此相关的信息存在于其他地方是无关紧要的。 Stack Overflow 旨在成为知识库,并在此处规范地回答问题。 有趣的是,几乎没有人提到 DHCP 使用广播,但每个人都认为“答案”是关于传送和重传的保证。 仅供以后阅读本文的任何人参考,上面提到的 Skullbox 网站根据 Google 的说法存在恶意软件(当我点击它时它阻止了我)。我建议不要去那里。 【参考方案1】:TCP 和 UDP 是传输层协议,是 OSI(开放系统互连模型)中的第 4 层协议。主要区别以及优缺点如下。 TCP
优点:
致谢 保证交货 基于连接 有序数据包 拥塞控制缺点:
更大的数据包
更多带宽
慢
有状态
消耗内存
UDP
优点:
数据包更小 消耗更少的带宽 更快 无状态缺点:
没有确认 不保证送达 无连接 没有拥塞控制 没有订单包【讨论】:
【参考方案2】:这句话是一个 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.
【讨论】:
【参考方案3】: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 引入的延迟相比,丢失数据包并不那么重要。
【讨论】:
【参考方案4】:碰到这个线程,让我试着用这种方式表达。
TCP
3 次握手
鲍勃:嘿,艾米,我想告诉你一个秘密 艾米:好的,继续,我准备好了 鲍勃:好的
通讯 Bob:'I',这是第一个字母 艾米:收到第一封信,请给我第二封信 Bob:' ',这是第二个字母 艾米:收到第二封信,请给我第三封信 Bob:'L',这是第三个字母 过了一会儿 Bob:'L',这是第三个字母 艾米:收到第三封信,请给我发第四封信 Bob:'O',这是第四个字母 艾米:... ……
四次握手 鲍勃:我的秘密暴露了,现在,你知道我的心了。 艾米:好的。我无话可说。 鲍勃:好的。
UDP
鲍勃:我爱你 艾米收到:OVI L E
TCP 比 UDP 更可靠,保证了均匀的消息顺序,这就是为什么 UDP 更轻量级和更高效的原因。
【讨论】:
【参考方案5】:类比简单说明
TCP 就是这样。
想象一下你在火星上有一个笔友(早在互联网出现之前,我们就通过书面信件进行交流)。
您需要向您的笔友发送高效能人士的七个习惯。所以你决定用七个不同的字母发送:
-
第 1 封信 - 积极主动
第 2 封信 - 以终为始...
等等
etc..Letter 7 - 磨刀
要求:
您要确保您的笔友收到所有您的信件 - 按顺序,并且他们完美。如果您的 pen pay 在字母 1 之前收到字母 7,那就不好了。如果您的笔友收到除字母 3 之外的所有字母 - 那也不好。
以下是我们确保满足要求的方法:
确认信:所以您的笔友发送一封确认信说“我收到了第 1 封信”。这样你就知道你的笔友已经收到了。如果一封信没有送达,或者送达顺序不正确,那么您必须停下来,然后返回并重新发送该信函以及所有后续信函。 流控制:大约在圣诞节期间,您知道您的笔友会收到大量邮件,因此您放慢速度,因为您不想压倒您的笔友。 (您的笔友会不断向您发送有关笔友邮箱中未读邮件数量的更新 - 如果您的笔友说收件箱因为太满而即将爆炸,那么您会放慢发送信件的速度 - 因为您的笔友将无法阅读它们。 完美抵达。有时,当您通过邮件发送信件时,它可能会被撕裂,或者蜗牛可以吃掉它的一半。你怎么知道你所有的信都完好无损地送达了?好吧,您的笔友会给您一个机制,您可以通过该机制检查他们是否收到了完整的信件,并且这正是您发送的信件。 (例如,通过字数统计等)。一个基本的类比。【讨论】:
【参考方案6】:TCP
是 IP 网络上的面向连接的流。它保证所有发送的数据包都以正确的顺序到达目的地。这意味着使用发送回发送方的确认数据包并自动重传,这会导致额外的延迟,并且传输效率通常低于UDP
。
UDP
是一种无连接协议。通信是以数据报为导向的。仅在单个数据报上保证完整性。数据报到达目的地,可能会乱序到达或根本不到达。它比TCP
更有效,因为它使用非ACK。它通常用于实时通信,其中丢包率的一小部分比TCP
连接的开销更可取。
在某些情况下使用UDP
,因为它允许广播数据包传输。这在DHCP
协议之类的情况下有时是基本的,因为客户端机器还没有收到IP
地址(这是DHCP
协商协议的目的)并且没有任何方法可以建立@987654330 @ 流本身没有 IP
地址。
【讨论】:
一个使用 UDP 的例子是在视频和音频传输中,在这里和那里丢失一些数据包通常并不重要(帧的颜色可能是关闭的,或者是微小的纳秒的音频可能会被剪掉或改变——对人类来说并不明显)。当然,如果你的连接真的很糟糕,你可能会丢失太多的数据包,以至于视频看起来模糊/像素化,音频变得模糊并且经常断断续续。【参考方案7】:Tcp 和 Udp 协议的简单区别:
1) Tcp - 传输控制协议和 Udp - 用户数据报协议。
2) Tcp 是可靠协议,而 Udp 是不可靠协议。
3) Tcp 是面向流的,而 Udp 是面向消息的协议。
4) Tcp 比 Udp 慢。
【讨论】:
【参考方案8】:来自the Skullbox article:
TCP(传输控制协议)是 Internet 上最常用的协议。 这是因为 TCP 提供了纠错功能。当使用 TCP 协议时,存在“保证交付”。这在很大程度上是由于一种称为“流量控制”的方法。流量控制确定何时需要重新发送数据,并停止数据流,直到成功传输先前的数据包。这是有效的,因为如果发送数据包,可能会发生冲突。发生这种情况时,客户端会从服务器重新请求数据包,直到整个数据包完成并且与原始数据包相同。1)TCP是面向连接且可靠的,而UDP是连接较少且不可靠的。UDP(用户数据报协议)是 Internet 上另一个常用的协议。但是,UDP从不用于发送网页、数据库信息等重要数据; UDP 通常用于流式传输音频和视频。 Windows Media 音频文件 (.WMA)、Real Player (.RM) 等流媒体使用 UDP,因为它提供速度! UDP 比 TCP 快的原因是没有任何形式的流量控制或纠错。通过 Internet 发送的数据会受到冲突的影响,并且会出现错误。请记住,UDP 只关心速度。这是流媒体质量不高的主要原因。
2) TCP 需要在网络接口级别进行更多处理,而在 UDP 中则不需要。
3) TCP 使用 3 次握手、拥塞控制、流量控制等机制来保证可靠传输。
4) UDP 主要用于包延迟比丢包更严重的情况。
【讨论】:
+1 相当不错的总结。尽管is the most commonly used protocol on the Internet
声明是有争议的,并且实际上取决于您如何定义most commonly used
、protocol
和the Internet
。例如,互联网协议更有可能成为该王冠的竞争者。
-1:UDP用于DHCP的原因与数据包延迟或丢失无关。
在清晰的通道上发送大量数据时,TCP 通常比 UDP 快。 UDP 用于实时流式传输音频或视频的原因是,当 TCP 数据包丢失时,接收应用程序将看不到任何内容,直到丢失的数据被重新传输并成功接收。在许多流媒体应用程序中,迟到的数据将毫无用处,因此在等待重新传输时没有任何意义,因为无论如何都将是无用的。
UDP 用于 DHCP,因为 TCP 不支持广播。 DHCP 依赖于使用广播来获取 DHCP 服务器的 IP 地址。见***.com/questions/21266008/…【参考方案9】:
泄漏抽象定律 Joel Spolsky
http://www.joelonsoftware.com/articles/LeakyAbstractions.html
【讨论】:
【参考方案10】:TCP 在实际数据传输发生之前建立连接,而 UDP 没有。这样,UDP 可以提供更快的传递。因此,DNS、时间服务器访问等应用程序使用 UDP。
与 UDP 不同,TCP 使用拥塞控制。它响应网络负载。与 UDP 不同,当网络拥塞迫在眉睫时,它会减慢速度。因此,喜欢恒定吞吐量的多媒体等应用程序可能会选择 UDP。
此外,UDP 不可靠,它不会对数据包丢失做出反应。因此,多媒体传输等对丢失敏感的应用程序更喜欢 UDP。但是,TCP 是一种可靠的协议,因此需要可靠性的应用程序(例如 Web 传输、电子邮件、文件下载)更喜欢 TCP。
此外,在当今的 Internet 中,由于存在中间框,UDP 不如 TCP 受欢迎。当假设 UDP 连接被阻止时,某些应用程序(如 Skype)会落入 TCP。
【讨论】:
【参考方案11】: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,您在延迟期间得到的只是一个暂停,然后是音频,该音频总是会延迟与已经暂停一样多的时间。对于双向电话式对话,这是不可接受的。
【讨论】:
【参考方案12】:其中一个区别很简单
UDP : 发送消息,如果到达目的地不回头,无连接协议 TCP:发送消息并保证到达目的地,面向连接的协议
【讨论】:
【参考方案13】:将 TCP 视为在两个地点之间专门安排 UPS/FedEx 取件/投递包裹,而 UDP 相当于将明信片扔进邮箱。
UPS/FedEx 将竭尽全力确保您邮寄的包裹能够及时送达。有了明信片,如果它真的送来了,你就很幸运了,它可能会乱七八糟或迟到(你有多少次从某人那里得到了多少次他们放假回家后寄来的明信片?)
TCP 尽可能接近有保证的传输协议,而 UDP 只是“尽力而为”。
【讨论】:
足够体面的答案。我要补充一点,在 TCP 流中,数据包由目的地确认,损坏的数据包/丢失的数据包由发送方重新发送。在 UDP 中,数据包被发送,目的地以任何顺序接收它们,并且不确认接收。 有点误导性的类比可能更适合 QoS 我非常喜欢这个类比,但这个答案略微歪曲的一件事是速度。听起来 TCP 更快,而实际上 UDP 是因为开销更少。以上是关于TCP和UDP的区别?的主要内容,如果未能解决你的问题,请参考以下文章