TCP和UDP之间的区别?


144

TCP和UDP有什么区别?

我知道TCP用于非时间紧迫的应用程序,而UDP用于需要快速传输数据的游戏或应用程序。我知道TCP用于HTTP,HTTP,FTP,SMTP和Telnet。我知道UDP用于DNS和DHCP。

但为什么?TCP和UDP的哪些特性使其对于各自的用例有用?


13
而这个(skullbox.net/tcpudp.php)-这是Google的首个热门-还不够清楚吗?这有什么令人困惑的地方?也许这更好? tcpipguide.com/free/...
美国洛特

1
我真的很好奇,为什么这个问题(在撰写本文时)得到3票赞成。第一句话甚至没有意义,如果有人搜索,关于这个主题的材料很多。
MattH

21
@MattH:1)这是一个很好的问题,如果范围很广并且已经有很好的答案。2)您拥有足够的声誉来纠正第一句话中的错字。3)有关此信息的其他位置无关紧要。Stack Overflow旨在成为知识库,并在此处规范地回答问题。
ire_and_curses,2011年

2
有趣的是,几乎没有人提到DHCP使用广播,但是每个人都认为“答案”是关于传递和重传的保证。
希思·洪尼切特

1
根据Google的说法,对于以后再阅读此书的任何人,上面提到的Skullbox网站都存在MALWARE(当我单击它时,它阻止了我)。我建议不要去那里。
Alan006 2014年

Answers:


119

TCP是IP网络上面向连接的流。它保证所有发送的数据包都将以正确的顺序到达目的地。这意味着使用发送回发送方的确认数据包和自动重传,从而导致额外的延迟,并且传输效率通常低于UDP

UDP是无连接协议。通信是面向数据报的。仅在单个数据报上保证完整性。数据报到达目的地,并且可能无序到达或根本不到达。它比TCP使用非ACK更有效。它通常用于实时通信,在这种情况下,丢包率的百分比要比TCP连接的开销小。

在某些情况下UDP使用,因为它允许广播数据包传输。在DHCP协议之类的情况下,这有时是最基本的,因为客户端计算机仍未接收到IP地址(这是DHCP协商协议的目的),并且TCP没有IP地址本身就无法建立流。


5
在视频和音频传输中使用UDP的一个示例是在此处丢失一些数据包,通常情况下并没有太大关系(帧的颜色可能已关闭,或者音频的十亿分之一秒可能被切除或更改了) -对人类来说并不是很明显)。当然,如果您的连接确实不好,则可能会丢失很多数据包,从而使视频显得模糊/像素化,音频变得模糊,切入和切出很多。
Niko Bellic 2014年

53

Skullbox文章中:

TCP(传输控制协议)是Internet上最常用的协议。其原因是因为TCP提供了纠错功能。使用TCP协议时,存在“保证交付”。这在很大程度上归因于一种称为“流控制”的方法。流控制确定何时需要重新发送数据,并停止数据流,直到成功传输先前的数据包为止。之所以可行,是因为如果发送了数据包,则可能会发生冲突。发生这种情况时,客户端会从服务器重新请求数据包,直到整个数据包完成并且与原始数据包相同为止。

UDP(用户数据报协议)是Internet上的另一种常用协议。但是,UDP从不用于发送重要数据,例如网页,数据库信息等。UDP通常用于流音频和视频。流媒体(例如Windows Media音频文件(.WMA),Real Player(.RM)等)使用UDP,因为它可以提高速度!UDP比TCP快的原因是因为没有任何形式的流控制或错误纠正。通过Internet发送的数据会受到冲突的影响,并且会出现错误。请记住,UDP只与速度有关。这是流媒体质量不高的主要原因。

1)TCP面向连接且可靠,而UDP则连接少且不可靠。

2)TCP需要在网络接口级别进行更多处理,而在UDP中则不需要。

3)TCP使用3路握手,拥塞控制,流量控制等机制来确保可靠的传输。

4)UDP主要用于数据包延迟比数据包丢失更严重的情况。


1
+1合理的摘要。虽然is the most commonly used protocol on the Internet说法是值得商榷的,真的取决于你如何定义most commonly usedprotocolthe Internet。例如,Internet协议更可能是该特定领域的竞争者。
MattH

-1:UDP用于DHCP的原因与数据包延迟或丢失无关。
Heath Hunnicutt

2
在清晰的通道上发送大量数据时,TCP通常比UDP更快。UDP用于实时流音频或视频之类的原因是,当TCP数据包丢失时,接收到的应用程序将看不到任何东西,直到丢失的数据已成功重新发送和接收为止。在许多流应用程序中,迟到的数据将是无用的,因此在等待重新传输的过程中保留所有内容毫无意义,无论如何这将是无用的。
2013年

UDP用于DHCP,因为TCP不支持广播。DHCP依靠广播的使用来获取DHCP服务器的IP地址。参见stackoverflow.com/questions/21266008/…–
ScottSmudger

41

可以将TCP视为在两个位置之间专用的计划的UPS / FedEx包裹取送服务,而UDP等效于将明信片丢在邮箱中。

UPS / FedEx将竭尽全力确保您寄出的包裹到达目的地,并按时到达目的地。有了明信片,您很幸运,如果寄到了这张明信片,它可能会乱序或迟到(您从度假者回家后收到某人的明信片多少次?)

TCP尽可能接近保证的交付协议,而UDP只是“尽力而为”。


1
足够体面的答案。我要补充一点,在TCP流中,数据包由目标确认,损坏的数据包/丢失的数据包由发送方重新发送。在UDP中,数据包被发送,并且目的地以任何顺序接收它们,并且不确认接收。
Erik Nedwidek

2
有点误导性的类比,也许更适合QoS
MattH

11
我非常喜欢这个比喻,但是这个答案有点误解的一件事就是速度。它听起来像TCP更快,而实际上UDP是因为开销较小。
iliketocode 2015年

22

UDP用于DNS和DHCP的原因:

DNS-TCP与客户端相比,服务器(监听连接)需要更多的资源。特别是,当TCP连接关闭时,要求服务器在称为TIME_WAIT_2的状态下记住连接的详细信息(将其保存在内存中)两分钟。此功能可以防止来自先前连接的错误重复的数据包被解释为当前连接的一部分。维护TIME_WAIT_2将耗尽服务器上的内核内存。DNS请求很小,并且经常从许多不同的客户端到达。与客户端相比,这种使用模式加剧了服务器上的负载。人们认为,使用无连接且无状态可在客户端或服务器上维护的UDP可以改善此问题。

DHCP-DHCP是BOOTP的扩展。BOOTP是一种协议,客户端计算机在客户端启动时会使用BOOTP从服务器获取配置信息。为了找到服务器,发送广播请求BOOTP(或DHCP)服务器。只能通过无连接协议(例如UDP)发送广播。因此,BOOTP至少需要一个UDP数据包才能进行服务器定位广播。此外,由于BOOTP在客户端启动时正在运行...,并且这是客户端可能未加载并运行其整个TCP / IP堆栈的时间段,因此UDP可能是客户端准备处理的唯一协议时间。最后,某些DHCP / BOOTP客户端仅支持UDP。例如,某些IP温控器仅实现UDP。

就像其他人提到的那样,UDP对于流媒体尤其是音频也很有用。如果仅丢弃延迟的数据包,则在网络滞后的情况下,对话听起来会更好。您可以使用UDP来做到这一点,但是使用TCP时,您在滞后过程中所得到的只是一个暂停,其次是音频,音频总是被延迟了已经暂停的时间。对于双向电话式对话,这是不可接受的。


17

差异之一就是简而言之

UDP:发送消息,如果到达目的地则不回头,无连接协议
TCP:发送消息并保证到达目的地,面向连接的协议


9

TCP会在实际数据传输发生之前建立连接,而UDP不会。这样,UDP可以提供更快的传递。因此,DNS,时间服务器访问等应用程序使用UDP。

与UDP不同,TCP使用拥塞控制。它响应网络负载。与UDP不同,当网络拥挤迫在眉睫时,它会减慢速度。因此,喜欢持续吞吐量的多媒体之类的应用程序可能会使用UDP。

此外,UDP是不可靠的,它不会对数据包丢失做出反应。因此,对丢失敏感的应用程序(如多媒体传输)更喜欢UDP。但是,TCP是一种可靠的协议,因此,需要可靠性的应用程序(例如Web传输,电子邮件,文件下载)更喜欢TCP。

此外,由于中间盒的存在,在当今的互联网中,UDP不如TCP受欢迎。当假定UDP连接被阻止时,某些应用程序(例如Skype)将落入TCP。



2

Tcp和Udp协议之间的简短区别:

1)Tcp-传输控制协议和Udp-用户数据报协议。

2)Tcp是可靠的协议,而Udp是不可靠的协议。

3)Tcp是面向流的,而Udp是面向消息的协议。

4)Tcp比Udp慢。


1

碰到这个线程,让我尝试用这种方式表达它。

TCP协议

3次握手

鲍勃:嗨,艾米,我想告诉你一个秘密
艾米:好的,继续,我准备好了
鲍勃:好的

通信
鲍勃:“我”,这是第一个字母
艾米:收到,请给我的第二个字母第一个字母
:鲍勃',这是第二个字母
艾米:收到,请给我的第三个字母第二个字母
鲍勃:“L ',这是第三封信
。一段时间后,
鲍勃:'L',这是第三封信
艾米:收到第三封信,请寄给我第四封信
鲍勃:'O',这是第四封信
艾米:...
... ...

四向握手
Bob:我的秘密已经暴露,现在,你知道我的心了。
艾米:好的。我无话可说了。
鲍勃:好的。

UDP协议

鲍勃:我爱你
艾米收到: 奥维·莱

TCP比UDP更可靠,并且消息顺序得到保证,这无疑是UDP为什么更轻量和高效的原因。


0

类推简单解释

TCP就是这样。

想象一下,您在火星上有一个笔友(在互联网出现之前的好日子里,我们通过书面信件进行了交流)。

您需要向笔友发送高效人才的七个习惯。因此,您决定以七个不同的字母发送:

  1. 字母1-积极主动
  2. 字母2-以结局为起点...

等等

等。信7-锯锐化

要求:

你要确保你的笔友接收所有你的信- 为了和他们到达完美。如果您的笔薪在第1个字母之前收到第7个字母-那是不好的。如果您的笔友收到除字母3以外的所有字母-那也不好。

这是我们确保满足要求的方法:

  • 确认信:因此,您的笔友会发送一封确认信,说“我已收到信1”。这样,您知道您的笔友已经收到了它。如果一封信没有到达或到达的顺序混乱,则必须停止,然后返回并重新发送该信件以及所有后续信件。
  • 流量控制:在圣诞节前后,您知道您的笔友会收到很多邮件,因此您放慢速度,因为您不想压倒笔友。(您的笔友会不断向您发送有关笔友邮箱中未读邮件数量的最新信息-如果您的笔友说收件箱太满了,原因是收件箱即将爆炸,那么您会降低发送信件的速度-因为笔友将无法阅读它们。
  • 完美的到来。有时,当您通过邮件发送信件时,信件可能会撕裂,或者蜗牛会吃掉一半。您怎么知道您所有的信件都完好无损?那么,您的笔友会为您提供一种机制,您可以通过该机制检查他们是否收到了完整的信函,并且该信函恰好是您发送的信函。(例如,通过字数统计等)。一个基本的类比。

0

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 Hangouts,与TCP引入的延迟相比,丢失数据包并不那么重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.