面向报文(UDP)和面向字节流(TCP)的区别

⾯向报⽂(UDP)和⾯向字节流(TCP)的区别
⽂章⽬录
* 1,TCP是⾯向连接(Connection oriented)的协议,UDP是⽆连接(Connection less)协议;
* 2,TCP⽆界,UDP有界;
* 3,TCP可靠,UDP不可靠;
* 4,TCP有序,UDP⽆序;
* 5,TCP有流量控制(拥塞控制),UDP没有;
* 6,TCP的头部⽐UDP⼤;
1,TCP是⾯向连接(Connection oriented)的协议,UDP是⽆连接(Connection less)协议;
以下举例进⾏说明:
对于⾯向连接的: 两个⼈打电话时,双⽅确认并建⽴连接后才能进⾏通信。
对于⾯向⽆连接的:在邮局寄信时,你只需要将信放在邮筒⾥,不需要给收件⼈通知,收件⼈也不知道你给他寄信了。
2,TCP⽆界,UDP有界;
TCP通过字节流传输,即TCP将应⽤程序看成是⼀连串的⽆结构的字节流。每个TCP套接⼝有⼀个发送缓冲区,如果字节流太长时,TCP会将其拆分进⾏发送。当字节流太短时,TCP会等待缓冲区中的字节流达到⼀定程度时再构成报⽂发送出去,TCP发给对⽅的数据,对⽅在收到数据时必须给⽭确认,只有在收到对⽅的确认时,本⽅TCP才会把TCP发送缓冲区中的数据删除。
斯凯瑞金童书⽽UDP传输报⽂的⽅式是由应⽤程序控制的,应⽤层交给UDP多长的报⽂,UDP照样发送,既不拆分,也不合并,⽽是保留这些报⽂的边界,即⼀次发送⼀个报⽂。
有界与⽆界之分是根据接收报⽂来划分的,对于TCP协议,客户端连续发送数据,只要服务端的这个函数的缓冲区⾜够⼤,会⼀次性接收过来,即客户端是分好⼏次发过来,是有边界的,⽽服务端却⼀次性接收过来,所以证明是⽆边界的;
⽽对于UDP协议,客户端连续发送数据,即使服务端的这个函数的缓冲区⾜够⼤,也只会⼀次⼀次的接收,发送多少次接收多少次,即客户端分⼏次发送过来,服务端就必须按⼏次接收,从⽽证明,这种UDP的通讯模式是有边界的。
tamall
3,TCP可靠,UDP不可靠;由于TCP要保证所有的数据包都可以到达,所以,需要有重传机制(快重传,快恢复,超时重传),UDP不会进⾏重传。当出现以下情况时会进⾏重传:
1,数据报传输中途丢失
2,接收端的ACK确认报⽂在传输中途丢失
3,接收端异常未响应ACK或被接收端丢弃
TCP重传机制:
欧美净智能垃圾桶
1,超时重传机制;
2,快速重传机制;
3,SACK ⽅法;
4,Duplicate SACK – 重复收到数据的问题
4,TCP有序,UDP⽆序;消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP会对其进⾏重排序,UDP不会。
5,TCP有流量控制(拥塞控制),UDP没有;流量控制:TCP利⽤滑动窗⼝机制在TCP连接上实现对发送⽅的流量控制, 如果发送⽅把数据发送得过快,接收⽅可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送⽅的发送速率不要太快,要让接收⽅来得及接收。
网拥塞控制:防⽌过多的数据注⼊到⽹络中,这样可以使⽹络中的路由器或链路不致过载。拥塞控制所要做的都有⼀个前提:⽹络能够承受现有的⽹络负荷。拥塞控制是⼀个全局性的过程,涉及到所有的主机、路由器,以及与降低⽹络传输性能有关的所有因素。
当出现⽹络抖动时,TCP会⾃觉降低发送速度,他会努⼒维护次序,但udp依然保持速度不变
6,TCP的头部⽐UDP⼤;TCP头部20 bytes
补充:
TCP字节流和UDP数据报区别
两者的区别在于TCP接收的是⼀堆数据,⽽每次取多少由主机决定;⽽UDP发的是数据报,客户发送多少就接收多少。
拥有这些区别的原因是由于TCP和UDP的特性不同⽽决定的。TCP是⾯向连接的,也就是说,在连接
持续的过程中,socket中收到的数据都是由同⼀台主机发出的,因此,知道保证数据是有序的到达就⾏了,⾄于每次读取多少数据⾃⼰看着办。 ⽽UDP是⽆连接的协议,也就是说,只要知道接收端的IP和端⼝,且⽹络是可达的,任何主机都可以向接收端发送数据。这时候,如果⼀次能读取超过⼀个报⽂的数据,则会乱套。⽐如,主机A向发送了报⽂P1,主机B发送了报⽂P2,如果能够读取超过⼀个报⽂的数据,那么就会将P1和P2的数据合并在了⼀起,这样的数据是没有意义的。
TCP应⽤场景:效率要求相对低,但对准确性要求相对⾼的场景。因为传输中需要对数据确认、重发、排序等操作,相⽐之下效率没有UDP ⾼。举⼏个例⼦:⽂件传输(准确⾼要求⾼、但是速度可以相对慢)、接受邮件、远程登录。
UDP应⽤场景:效率要求相对⾼,对准确性要求相对低的场景。举⼏个例⼦:QQ聊天、在线视频、⽹络语⾳电话(即时通讯,速度要求⾼,但是出现偶尔断续不是太⼤问题,并且此处完全不可以使⽤重发机制)、⼴播通信(⼴播、多播)。
传输通信:两个协议是进程间通信,也就是说应⽤间的通信,那么如何在众多程序中到⾃⼰的⽬的应⽤呢?在传输层,使⽤端⼝号来识别同⼀台计算机中进⾏通信的不同应⽤程序。
⼀般情况下可以根据“源IP地址”、“⽬标IP地址”、“源端⼝号”、“⽬标端⼝号”来进⾏识别⼀个通信,但是有些特殊情况,⽐如IP地址和端⼝号都⼀样,只是使⽤的传输协议不⼀样,怎么进⾏区分?数据到达I
荧光探针P层(⽹络层)之后,会先检查IP头部的协议号,然后再传给相应协议的模块。
因此,TCP/IP或UDP/IP通信中通常使⽤5个信息来识别⼀个通信:“源IP地址”、“⽬标IP地址”、“源端⼝号”、“⽬标端⼝号”以
及“协议号”。(知名端⼝号与传输层协议没有关系,例如53端⼝在TCP、UDP中都⽤于DNS服务)
端⼝号如何确定:标准既定的端⼝号,0-1023为知名端⼝号,其他已正式注册的端⼝号是1024-49151;动态分配端⼝号,操作系统来为应⽤程序分配互不冲突的端⼝号,下⼀个端⼝号是在前⼀个分配号上加1,动态分配端⼝号范围49152-65535.
TCP⾸部格式
各个段位说明:
* 源端⼝和⽬的端⼝:  各占 2 字节.端⼝是传输层与应⽤层的服务接⼝.传输层的复⽤和分⽤功能都要通过端⼝才能实现
* 序号:  Seq序号,占32位,⽤来标识从TCP源端向⽬的端发送的字节流,发起⽅发送数据时对此进⾏标记。
* 确认号:  Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
* 数据偏移/⾸部长度:  占 4 位,它指出 TCP 报⽂段的数据起始处距离 TCP 报⽂段的起始处有多远.“数据偏移”的单位是 32 位字(以 4 字节为计算单位)
* 保留:  占 6 位,保留为今后使⽤,但⽬前应置为 0
* 紧急URG:  当 URG=1 时,表明紧急指针字段有效.它告诉系统此报⽂段中有紧急数据,应尽快传送(相当于⾼优先级的数据)
mss
* 确认ACK:  只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号⽆效。不要将确认序号Ack与标志位中的ACK搞混了。
* PSH(PuSH):  接收 TCP 收到 PSH = 1 的报⽂段,就尽快地交付接收应⽤进程,⽽不再等到整个缓存都填满了后再向上交付
* RST (ReSeT):  当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建⽴运输连接
* 同步 SYN:  同步 SYN = 1 表⽰这是⼀个连接请求或连接接受报⽂
* 终⽌ FIN:  ⽤来释放⼀个连接.FIN=1 表明此报⽂段的发送端的数据已发送完毕,并要求释放运输连接
* 检验和:  占 2 字节.检验和字段检验的范围包括⾸部和数据这两部分.在计算检验和时,要在 TCP 报⽂段的前⾯加上 12 字节的伪⾸部
* 紧急指针:  占 16 位,指出在本报⽂段中紧急数据共有多少个字节(紧急数据放在本报⽂段数据的最前⾯)
* 选项:  长度可变.TCP 最初只规定了⼀种选项,即最⼤报⽂段长度 MSS.MSS 告诉对⽅ TCP:“我的缓存所能接收的报⽂段的数据字段的最⼤长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报⽂段中的数据字段的最⼤长度.数据字段加上 TCP ⾸部才等于整个的 TCP 报⽂段]
* 填充:  这是为了使整个⾸部长度是 4 字节的整数倍

本文发布于:2024-09-20 16:41:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/717779.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   发送   接收   连接   字节
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议