TCP与UDP异同

TCP/IP模型的运输层有两个不同的协议:UDP用户数据报协议与TCP传输控制协议。

相同点

  • TCPUDP都是运行在运输层的协议。
  • TCPUDP的通信都需要开放端口。

不同点

TCP

  • TCP是面向连接的协议,提供全双工通信,需要建立链接之后再传输数据,数据传输负载相对较大。
  • TCP提供可靠交付的服务,使用流量控制和拥塞控制等服务保证可靠通信。
  • TCP首部最小20字节,最大60字节,包括源端口、目的端口、序号、确认号、数据偏移、控制标志、窗口、校验和、紧急指针、选项等信息。
  • TCP只能是一对一通信。
  • TCP面向字节流通信。
  • TCP保证数据传输的顺序,通过给TCP连接中传送数据流的每个字节都编上序号来确定传输顺序。
  • TCP提供校验和、确认应答、序列号、超时重传、连接管理、流量控制、拥塞控制等功能。
  • TCP适用于要求可靠传输的应用,如文件传输等

UDP

  • UDP是无连接的,即发送数据之前不需要建立连接,数据传输负载相对较小。
  • UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用流量控制和拥塞控制。
  • UDP首部8字节,包括源端口、目的端口、长度、校验和信息。
  • UDP具有单播、多播、广播的功能,支持一对一、一对多、多对多、多对一的数据传输方式。
  • UDP是面向报文通信,对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后就向下交付IP层。
  • UDP不保证数据传输的顺序,需要应用层程序在数据段加入序号等方式控制顺序。
  • UDP只在IP的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。
  • UDP适用于实时应用,如网络电话、视频会议、直播等

相关问题

UDP实现可靠性传输

运输层无法保证数据的可靠传输,只能通过应用层来实现了,实现的方式可以参照TCP可靠性传输的方式,只是实现不在传输层,实现转移到了应用层,主要通过实现确认机制、重传机制、窗口确认等机制来实现可靠传输,有RUDPRTPUDT等开源程序利用UDP实现了可靠的数据传输,此外有结合TCP的可靠与UDP速度的权衡KCP协议。

TCP短连接和长连接的区别

短连接:ClientServer发送消息,Server回应Client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是Client先发起close操作。短连接一般只会在Client/Server间传递一次读写操作。短链接管理起来比较简单,建立存在的连接都是有用的连接,不需要额外的控制手段,但是如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

长连接:ClientServer完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间,对于频繁请求资源的客户来说,较适用长连接,但是随着客户端连接越来越多,Server负载会越来越大,此时就需要采取一些策略减少负载,例如关闭长时间未读写的链接LRU算法、限制客户端链接数量等。

TCP粘包拆包解决方案

由于TCP本身是面向字节流的,无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决。

  • 消息定长:发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
  • 设置消息边界:服务端从网络流中按消息边界分离出消息内容,在包尾增加回车换行符进行分割,例如FTP协议。
  • 将消息分为消息头和消息体:消息头中包含表示消息总长度(或者消息体长度)的字段。

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://zhuanlan.zhihu.com/p/108822858
https://www.cnblogs.com/liangyc/p/11628148.html
https://blog.csdn.net/m_xiaoer/article/details/72885418
https://blog.csdn.net/pangyemeng/article/details/50387078
https://blog.csdn.net/quiet_girl/article/details/50599777
https://blog.csdn.net/liuchenxia8/article/details/80428157
https://blog.csdn.net/qq_40732350/article/details/90902396
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html

TCP与UDP异同的更多相关文章

  1. TCP、UDP、RTP(RTCP)异同与区别

    OSI七层模型OSI 中的层            功能                                                        TCP/IP协议族 应 用层   ...

  2. TCP跟UDP乱侃

    原文链接http://www.cnblogs.com/xiaoEight/archive/2013/02/19/2917814.html 由于最近在恶补关于网络编程的东西,所以决定做个简单的记录.之前 ...

  3. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  4. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  5. 【校验】TCP和UDP的校验和

    一开始,私以为校验和只是简单的求和得到的结果,后来在TCP和UDP里面看到使用的校验和方式有点奇怪--二进制反码(循环进位)求和. 人类的认知过程必将从简单到复杂,看下这个二进制反码循环求和是啥子意思 ...

  6. 初入网络系列笔记(2)TCP和UDP

    一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...

  7. 传输层协议TCP和UDP

    本文力图简洁,让读者对TCP和UDP有个初步的认知.闲话少说,现在开始吧.TCP和UDP都是传输层的协议.TCP通过三次握手建立可靠连接,对未送达的消息重新进行发送.UDP不建立连接而直接发送,对未送 ...

  8. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  9. http、tcp、udp、OAUTH2.0网络协议区别

                    一.先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RAR ...

  10. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

随机推荐

  1. 为什么 sort() 中的 return a-b 可以决定升序

    arr.sort( function(a,b){ return a-b; } ) 千万不要理解成 a 减 b 其实它代表的是26个字母中的 a 和 b b 比 a 大,所以 a - b 就是升序,写成 ...

  2. [转帖]六千字带你了解 Oracle 统计信息和执行计划

    https://cloud.tencent.com/developer/article/1616706 大家好,我是 JiekuXu,很高兴又和大家见面了,今天分享下 Oracle 统计信息和执行计划 ...

  3. [转帖]/etc/security/limits.conf 详解与配置

    https://www.cnblogs.com/operationhome/p/11966041.html 一. /etc/security/limits.conf 详解 /etc/security/ ...

  4. ext4 扩容磁盘的方式方法

    ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...

  5. [转帖]焱融全闪系列科普| 为什么 SSD 需要 NVMe?

    https://xie.infoq.cn/article/7026237b455c7d62f33afc4a9 NVMe 的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advance ...

  6. [转帖]03-rsync传输模式(本地传输、远程方式传输、守护进程模式传输)

    https://developer.aliyun.com/article/885801?spm=a2c6h.24874632.expert-profile.282.7c46cfe9h5DxWK 简介: ...

  7. [转帖]016 Linux 卧槽,看懂进程信息也不难嘛?top、ps

    016 Linux 卧槽,看懂进程信息也不难嘛?top.pshttps://my.oschina.net/u/3113381/blog/5455267 1 扒开看看 top 命令参数详情 Linux ...

  8. Oracle 以及 达梦数据库简单查询所有表行数的存储过程

    1. 今天有一个场景需要查询一个数据库实例下面所有的表的行数. 本来想查询 user_tables 视图 但是发现 这个视图里面 达梦数据库 里面存的是null的.. 百度之后发现一个解决方案是 使用 ...

  9. 飞腾2000+银河麒麟v10安装redis的注意事项

    先说一下结论 无法复用ubuntu上面编译的二进制文件 无法直接使用docker官网下面的arm64的镜像运行 无法直接使用redis6.0.10最新版本编译运行 可以使用redis5.0.4 进行编 ...

  10. window.addEventListener注册滚动scroll事件不生效

    先了解一下滚动事件触发的条件 视图或者一个元素在滚动时,会触发元素的 scroll 事件. 备注: 在 iOS UIWebViews 中,滚动进行时不会触发 scroll 事件:只有当滚动结束后事件才 ...