(1)转载自 https://blog.csdn.net/li_ning_/article/details/52117463
TCP UDP
TCP与UDP基本区别1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证
UDP应用场景:
1.面向数据报方式
2.网络数据大多为短消息
3.拥有大量Client
4.对数据安全性无特殊要求
5.网络负担非常重,但对响应速度要求高
具体编程时的区别
1.socket()的参数不同
2.UDP Server不需要调用listen和accept
3.UDP收发数据用sendto/recvfrom函数
4.TCP:地址信息在connect/accept时确定
5.UDP:在sendto/recvfrom函数中每次均 需指定地址信息
6.UDP:shutdown函数无效
编程区别
通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。
SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。
基于上述不同,UDP和TCP编程步骤也有些不同,如下:
TCP:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
UDP补充:
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
TCP补充:
TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
(2):源自于知乎 :UDP TCP 的 SOCKET的不同应用:https://www.zhihu.com/question/20060141/answer/26735814
- 你真的很在乎延迟,不能忍受重传,那么就用UDP,例如 NTP 协议。重传NTP消息纯属添乱。
- 你真的不在乎可靠性,丢一些包也不需要重传,那么就可以用 UDP。例子我想不出来。有人说音频或视频流可以用UDP,不过据我看来各大视频网站都用HTTP协议,而HTTP是基于TCP的。
- 你需要NAT穿透,那么不得不用UDP。
- 其他情况,一旦程序要自己做重传,你都是在用UDP模拟出蹩脚的TCP,还不如直接用TCP呢。
总之:使用 UDP 需要有强大到不容置疑的理由,when in doubt, use TCP.
一些协议,出于历史原因,受当时技术和网络条件限制,选择了基于UDP实现,其选择的理由现在很可能已经不再成立了。因此“xxx协议用UDP”不是你现在写网络应用程序也该用UDP的理由,除非你本身就是在实现xxx协议。
另外,那些说TCP比UDP慢、效率低的,你拿UDP写个程序,把千兆网带宽打满(TCP等价的代码只有两行:客户端 while (true) { send(...); } 服务端 while (true) { recv(...); }。),且不说你的程序会有多复杂,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛。UDP选择了速度而失去了可靠性,TCP选择了可靠性而在速度上面做了些让步。
我的主要领域是实时金融数据的处理,见过一些场景。
比如像外汇价格之类的数据,变化快,传送延迟要特别低,偶尔丢一些数据也不怕,应为它变得实在是太快了。
但是有一些变化不多的数据,比如股票的收盘价,一天才一个,所以传输速度不重要,但一定要确保可靠性,不能丢。
链接:https://www.zhihu.com/question/20060141/answer/26797439
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UDP和TCP的适用范围是由它们各自的特性决定的。
UDP的特性是:数据报,无连接,简单,不可靠,会丢包,会乱序(实际中遇到的主要是丢包)
TCP的特性是:流式,有连接,复杂,可靠,延迟较大、带宽占用较大(均是相对于UDP来说)
不同的应用场合会选择不同的协议。以流媒体为例,一类是对实时性要求不高的音视频点播应用(比如各大视频网站),这类应用就多用TCP/HTTP,因为用户可以忍受延时,可以进行缓冲,但不能忍受丢包导致的马赛克。
另一类是对实时性要求很高的音视频通信应用,比如视频会议、视频监控,这类应用用户是无法忍受过高的延时的,相反,偶尔丢一下包却无关大碍。而且,在这类应用中,基于UDP的组播技术也是经常用到的,因为它可以大大减轻服务器和交换机的压力。
不太同意陈硕的第一句话,在编程上,UDP比TCP简单得多,因为它没有建立连接的过程,而且是数据报方式,接收端不用像TCP那样需要自己重组应用层的协议包。陈硕说UDP比TCP复杂,估计还是考虑到用UDP来实现可靠传输,如果是这样,那就应该使用TCP。如果对可靠性要求不是那么高,给UDP加上确认重传也是比较简单的事情(乱序问题我在实际中还未遇到过,也许是出现了未被观察到)。
以下源自: https://www.cnblogs.com/gaopeng527/p/5255827.html
UDP会丢包, 丢包后不重发, 所以在可靠性要求低, 性能要求高的地方使用.
大多数情况下TCP已经满足需求了, 但总有对性能欲求不满的地方.
例如流媒体相关, 时延较大的卫星通讯方面, 铁路信息上报及交互系统, 城市交通信息上报及交互系统等等, UDP作用也是巨大, 而且UDP和TCP并非公用一套端口, 合理运用也能起到意想不到的作用
来源于水月老哥的QQ:
socket是封装tcp udp的套接字,相当于网络通信的api。制定tcp类型参数,做的就是tcp通信工作,udp的也是如此。而modbus rtu之类的协议,是有具体的站号+功能码+地址+数据+crc等,而网络通信,已经将这些做到了驱动层,无需自己实现。只需要实现上层通讯就好。包括tcp的握手重发等,都在协议层,无需自己实现。只需要管发送内容,驱动自然保证tcp的数据完整可靠。
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 传输大量的数据,对可靠性要求较高的场合 | 传送少量数据、对可靠性要求不高的场景 |
速度 | 慢 | 快 |