TCP协议和UDP协议有什么区别?

devbean


TCP和UDP的基础知识,可以去翻阅相应书籍。

我说几个在选择应用协议时比较重要的点,如果你不是很熟悉TCP/IP,应该是有所帮助的。尤其是关于对可靠性的理解。

基于字节流和面向数据报

TCP基于字节流:TCP接收到应用层协议的消息(已编码为二进制)后,然后参考该计算机连接的网络数据链路层MTU(最大传输单元)确定是否要分包,然后交给IP层。但是并不会在不同的消息之间设置分隔符,应用层协议需要在自己的消息中包含该消息的长度信息。类比:你向一个文件追加一系列的序列化对象数据(可看做应用层协议包),如果你自己不标记每次序列化数据的长度,到了反序列化的时候就没办法了。如果你类似Redis在处理字符串的时候在头部维护字符串的长度,就可以安全的读出该字符串。

UDP基于数据报:Udp接收到应用协议的某个消息(已编码为二进制)后,

不会分包,但是要记录当前数据包的大小(消息大小加上8个字节头部),然后交给IP层。IPV4对UDP数据报的大小限制为65535字节(包含头部8个字节),你每次可以直接发送的消息不能超过65507字节。然后UDP协议会自行根据头部的报文长度字段确定完整的消息,对于应用层协议来说,这就是一条完整的消息,不用再做逻辑分离消息。

不管是TCP或者UDP,IP层都会再次考虑MTU确定是否分包。IP层的功能这里不展开。

可靠性和时效性

TCP是可靠的,可靠性通过确认和超时重传机制保证。它是保证路由可达时最终能传输成功。

但是如果你加上时效性要求,这个“可靠性”就大打折扣了!考虑RPG游戏场合,如果因为网络丢包等原因,导致超时重传消息1秒后才到,这种延迟你能接受么?

通信链路不总是可靠的,如果出现问题,TCP协议是不会向上汇报的。而是通过ICMP协议来完成,最终由操作系统接收处理,而操作系统一般会接受多次反馈后才会最终确认“断网了”,WIndows就会长达几分钟。你可以尝试拔掉路由器的WLAN端口,再看看你的操作系统什么时候才反应过来无法连接到因特网。你的应用协议可以忍受这么长时间的“懵逼”状态么?

所以,即使TCP有可靠性保证,绝大部分基于TCP的应用层协议都会显示或隐式地包含确认功能和超时设置。考虑HTTP,显示的确认功能,客户端都会有请求超时时间限制。

Tips:

自定义应用层协议需要保证消息有序传输时,tcp的滑动窗口是个很好的实现参考。

选择问题

关于TCP和UDP的一般选择,这里不说了,到处都可以找到。

说几两个需要可靠性但是适用UDP的场合吧。

1、如果你需要做实时性很高且消息小(比如小于以太网的MTU1500Byte)的通信程序,UDP就很适合。关键消息重复发,不用等确认都可以,当然最终还是需要确认。

2、如果是内网环境,网络非常稳定,UDP几乎不会出问题,如果极度要求性能,可以考虑。

3、如果你公网网络资源有限,而用户之间需要传递大量数据,可以考虑用UDP做NAT穿透。


个人见解,欢迎大家评论或者提出意见。


0迁徙的麻雀0


“我是哟哟吼,专注于数据网络的解答,欢迎大家与我交流数据网络的问题。”

如题,TCP协议和UDP协议的区别有以下几个:

1、TCP协议是面向连接的协议,而UDP协议是面向无连接的协议;

2、TCP协议在建立连接时需要三次握手,并且在建立连接后需要维护连接状态,而UDP协议不需要建立连接,不需要维护连接状态。因此TCP协议占用系统资源较多,UDP占用资源相对少;

3、TCP数据包头最少长度为20个字节,而UDP只需8个字节;


4、TCP协议提供可靠服务,能保证数据正确性和顺序,而UDP协议提供的服务不可靠,可能会产生丢包现象;

5、TCP协议发送的数据为流模式,而UDP协议发送的为数据报模式。

欢迎大家在评论中讨论更深层的问题。


哟哟吼


首先,TCP/IP 和UDP最大的区别就是:TCP/IP是面向连接的,UDP是非面向连接的。通俗一点说就是:TCP/IP管发管到,UDP管发不管到。因此,在安全性方面来说,TCP/IP更具有优越性。

第二:TCP/IP偏重的是点对点的通信,使用时服务器和客户端的区别显而易见,而UDP则可以使用组播实现一对多,通信时更像一个群聊系统,几乎没有客户端和服务器的区别,在时间和空间上具有更高的节约性。使用组播时,确定一个D类地址作为组的地址,将本机加入组中,向组内发送消息,从组中接收消息。

第三:在具体编写的代码结构上,TCP/IP是通过创建Socket对象进行连接,从连接对象上得到输入输出流,在流中读写从而通信。而UDP则是在本机创建DatagramSocket对象,将数据包装成DatagramPacket包来发送,其中包里有要发送到的地址。

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实 “ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。


梦不落116560421


假设有两个人,第一个叫@幽弥狂,简称小y,第二个叫@真善则美,简称小z。现在小y想与小z通信。

TCP协议

小y:我想跟你说几句话

小z:你很幼稚,我跟你没有共同语言

小y:明白 理解 是我唐突了

UDP协议

小y:我想跟你说几句话

(然后就没有然后了,不知道小z收到还是没收到,小y等得很纠结)


分享到:


相關文章: