欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

总结六大点面向报文(UDP)和面向字节流(TCP)的区别

程序员文章站 2022-07-10 10:53:26
文章目录 * 1,TCP是面向连接(Connection oriented)的协议,UDP是无连接(Connection less)协议; * 2,TCP*,UDP有界; * 3,TC...

文章目录
* 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的通讯模式是有边界的。

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地址和端口号都一样,只是使用的传输协议不一样,怎么进行区分?数据到达IP层(网络层)之后,会先检查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 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

* 确认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 字节的整数倍。