精华内容
参与话题
问答
  • TCP是流传输协议,UDP包传输协议

    千次阅读 2013-10-20 00:19:38
    你可能需要理解这句话:TCP是流传输协议,UDP包传输协议。 1:什么是流传输协议? 打个比方,发送方一次或分多次send了“1234,567,890,abc....”这些数据,接收方每次recv时得到的数据可能是分成了以下这么多...
    你可能需要理解这句话:TCP是流传输协议,UDP是包传输协议。
    1:什么是流传输协议?
    打个比方,发送方一次或分多次send了“1234,567,890,abc....”这些数据,接收方每次recv时得到的数据可能是分成了以下这么多片段:123,45,67890,ab,c....,也可能是这样的片段12,345,678,90abc,...。所以在网络正常的情况下,TCP虽然能保证数据按序到达对方,但不保证每次到达的数据量跟发送的时候是一致的,因此应用层必须要处理这样的情况,而处理这种情况就只能在应用层的数据里加额外信息,TLV就是其中一种实现方式。
    理解流传输协议的本质还可以想象一下家里用的自来水管的情况,自来水厂源源不断的供水,我们用的时候都是开一下水龙头就放一点水,开一下放一点,水是先进先出,但一次进多少跟一次出多少是完全不对等的。

    2:什么是包传输协议?

    打个比方,发送方一次或分多次send了“1234,567,890,abc....”这些数据,接收方要么收不到包(譬如567这个包,要丢就是整体都丢了,不可能收到了5,而丢了67),要是收到的话,也会是这样一个个完整的包(顺序不保证):567,1234,890,abc....,所以每个包都是一个整体,是最小传输单元,不可再被分解。

    3:为何你本机传输没问题,而两台计算机间传输就出问题了?
    因为本机传输时,TCP包一次最大可以传送65535个字节的数据,所以当你图片小于64K的时候,一次就传完了(完全没有分解的必要),但你可以试试传输多个大于64K的图片,看看会出现什么情况。
    当两台机子的数据是通过以太网甚至广域网传输的时候,包从发送端出去的时候最大也就1500个字节,经过广域网可能还会被分解成更小的,因此产生了问题1中的情况,你再通过原先简单的recv代码肯定出错。
    展开全文
  • 深入理解TCP、UDP协议及两者的区别

    万次阅读 多人点赞 2018-11-14 13:03:24
    所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易...

    GitHub:https://github.com/JDawnF

    一、TCP协议:

           位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

    (1)、三次握手:握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。

    • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
    • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
    • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。

    若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。
     (2)、四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。

    • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
    • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
    • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
    • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    三次握手和四次挥手:在TCP连接中,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中, B端向A
    端发送的ACK和FIN是分两次发送的。因为在B端接收到A端的FIN后, B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。

    (3)、深入理解TCP连接: 

    由于TCP是全双工的,因此在每一个方向都必须单独关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这个方向上没有数据流动,一个TCP连接在接收到一个FIN后仍能发送数据。 首先进行关
    闭的一方将执行主动关闭,而另一方执行被动关闭。
    TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。简单来说,是“先关读,再关写” ,总共需要4个阶段。以客户机发起关闭连接为例:1.服务器读通道关闭;2.客户端写通道关闭;3.客户端读通道关闭;4.服务器写通道关闭。
    关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段,直到接收到对方发送的FIN,且对方收到了接收确认的ACK之后,双方的数据通信完全结束,过程中每次都需要返回确认数据段ACK。

    (4)、TCP使用滑动窗口机制来进行流量控制。
    建立连接时,各端分配一个缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。接收方发送的确认消息中包含了自己剩余的缓冲区尺寸。剩余缓冲区空间的数量叫做窗口。其实就是建立连接的双虎互相知道彼此剩余的缓冲区大小。

     (5)、拥塞控制

    拥塞控制:防止过多的数据注入到网路中,这样可以使网络中的路由器或链路不至于阻塞。拥塞控制是一个全局性的过程,和流量控制不同,流量控制是点对点的控制。

    1、慢开始:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。思路就是:不要一开始就发送大量的数据,先试探一下网络的拥塞程度,也就是说由小到大增加拥塞窗口的大小。

    为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。 ssthresh的方法如下:
    当cwnd < ssthresh时,开始使用慢开始算法;当cwnd > ssthresh, 改用拥塞避免算法;当cwnd = ssthresh时,慢开始与拥塞算法任意。
     2.拥塞避免:

    拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按照线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为⽆法判定,所以都当作拥塞处理),就把慢开始门限设置为出现拥塞时的发送窗口的一半,然后把拥塞窗口设置为1,执行慢开始算法:

    此外,还有快速重传和快速恢复,停止-等待协议,回退N帧协议,选择重传协议等。 

    二、UDP协议:

    无连接协议,也称透明协议,也位于传输层。

    两者区别:

    1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。


    三、长连接和短连接

           HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

    在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

    而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

    Connection:keep-alive
    

    在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

    HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

    https://www.cnblogs.com/gotodsp/p/6366163.html

    此外,如果想更进一步学习网络相关的知识,可以参照:https://blog.csdn.net/striveb/article/details/84062700

     

    觉得有收获的,可以来一波赞赏!

    展开全文
  • TCP 和 UDP 的区别

    万次阅读 多人点赞 2018-08-04 21:57:42
    顺序问题和丢问题 流量控制的问题 拥塞控制的问题 总结及面试问题 前言 前端的面试中经常问的 TCP 和 UDP 的区别,网上也有好多内容,比如 TCP 和 UDP 的区别 TCP 是面向连接的,UDP 是面向无...

    前言

    前端的面试中经常问的 TCP 和 UDP 的区别,网上也有好多内容,比如

    TCP 和 UDP 的区别

    • TCP 是面向连接的,UDP 是面向无连接的
    • UDP程序结构较简单
    • TCP 是面向字节流的,UDP 是基于数据报的
    • TCP 保证数据正确性,UDP 可能丢包
    • TCP 保证数据顺序,UDP 不保证

    之前也因为面试的原因了解过一下,但是面试官又问了为什么 TCP 是可靠传输,一下就露馅了,说不出来了,然后这两天就仔细了解了一下这方面的内容,还专门订阅了极客时间的趣谈网络协议,因此,这篇文章主要基于趣谈网络协议和自己的理解。

    1. UDP

    要想理解 TCP 和 UDP 的区别,首先要明白什么是 TCP,什么是 UDP

    TCP 和 UDP 是传输层的两个协议

    我们来看一下 UDP 的包头
    UDP 包头
    由上图可以看出,UDP 除了端口号,基本啥都没有了。如果没有这两个端口号,数据就不知道该发给哪个应用。

    所以 UDP 就像一个小孩子,特别简单,有如下三个特点

    UDP 的特点

    • 沟通简单,不需要大量的数据结构,处理逻辑和包头字段
    • 轻信他人。它不会建立连接,但是会监听这个地方,谁都可以传给它数据,它也可以传给任何人数据,甚至可以同时传给多个人数据。
    • 愣头青,做事不懂变通。不会根据网络的情况进行拥塞控制,无论是否丢包,它该怎么发还是怎么发

    因为 UDP 是"小孩子",所以处理的是一些没那么难的项目,并且就算失败的也能接收。基于这些特点的话,UDP 可以使用在如下场景中

    UDP 的主要应用场景

    • 需要资源少,网络情况稳定的内网,或者对于丢包不敏感的应用,比如 DHCP 就是基于 UDP 协议的。
    • 不需要一对一沟通,建立连接,而是可以广播的应用。因为它不面向连接,所以可以做到一对多,承担广播或者多播的协议。
    • 需要处理速度快,可以容忍丢包,但是即使网络拥塞,也毫不退缩,一往无前的时候

    基于 UDP 的几个例子

    • 直播。直播对实时性的要求比较高,宁可丢包,也不要卡顿的,所以很多直播应用都基于 UDP 实现了自己的视频传输协议
    • 实时游戏。游戏的特点也是实时性比较高,在这种情况下,采用自定义的可靠的 UDP 协议,自定义重传策略,能够把产生的延迟降到最低,减少网络问题对游戏造成的影响
    • 物联网。一方面,物联网领域中断资源少,很可能知识个很小的嵌入式系统,而维护 TCP 协议的代价太大了;另一方面,物联网对实时性的要求也特别高。比如 Google 旗下的 Nest 简历 Thread Group,推出了物联网通信协议 Thread,就是基于 UDP 协议的

    还有一些,但是写的太多了也记不住,所以主要记住这几个就够了

    2. TCP

    首先是 TCP 的包头格式
    TCP 包头

    TCP 的包头有哪些内容,分别有什么用

    • 首先,源端口和目标端口是不可少的。
    • 接下来是包的序号。主要是为了解决乱序问题。不编好号怎么知道哪个先来,哪个后到
    • 确认序号。发出去的包应该有确认,这样能知道对方是否收到,如果没收到就应该重新发送,这个解决的是不丢包的问题
    • 状态位。SYN 是发起一个链接,ACK 是回复,RST 是重新连接,FIN 是结束连接。因为 TCP 是面向连接的,因此需要双方维护连接的状态,这些状态位的包会引起双方的状态变更
    • 窗口大小,TCP 要做流量控制,需要通信双方各声明一个窗口,标识自己当前的处理能力。

    通过对 TCP 头的解析,我们知道要掌握 TCP 协议,应该重点关注以下问题:

    • 顺序问题
    • 丢包问题
    • 连接维护
    • 流量控制
    • 拥塞控制

    2.1 TCP 的三次握手

    所有的问题,首先都要建立连接,所以首先是连接维护的问题

    TCP 的建立连接称为三次握手,可以简单理解为下面这种情况

    A:您好,我是 A
    B:您好 A,我是 B
    A:您好 B

    至于为什么是三次握手我这里就不细讲了,可以看其他人的博客,总结的话就是通信双方全都有来有回

    对于 A 来说它发出请求,并收到了 B 的响应,对于 B 来说它响应了 A 的请求,并且也接收到了响应。

    TCP 的三次握手除了建立连接外,主要还是为了沟通 TCP 包的序号问题。

    A 告诉 B,我发起的包的序号是从哪个号开始的,B 同样也告诉 A,B 发起的 包的序号是从哪个号开始的。

    双方建立连接之后需要共同维护一个状态机,在建立连接的过程中,双方的状态变化时序图如下所示
    状态变化时序图
    这是网上经常见到的一张图,刚开始的时候,客户端和服务器都处于 CLOSED 状态,先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。服务端接收了发起的连接,返回 SYN,并且 ACK ( 确认 ) 客户端的 SYN,之后处于 SYN-SENT 状态。客户端接收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后就处于 ESTAVLISHED 状态,因为它一发一收成功了。服务端收到 ACK 的 ACK 之后,也处于 ESTABLISHED 状态,因为它也一发一收了。

    2.2 TCP 四次挥手

    说完建立连接,再说下断开连接,也被称为四次挥手,可以简单理解如下

    A:B 啊,我不想玩了
    B:哦,你不想玩了啊,我知道了
    这个时候,只是 A 不想玩了,即不再发送数据,但是 B 可能还有未发送完的数据,所以需要等待 B 也主动关闭。
    B:A 啊,好吧,我也不玩了,拜拜
    A:好的,拜拜

    这样整个连接就关闭了,当然上面只是正常的状态,也有些非正常的状态(比如 A 说完不玩了,直接跑路,B 发起的结束得不到 A 的回答,不知道该怎么办或则 B 直接跑路 A 不知道该怎么办),TCP 协议专门设计了几个状态来处理这些非正常状态
    断开连接状态时序图
    断开的时候,当 A 说不玩了,就进入 FIN_WAIT_1 的状态,B 收到 A 不玩了的消息后,进入 CLOSE_WAIT 的状态。

    A 收到 B 说知道了,就进入 FIN_WAIT_2 的状态,如果 B 直接跑路,则 A 永远处与这个状态。TCP 协议里面并没有对这个状态的处理,但 Linux 有,可以调整 tcp_fin_timeout 这个参数,设置一个超时时间。

    如果 B 没有跑路,A 接收到 B 的不玩了请求之后,从 FIN_WAIT_2 状态结束,按说 A 可以跑路了,但是如果 B 没有接收到 A 跑路的 ACK 呢,就再也接收不到了,所以这时候 A 需要等待一段时间,因为如果 B 没接收到 A 的 ACK 的话会重新发送给 A,所以 A 的等待时间需要足够长。

    2.3 累计确认

    TCP 如何实现可靠传输?

    首先为了保证顺序性,每个包都有一个 ID。在建立连接的时候会商定起始 ID 是什么,然后按照 ID 一个个发送,为了保证不丢包,需要对发送的包都要进行应答,当然,这个应答不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式成为累计应答累计确认

    为了记录所有发送的包和接收的包,TCP 需要发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分

    • 发送并且确认的
    • 发送尚未确认的
    • 没有发送等待发送的
    • 没有发送并且暂时不会发送的

    这里的第三部分和第四部分就属于流量控制的内容

    在 TCP 里,接收端会给发送端报一个窗口大小,叫 Advertised window。这个窗口应该等于上面的第二部分加上第三部分,超过这个窗口,接收端做不过来,就不能发送了

    于是,发送端要保持下面的数据结构
    发送端数据结构
    对于接收端来讲,它的缓存里面的内容要简单一些

    • 接收并且确认过的
    • 还没接收,但是马上就能接收的
    • 还没接收,但也无法接收的

    对应的数据结构如下
    接收端的数据结构

    2.4 顺序问题和丢包问题

    结合上面的图看,在发送端,1、2、3 已发送并确认;4、5、6、7、8、9 都是发送了还没确认;10、11、12 是还没发出的;13、14、15 是接收方没有空间,不准备发的。

    在接收端来看,1、2、3、4、5 是已经完成 ACK 但是还没读取的;6、7 是等待接收的;8、9 是已经接收还没有 ACK 的。

    发送端和接收端当前的状态如下:

    • 1、2、3 没有问题,双方达成了一致
    • 4、5 接收方说 ACK 了,但是发送方还没收到
    • 6、7、8、9 肯定都发了,但是 8、9 已经到了,6、7 没到,出现了乱序,缓存着但是没办法 ACK。

    根据这个例子可以知道顺序问题和丢包问题都有可能存在,所以我们先来看确认与重传机制

    假设 4 的确认收到了,5 的 ACK 丢了,6、7 的数据包丢了,该怎么办?

    一种方法是超时重试,即对每一个发送了但是没有 ACK 的包设定一个定时器,超过了一定的事件就重新尝试。这个时间必须大于往返时间,但也不宜过长,否则超时时间变长,访问就变慢了。

    如果过一段时间,5、6、7 都超时了就会重新发送。接收方发现 5 原来接收过,于是丢弃 5;6 收到了,发送 ACK,要求下一个是 7,7 不幸又丢了。当 7 再次超时的时候,TCP 的策略是超时间隔加倍。每当遇到一次超时重传的时候,都会讲下一次超时时间间隔设为先前值的两倍。

    超时重传的机制是超时周期可能相对较长,是否有更快的方式呢?

    有一个快速重传的机制,即当接收方接收到一个序号大于期望的报文段时,就检测到了数据流之间的间隔,于是发送三个冗余的 ACK,客户端接收到之后,知道数据报丢失,于是重传丢失的报文段。

    例如,接收方发现 6、8、9 都接收了,但是 7 没来,所以肯定丢了,于是发送三个 6 的 ACK,要求下一个是 7。客户端接收到 3 个,就会发现 7 的确又丢了,不等超时,马上重发。

    2.5 流量控制的问题

    在流量控制的机制里面,在对于包的确认中,会携带一个窗口的大小

    简单的说一下就是接收端在发送 ACK 的时候会带上缓冲区的窗口大小,但是一般在窗口达到一定大小才会更新窗口,因为每次都更新的话,刚空下来就又被填满了

    2.6 拥塞控制的问题

    也是通过窗口的大小来控制的,但是检测网络满不满是个挺难的事情,所以 TCP 发送包经常被比喻成往谁管理灌水,所以拥塞控制就是在不堵塞,不丢包的情况下尽可能的发挥带宽。

    水管有粗细,网络有带宽,即每秒钟能发送多少数据;水管有长度,端到端有时延。理想状态下,水管里面的水 = 水管粗细 * 水管长度。对于网络上,通道的容量 = 带宽 * 往返时延。

    如果我们设置发送窗口,使得发送但未确认的包为通道的容量,就能撑满整个管道。

    如图所示,假设往返时间为 8 秒,去 4 秒,回 4 秒,每秒发送一个包,已经过去了 8 秒,则 8 个包都发出去了,其中前四个已经到达接收端,但是 ACK 还没返回,不能算发送成功,5-8 后四个包还在路上,还没被接收,这个时候,管道正好撑满,在发送端,已发送未确认的 8 个包,正好等于带宽,也即每秒发送一个包,也即每秒发送一个包,乘以来回时间 8 秒。

    如果在这个基础上调大窗口,使得单位时间可以发送更多的包,那么会出现接收端处理不过来,多出来的包会被丢弃,这个时候,我们可以增加一个缓存,但是缓存里面的包 4 秒内肯定达不到接收端课,它的缺点会增加时延,如果时延达到一定程度就会超时重传

    TCP 拥塞控制主要来避免两种现象,包丢失和超时重传,一旦出现了这些现象说明发送的太快了,要慢一点。

    具体的方法就是发送端慢启动,比如倒水,刚开始倒的很慢,渐渐变快。然后设置一个阈值,当超过这个值的时候就要慢下来

    慢下来还是在增长,这时候就可能水满则溢,出现拥塞,需要降低倒水的速度,等水慢慢渗下去。

    拥塞的一种表现是丢包,需要超时重传,这个时候,采用快速重传算法,将当前速度变为一半。所以速度还是在比较高的值,也没有一夜回到解放前。

    总结及面试问题

    TCP 和 UDP 的区别

    • TCP 是面向连接的,UDP 是面向无连接的
    • UDP程序结构较简单
    • TCP 是面向字节流的,UDP 是基于数据报的
    • TCP 保证数据正确性,UDP 可能丢包
    • TCP 保证数据顺序,UDP 不保证

    什么是面向连接,什么是面向无连接

    在互通之前,面向连接的协议会先建立连接,如 TCP 有三次握手,而 UDP 不会

    TCP 为什么是可靠连接

    • 通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。
    • TCP 报文头里面的序号能使 TCP 的数据按序到达
    • 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
    • TCP 拥有流量控制及拥塞控制的机制

    TCP 的顺序问题,丢包问题,流量控制都是通过滑动窗口来解决的
    拥塞控制时通过拥塞窗口来解决的

    展开全文
  • UDP协议

    万次阅读 多人点赞 2017-06-21 12:31:05
    用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP提供了无连接通信,且不对传送...

    UDP协议

    UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。

    UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
    UDP在IP报文中的位置如下图所示:
    这里写图片描述
    可以看到,UDP其实就是在IP报文中添加了端口信息,使数据到达主机后送达至相应端口的应用程序。下面是通过wireshark抓的一个UDP数据包:
    在这里插入图片描述


    UDP使用

    在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的QQ就是使用的UDP协议。

    既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。


    UDP报头

    UDP报头由4个域组成,其中每个域各占用2个字节,如下图所示:
    这里写图片描述

    • UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。*因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。*一般来说,大于49151的端口号都代表动态端口。

    • 数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。(对于一次发送多少字节比较好,后面会讲到)

    • UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。

    • 许多链路层协议都提供错误检查,包括流行的以太网协议,也许你想知道为什么UDP也要提供检查和校验。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。


    UDP特性

    UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

    由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

    UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

    吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

    UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

    UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。


    对UDP一次发送多少bytes好?问题的思考

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案。相对于不同的系统,不同的要求,其得到的答案是不一样的。我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,或许也能得到一点帮助。

    首先,我们知道TCP/IP通常被认为是一个四层协议系统,包括链路层、网络层、传输层、应用层。UDP属于传输层,下面我们由下至上一步一步来看: 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。 这个1500字节被称为链路层的MTU(最大传输单元)。 但这并不是指链路层的长度被限制在1500字节,其实这个MTU指的是链路层的数据区并不包括链路层的首部和尾部的18个字节。所以事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数。

    当我们发送的UDP数据大于1472的时候会怎样呢? 这也就是说IP数据报大于1500字节,大于MTU。这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU。而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,无法重组数据报,将导致丢弃整个UDP数据报。因此,在普通的局域网环境下,建议将UDP的数据控制在1472字节以下为好。

    进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值. 如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作. 鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时. 最好将UDP的数据长度控件在548字节(576-8-20)以内.


    UDP协议:低开销通信

    UDP是一种简单协议,提供了基本的传输层功能。与TCP相比,UDP的开销极低,因为UDP是无连接的,并且不提供复杂的重新传输、排序和流量控制机制。

    UDP数据报重组

    与TCP的通信机制不同,由于UDP是无连接协议,因此通信发生之前不会建立会话。UDP是基于事务的,换言之,应用程序要发送数据时,它仅是发送数据而已。很多使用UDP的应用程序发送的数据量很小,用一个数据段就够了。但是也有一些应用程序需要发送大量数据,因此需要用多个数据段。UDP PDU(协议数据单元)的实际意义是数据报,尽管数据段和数据报可以互换使用来描述某个传输层PDU。

    	将多个数据报发送到目的主机时,它们可能使用了不同的路径,到达顺序也可能跟发送时的顺序不同。与TCP不同,UDP不跟踪序列号。UDP不会对数据报重组,因此也不会将数据恢复到传输时的顺序。
    	因此,UDP仅仅是将接收到的数据按照先来后到的顺序转发到应用程序。如果数据的顺序对应用程序很重要,那么应用程序只能自己标志数据的正确顺序,并决定如何处理这些数据。
    

    UDP服务器进程与请求

    与基于TCP的应用程序相同的是,基于UDP的服务器应用程序也被分配了公认端口或已注册的端口。当上述应用程序或进程运行时,它们就会接受与所分配端口相匹配的数据。当UDP收到用于某个端口的数据报时,它就会按照应用程序的端口号将数据发送到相应的应用程序。

    UDP客户端进程

    对于TCP而言,客户端/服务器模式的通信初始化采用由客户端应用程序向服务器进程请求数据的形式。而UDP客户端进程则是从动态可用端口中随机挑选一个端口号,用来作为会话的源端口。而目的端口通常都是分配到服务器进程的公认端口或已注册的端口。

    采用随机的源端口号的另一个优点是提高安全性。如果目的端口的选择方式容易预测,那么网络入侵者很容易就可以通过尝试最可能开放的端口号访问客户端。

    由于UDP不建立会话,因此一旦数据和端口号准备就绪,UDP就可以生成数据报并递交给网络层,并在网络上寻址和发送。

    需要谨记的是,客户端选定了源端口和目的端口后,通信事务中的所有数据报文头都采用相同的端口对。对于从服务器到达客户端的数据来说,数据报头所含的源端口和目的端口作了互换。

    展开全文
  • Python使用UDP实现720p视频传输

    千次阅读 多人点赞 2019-02-05 18:27:00
    使用UDP完成720p以上高清视频传输1. 项目背景2. 解决方案3. 实现细节3.1 TCP/UDP的选择3.2 图片分片算法3.3 JPG压缩3.4 接收队列4. 遇到的坑及解决办法4.1. Windows防火墙4.2. 路由器网络频段4.3. Wifi配置4.4. 硬件...
  • 终于懂了TCP和UDP协议区别

    万次阅读 多人点赞 2020-03-26 12:03:28
    终于懂了TCP和UDP协议区别
  • UDP 发包工具

    热门讨论 2011-10-19 22:19:11
    UDP 的一个简单的发包软件。UDPEcho
  • 基于UDP协议的简单基本视频传输程序的编写

    万次阅读 热门讨论 2013-06-18 10:57:16
    一、UDP协议 UDP是User Datagram ...正是由于UDP协议不关心网络数据传输的一系列状态,使得UDP协议在数据传输过程中节省了大量的网络状态确认和数据确认的系统资源消耗,大大提高UDP协议的传输效率,传输速度快。TCP
  • IP头、TCP头、UDP头详解以及定义

    万次阅读 多人点赞 2013-01-24 13:47:25
    一、MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6]; //目的mac地址  char m_cSrcMacAddress[6]; //源mac地址  short m_cType;...
  • 视频数据传输传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的。TCP传输的好处是不丢,坏处是网络不太好的情况下会越堵越严重。UDP非面向连接,发送端只管发送数据,接收端有没有接收到不管。...
  • UDP

    千次阅读 2018-08-13 22:54:34
     用户数据保协议(User Datagram Protocol,UDP)是开放系统互联模型(Open System Interconnection,OSI)中传输层协议的一种,是一种保留消息边界的简单的面向数据报的协议。UDP不提供差错纠正、队列管理、重复...
  • 7. 传输层协议(TCP、UDP

    万次阅读 2020-09-07 01:54:58
    TCP(Transmission Control Protocol)传输控制协议; TCP报文结构; TCP三次握手; TCP重传机制; TCP四次挥手; TCP端口号; UDP(User Datagram Protocol)用户数据协议; UDP报文结构。
  • 简单的包传输客户端向服务端发送数据包,服务端打印出来。 我们来传送一首诗吧,柳永的《雨霖铃》 服务端:#include &lt;stdio.h&gt; #include &lt;sys/socket.h&gt; #include &lt;sys/types....
  • UDP主要丢原因及具体问题分析

    万次阅读 2015-08-28 00:20:44
    UDP主要丢原因及具体问题分析   一、主要丢原因   1、接收端处理时间过长导致丢:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的可能...
  • TCP和UDP的区别和优缺点

    万次阅读 多人点赞 2017-08-06 20:32:16
    1、TCP与UDP区别总结: 1、TCP面向连接(如打电话要先拨号建立连接);...Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢时的重发控制,还可以对次序乱掉的分包进行顺序控制。
  • UDP编程中,为什么服务器不能向客户端发送消息呢,客户端也不能接收服务器发送的消息? 服务器代码: import java.net.*; public class Server2 { public static void main(String[] args) { ...
  • udp可靠传输那些事之游戏篇

    千次阅读 2018-01-03 11:01:48
    这篇文章是udp可靠传输那些事的续篇,针对udp可靠传输在游戏类的应用的优点和缺点以及原理,进行了详细的分析.
  • TCP和UDP的最完整的区别

    万次阅读 多人点赞 2016-08-04 11:30:30
    TCP和UDP两种协议的比较汇总
  • QT下的udp视频传输系统 前段时间工作著 本文只为记录思路,若想认真学会开发请参考 参考资料和官方文档 ...框图是从需求里面来的,那我自然是奔着视频流传输去的,但是在底层的硬件配置摄像头的过程中,...
  • 网络协议 -- UDP协议(1)介绍

    万次阅读 多人点赞 2017-12-28 16:12:59
    UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP的正式规范是IETF RFC768。UDP在IP报文的...
  • UDP可靠传输那些事

    2017-07-06 16:12:37
    有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法。  udp可靠传输其实非常非常的...
  • TCP与UDP区别详解

    千次阅读 多人点赞 2020-05-19 21:23:53
    TCP与UDP区别详解 计算机与其他网络设备相互通信,通信的双方在发送和接收数据包时必须基于相同的规则...这些协议在计算机网络中自下而上被划分为四层:链路层、网络层、传输层和应用层。 链路层: 负责发送和接收ARP/
  • UDP协议抓分析

    千次阅读 2019-05-22 17:10:25
    UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接传输服务。他也不提供报文到达确认、排序及流量控制等功能。 (1)UDP是一个无连接协议,也就是传输数据之前源端口和目标端口不能建立连接。当它想...
  • UDP是一种保留消息边界的简单的面向数据报的传输层协议 UDP特性 它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制 不提供差错纠正:它把应用程序传给IP层的数据发送出去,但是并不保证它们能够到达...
  • udp包最大数据长度是多少

    千次阅读 2018-12-26 15:35:44
    每个udp包的最大大小是多少?  65507 约等于 64K 为什么最大是65507?  因为udp包头有2个byte用于记录体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535  udp包头占8字节, ip包头占20字节, ...
  • 终于把TCP协议与UDP协议给整明白了

    万次阅读 多人点赞 2020-07-04 21:35:16
    网络编程有三个要素,分别是IP地址、端口号和通信协议,本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现。
  • 本人新手,正做一个UDP跨路由通信项目,遇如下问题:服务端(192.168.0.85)与路由器在同一网段,客户端(192.168.1.103)在该路由器组成的局域网内,现服务端可以接收到客户端发送的UDP包,但客户端无法收到服务端...
  • UDP协议传输详解

    2019-08-22 09:10:28
    UDP协议视频传输 TCP/IP协议族是一组不同的协议组合在一起构成的协议族,尽管通常称该协议族为TCP/IP,但TCP和IP只是其中的两种协议而已(该协议族的另一个名字是Internet协议族(Internet Protocol Suite))。 TCP...
  • UDP理解及UDP的MATLAB实现 Matlab UDP

    千次阅读 2020-04-14 16:04:01
    UDP理解及UDP的MATLAB实现一、UDP通信方式理解1、...UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服...
  • UDP协议的详细解析

    万次阅读 多人点赞 2018-12-26 17:16:34
    UDP数据报 一、UDP的概述 二、UDP的首部格式 UDP校验

空空如也

1 2 3 4 5 ... 20
收藏数 423,481
精华内容 169,392
关键字:

udp是流传输还是包传输