TCP与UDP(非常详细)

2023-10-27

笔记记录


前言

TCP/IP模型是一些列协议的总称(TCP,UDP,IP,FTP,HTTP,ICMP,SMTP)。这些协议可以划分为四层:链路层、网络层、传输层、应用层。
TCP和UDP都位于计算机网络模型中的运输层,它们主要负责传输应用层产生的数据。。


TCP\UDP

UDP和TCP 在使用TCP/IP 体系结构的网络通信中,这两个协议的使用频率仅次于网际层的IP协议。TCP/IP 体系结构应用层中的某些协议需要使用运输层的TCP 提供的服务,而另一些协议需要使用运输层的UDP 提供的服务,UDP 是用户数据报协议的英文缩写词,TCP 是传输控制协议的英文缩写词。

TCP

TCP(Transmission Control Protocol 传输控制协议):一种面向连接的、可靠的、基于字节流的传输层通信协议,使用三次握手协议建立连接、四次挥手断开连接。面向连接意味着两个使用TCP的应用(通常是一个客户端和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信,广播和多播不能用TCP。TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),端口号拼接到IP地址即构成了套接字。

UDP

UDP(User Datagram Protocol 用户数据报协议):是OSI(Open System Interconnection 开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。

区别

  1. TCP面向连接,UDP面向无连接

UDP是不需要和TCP一样建立三次握手连接的。而TCP则在通信前是需要进行三次握手的。
两台主机如果在运输层使用UDP协议进行通信,双方可以随时发送数据,
再来看使用TCP 协议的情况,使用TCP协议的通信,双方在进行数据传输之前必须使用三报文握手来建立TCP 连接。TCP 连接建立成功后才能进行数据传输,数据传输结束后必须使用四报文挥手来释放TCP连接。需要注意的是这里所谓的连接是指逻辑连接关系,而不是物理连接。

  1. TCP是可靠的,UDP是不可靠的

TCP保证数据的正确性以及顺序,UDP不保证还可能丢包。
UDP只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达。
在TCP协议中使用了接收确认和重传机制,使得每一个信息都能保证到达,是可靠的。
而UDP是尽力传送,没有应答和重传机制,UDP只是将信息发送出去,对方收不收到也不进行应答。所以UDP协议是不可靠的。

  1. TCP/UDP传输方式

UDP 不仅支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
TCP不能一对多的原因是:TCP通信前要跟一台主机进行三次握手连接,因此TCP不能对多,只能一对一。

  1. TCP是面向字节流的,UDP是面向报文的

TCP基于流的传输表示TCP不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息),这正是TCP 实现可靠传输、流量控制以及控制的基础.
UDP面向报文,是有 保护消息边界 的,接收方一次只能接受一条独立的消息,所以UDP不存在粘包。

  1. TCP的头部开销大,UDP的头部开销小

UDP的头部很小,只有8个字节。TCP的头部至少要20个字节

  1. TCP会产生粘包问题,UDP会产生丢包问题

TCP产生粘包问题的主要原因是:TCP是面向连接的,所以在TCP看来,并没有把消息看成一条条的,而是全部消息在TCP眼里都是字节流,因此容易把多个消息混在一起后,TCP就分不清了
UDP是没有应答和重传机制,因此包很容易传丢了而且自己都不知道
主要丢包原因: 1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。 2、发送的包巨大丢包:虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。 3、发送的包较大,超过接受者缓存导致丢包:包超过mtu size(mtu表示最大传输单元)数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。 4、发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。

总结

TCP与UDP区别总结:
1、TCP传输效率慢、所需资源多,UDP则相反。
2、TCP面向连接(打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
3、TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
4、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
5、UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
6、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
7、TCP首部开销20字节;UDP的首部开销小,只有8个字节
8、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
9、TCP适用要求可靠传输的应用(文件传输),UDP适用实时应用(直播、视频会议、IP电话)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP与UDP(非常详细) 的相关文章

  • 如何在 Docker 上发布 UDP 端口?

    如何将 UDP 端口从 Docker 容器转发到主机 使用 p 标志并添加 udp端口号的后缀 p 53160 53160 udp 完整命令 sudo docker run p 53160 53160 p 53160 53160 udp p
  • 为什么服务器不使用 C# 中的套接字接收本地传输中的所有 UDP 数据包?

    我有一个服务器和一个客户端应用程序 客户端将一堆数据包发送到服务器 使用的协议是UDP 客户端应用程序生成一个新线程来循环发送数据包 服务器应用程序还生成一个新线程来循环等待数据包 这两个应用程序都需要根据传输进度保持 UI 更新 如何正确
  • 我应该对 UDP 使用(非阻塞)NIO 吗?

    根据这个帖子 https stackoverflow com questions 569555 non blocking udp i o vs blocking udp i o in java UDP 只是不阻塞 使用 非阻塞 NIO AP
  • C# UDP广播和接收示例

    问题 我正在尝试将 udp 套接字绑定到特定地址 我会广播一条消息 同一个套接字需要能够接收消息 当前代码 static void Main UdpClient Configuration new UdpClient new IPEndPo
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • memcached 使用 Django 监听 UDP

    Question 我无法获得memcached正在听UDP 上班 get set delete 与姜戈 我只让 memcached 监听UDP 11211 正如我在上一个问题 https stackoverflow com question
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • udp数据包被tcpdump捕获,但没有被套接字接收[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我编写了一个 rawudp 程序 通过原始套接字发送 udp 数据包 按照网页http www tenouk com Module43a html h
  • UDP sendto 上的 ECONNREFUSED 错误

    我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto 向多个端口发送 UDP 数据 所有端口均使用套接字 PF INET SOCK DGRAM 0 为了一组客户端读取进程的利益 这些 sendto 偶尔会不可预测地触发经济
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock

随机推荐

  • k8s_day07_02

    k8s day07 02 静态密码方式认证k8s kubeconfig 1 kubeconfig 配置文件 在 etc kubernetes 有conf 结尾的文件 那个就是kubeconfig 类型的配置文件 用于控制节点组件 和api交
  • HBuilderX安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    一 下载安装 1 在地址栏中直接输入https www dcloud io 2 点击箭头所指 进去过后点击DOWNLOAD 3 点击过后 选择自己所需要的版本 HBuilder目前有两个版本 一个是windows版 一个是mac版 下载的时
  • python垃圾回收

    Python内存管理机制 Python内存管理机制主要包括以下三个方面 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用是什么 a 1 如上为一个简单的赋值语句 1就是对象 a就是引用 引用a指向对象1 同理 b 1 b也
  • Configuring VM Acceleration on Windows

    http developer android com tools devices emulator html Configuring Virtual Machine Acceleration Caution As of SDK Tools
  • Java中String类,StringBuffer类和StringBuilder类

    底层分析 1 String类 String类对象代表不可变的字符序列 其底层结构如下 public final class String implements java io Serializable Comparable
  • quartz定时任务详解

    开始 application quartz xml
  • 前端面试题总结

    1 this指向问题 1 以函数的形式 包括普通函数 定时器函数 立即执行函数 调用时 this 的指向永远都是 window 比如fun 相当于window fun 2 以方法的形式调用时 this 指向调用方法的那个对象 3 以构造函数
  • NTP协议介绍

    查看原作者 转载自 NTP协议介绍 2013 06 19 14 50 50 转载 SNTP协议原理 SNTP是简单网络时间协议 Simple Network Time protocol 的简称 它是目前Internet网上实现时间同步的一种
  • 【分布式】分布式事务:2PC

    分布式事务的问题可以分为两部分 并发控制 concurrency control 原子提交 atomic commit 分布式事务问题的产生场景 一份数据被分片存在多台服务器上 那么每次事务处理都涉及到了多台机器 可序列化 并发控制 定义了
  • HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

    HttpServer的特点 1 完全采用IOCP模型 实现真正的异步IO 高并发 高可靠 2 支持4G以上文件下载 3 支持断点续传 4 轻量级 体积小 服务器文件仅200多K 无任何依赖库 5 支持CGI网关 通过CGI xml可动态配置
  • 二进制补码运算

    二进制负数的在计算机中采用补码的方式表示 很多人很好奇为什么使用补码 直接使用原码表示多好 看上去更加直观和易于计算 然而事实告诉我们 这种直观只是我们人类的一厢情愿罢了 在计算机看来 补码才是它们最想要的 那么 为什么计算机使用补码更好
  • Flask对数据库的增删改查

    一 从数据库获取数据返回 在配置好连接数据库的文件后 编写类视图 定义get方法 使用marshal返回数据 class SubResorce Resource def get self ret Sub query all return m
  • IDEA上传项目提示Push rejected: Push to origin/master was rejected的解决办法

    idea中 发布项目到码云 push 提示 push to origin master war rejected 解决方案如下 切换到自己项目所在的目录 右键选择git bash here 在窗口中依次输入命令 git pull git p
  • DVWA靶场实战

    提示 本文主要讲解DVWA靶场的主要功能和用处 简单的了解并学习DVWA靶场实战 不断地更新 一 DVWA靶场的功能介绍 DVWA共有十个模块 分别是 Brute Force 暴力 破解 Command Injection 命令行注入 CS
  • 输出字符串的子串

    我们经常碰到这样一个问题 怎样快速输出一个字符串的子串 这种问题通常有两种形式 1 输出连续子串 例如 假设字符串的长度为n 其非空子串的数目为你n n 1 2个 例如字符串 abc 的连续子串有 a b c ab bc abc 利用代码实
  • Flink 1.10编译实战(CDH版本)

    Flink1 10增加了一些新的特性 Flink 1 10 0 正式宣告发布 作为 Flink 社区迄今为止规模最大的一次版本升级 Flink 1 10 容纳了超过 200 位贡献者对超过 1200 个 issue 的开发实现 包含对 Fl
  • mysql组内排序

    比如说要获取班级的前3名 oracle 可以用 over partition by 来做 mysql就可以用GROUP CONCAT GROUP BY substring index实现 考试表 DROP TABLE IF EXISTS t
  • NLP:nltk+stanfordNLP

    1 NLTK import nltk form nltk book import 2 NLTK中使用stanfordNLP http www zmonster me 2016 06 08 use stanford nlp package i
  • SpringCloud Alibaba史上最强详解与史上最系统框架搭建

    框架实现代码资源地址 springCloud dataservice bus zip springcloudalibaba搭建 Java文档类资源 CSDN下载 目录 一 官网集合 Springboot官网 中文文档 Mybatis官网 S
  • TCP与UDP(非常详细)

    笔记记录 目录 前言 TCP UDP TCP UDP 区别 总结 前言 TCP IP模型是一些列协议的总称 TCP UDP IP FTP HTTP ICMP SMTP 这些协议可以划分为四层 链路层 网络层 传输层 应用层 TCP和UDP都