TCP和UDP有什么区别?
我知道TCP用于非时间紧迫的应用程序,而UDP用于需要快速传输数据的游戏或应用程序。我知道TCP用于HTTP,HTTP,FTP,SMTP和Telnet。我知道UDP用于DNS和DHCP。
但为什么?TCP和UDP的哪些特性使其对于各自的用例有用?
TCP和UDP有什么区别?
我知道TCP用于非时间紧迫的应用程序,而UDP用于需要快速传输数据的游戏或应用程序。我知道TCP用于HTTP,HTTP,FTP,SMTP和Telnet。我知道UDP用于DNS和DHCP。
但为什么?TCP和UDP的哪些特性使其对于各自的用例有用?
Answers:
TCP
是IP网络上面向连接的流。它保证所有发送的数据包都将以正确的顺序到达目的地。这意味着使用发送回发送方的确认数据包和自动重传,从而导致额外的延迟,并且传输效率通常低于UDP
。
UDP
是无连接协议。通信是面向数据报的。仅在单个数据报上保证完整性。数据报到达目的地,并且可能无序到达或根本不到达。它比TCP
使用非ACK更有效。它通常用于实时通信,在这种情况下,丢包率的百分比要比TCP
连接的开销小。
在某些情况下UDP
使用,因为它允许广播数据包传输。在DHCP
协议之类的情况下,这有时是最基本的,因为客户端计算机仍未接收到IP
地址(这是DHCP
协商协议的目的),并且TCP
没有IP
地址本身就无法建立流。
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主要用于数据包延迟比数据包丢失更严重的情况。
is the most commonly used protocol on the Internet
说法是值得商榷的,真的取决于你如何定义most commonly used
,protocol
和the Internet
。例如,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从服务器获取配置信息。为了找到服务器,发送广播请求BOOTP(或DHCP)服务器。只能通过无连接协议(例如UDP)发送广播。因此,BOOTP至少需要一个UDP数据包才能进行服务器定位广播。此外,由于BOOTP在客户端启动时正在运行...,并且这是客户端可能未加载并运行其整个TCP / IP堆栈的时间段,因此UDP可能是客户端准备处理的唯一协议时间。最后,某些DHCP / BOOTP客户端仅支持UDP。例如,某些IP温控器仅实现UDP。
就像其他人提到的那样,UDP对于流媒体尤其是音频也很有用。如果仅丢弃延迟的数据包,则在网络滞后的情况下,对话听起来会更好。您可以使用UDP来做到这一点,但是使用TCP时,您在滞后过程中所得到的只是一个暂停,其次是音频,音频总是被延迟了已经暂停的时间。对于双向电话式对话,这是不可接受的。
TCP会在实际数据传输发生之前建立连接,而UDP不会。这样,UDP可以提供更快的传递。因此,DNS,时间服务器访问等应用程序使用UDP。
与UDP不同,TCP使用拥塞控制。它响应网络负载。与UDP不同,当网络拥挤迫在眉睫时,它会减慢速度。因此,喜欢持续吞吐量的多媒体之类的应用程序可能会使用UDP。
此外,UDP是不可靠的,它不会对数据包丢失做出反应。因此,对丢失敏感的应用程序(如多媒体传输)更喜欢UDP。但是,TCP是一种可靠的协议,因此,需要可靠性的应用程序(例如Web传输,电子邮件,文件下载)更喜欢TCP。
此外,由于中间盒的存在,在当今的互联网中,UDP不如TCP受欢迎。当假定UDP连接被阻止时,某些应用程序(例如Skype)将落入TCP。
碰到这个线程,让我尝试用这种方式表达它。
3次握手
鲍勃:嗨,艾米,我想告诉你一个秘密
艾米:好的,继续,我准备好了
鲍勃:好的
通信
鲍勃:“我”,这是第一个字母
艾米:收到,请给我的第二个字母第一个字母
:鲍勃',这是第二个字母
艾米:收到,请给我的第三个字母第二个字母
鲍勃:“L ',这是第三封信
。一段时间后,
鲍勃:'L',这是第三封信
艾米:收到第三封信,请寄给我第四封信
鲍勃:'O',这是第四封信
艾米:...
... ...
四向握手
Bob:我的秘密已经暴露,现在,你知道我的心了。
艾米:好的。我无话可说了。
鲍勃:好的。
鲍勃:我爱你
艾米收到: 奥维·莱
TCP比UDP更可靠,并且消息顺序得到保证,这无疑是UDP为什么更轻量和高效的原因。
TCP就是这样。
想象一下,您在火星上有一个笔友(在互联网出现之前的好日子里,我们通过书面信件进行了交流)。
您需要向笔友发送高效人才的七个习惯。因此,您决定以七个不同的字母发送:
等等
等。信7-锯锐化
你要确保你的笔友接收所有你的信- 为了和他们到达完美。如果您的笔薪在第1个字母之前收到第7个字母-那是不好的。如果您的笔友收到除字母3以外的所有字母-那也不好。
这是我们确保满足要求的方法:
TLDR;
在开始之前,请记住事物的所有缺点都是其优点的延续。只有适合工作的合适工具,没有万能药。TCP / UDP共存数十年,这是有原因的。
TCP协议
它的设计非常可靠,并且可以很好地完成工作。它之所以如此复杂是因为它完成了一项艰巨的任务:在不可靠的IP协议上证明可靠的传输。
由于所有TCP的复杂逻辑都封装在网络堆栈中,因此您无需在应用程序层中进行大量费力且容易出错的低级工作。
通过TCP发送数据时,您将字节流写入发送方的套接字,在此套接字被分解为数据包,向下传递到堆栈并通过电线发送。在接收器端,数据包再次重新组合成连续的字节流。
保持这种良好的抽象在复杂性和性能方面要付出代价。如果字节流中的第一个数据包丢失,则接收器将延迟后续数据包的处理,即使那些已经到达。
另外,为了可靠起见,TCP实现了以下目的:
在慢速,不可靠的无线网络中,所有这些情况都会加剧,而TCP是为有线网络设计的,在有线网络中,延迟是可以预见的,而数据包丢失并不常见。此外,就像已经提到的许多人一样,对于某些事情,TCP根本无法工作(DHCP)。但是,在相关情况下,TCP仍然可以出色地完成其工作。
使用邮件类比,TCP会话类似于将故事讲给秘书,秘书将其分解为邮件,然后通过糟糕的邮件服务发送给发布者。在另一边,另一位秘书将邮件汇编成单个文本。有些邮件丢失了,有些邮件损坏了,因此,要可靠地发送邮件,需要非常复杂的过程,而长达10页的故事可能需要很长时间才能到达您的发布者。
UDP协议
另一方面,UDP是面向消息的,因此接收方将消息(数据包)写入套接字,然后按原样发送给接收方,而无需进行任何拆分/组装。
与TCP相比,其规范非常简单。本质上,它为您所做的就是向数据包添加校验和,以便接收器可以检测到其损坏。其他一切都必须由软件开发人员来实现。现在阅读大量的TCP规范,并尝试重新实现它的某些部分。
有些人采用这种方式并获得了非常不错的结果,以至于HTTP / 3使用QUIC(一种基于UDP的协议)。但是,这更是一个例外。UDP的常见应用是音频/视频流和会议应用程序,例如Skype,Zoom或Google Hangouts,与TCP引入的延迟相比,丢失数据包并不那么重要。