传输层——UDP
Posted Shemesz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传输层——UDP相关的知识,希望对你有一定的参考价值。
传输层
一、传输层概述
1.1 传输层简介
这一层在之前的博客中简单介绍了一下,传输层提供端对端
通信服务,通俗的讲,两个主机通信,就是应用层上两个进程之间的通信。
在网络层中,IP协议能分组准确的将数据发送到目的IP地址,那目的IP地址又怎么知道具体要交给哪一个主机呢?数据链路层的MAC地址又可以确定要将数据具体交付到同一网关下的目的主机
。
通过ip地址能找到不同网络下的网络,结合mac地址就能找到对应主机
,那么又如何确定主机里的哪个应用进程呢?此时就要用到一个重要的东西——端口
1.2 端口
每一个的需要用网络通信的程序都会占用一个端口,当操作系统从网络上接收到一个数据包之后,他会根据报文的目的端口号来决定这个数据包要给哪一个应用程序,这样一个端口只能被一个应用程序占用使用;
- 端口
占有16位,其大小也就有65536个,是从0~65535.也就是一台计算机有65535个端口,其中1024以下的端口为众所周知的端口。
进程A和进程B通信,进程A分到的端口为60000,进程B分到的端口为60001,进程A通过端口60000发送数据给进程B,就知道要交给60001端口,也就到了进程B中 ,这样就达到了通信的目的。
1.3 常见端口
1024以下的端口已经被分配给了一些常用的服务:
- FTP(20/21)
- SSH(22)
- telnet(23)
- smtp(25)
- DNS(53)
- DHCP (67/68)
- tftp(69)
- www/http(80)
- ntp(123)
- snmp (161)
- https (443)
注意
:在Linux下使用1024以下端口的应用程序都是需要root权限去操作的,另外也可以通过netstart命令去查看哪些端口正在被使用.
知道了端口是什么?运输层具体做了什么事情呢?运输层就是将两个端口连起来通信的介质
,不然光知道两个端口有什么用,怎么通信的,还是要靠运输层来做这个事情,其中重要的就是靠两个协议,UDP和TCP
协议。
二、UDP协议
2.1 UDP概述
UDP:User Datagram Protocol 用户数据报协议
2.1 UDP特点
- UDP与
手机收发短信
相似,是非面向连接
、不可靠
的数据报文协议 - 建立连接:是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性;
非面向连接 :意思就是在
通讯之前不需要建立连接,直接传输数据
。
不可靠:是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端
,任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能
,当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个ICMP 差错报文
给源主机。即使出现网络阻塞情况,
UDP 也无法进行流量控制
。此外,传输途中即使出现丢包,UDP 也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。
在UDP协议下,虽然可以确保发送消息的大小,但是不能保证能一定送达。因此应用有的时候会根据自己的需要进行重发处理。
2.3 UDP报文格式
1)UDP首部
- 源端口号:占16位,源主机的应用进程所使用的端口号
- 目标端口号:占16位,目标主机的应用进程所使用的端口号,也就是我们需要通信的目标进程
- UDP(包)报长度:UDP用户数据报的长度,数据部分+UDP首部之和为UDP报长度。
- 检验和:检验和是为了提供可靠的 UDP 首部和数据而设计,这里不要和上面的不可靠传输搞混淆了,这里提供可靠的UDP首部,是因为一个进程可能接受多个进程过来的报文,那么如何
区分他们呢,就是通过5个东西来进行区分的, “源 IP 地址”、“目的 IP 地址”、“协议号”、“源端口号”、“目标端口号”
的,这个检测可靠,是检测接受哪个正确的报文,也就是说是哪个报文要进这个端口。那个不可靠,说的是这个报文可能丢失,可能其中数据损坏了我们不关心,但是这些的前提是,你得传输到正确的目的地去,不然乱出乱发数据报,岂不是乱套了。
2)UDP伪首部
就是
拿到IP层的一些数据,因为要进行检验和
,就必须要有这些数据。其中检验的算法跟IP层中检验首部的办法是一样的。
- 分析:
一个目标进程中,其中的报文,目标端口,目标ip地址肯定都是一样的
,但是源IP地址和源端口就可能不一样
,这就说明了不同源而同一目的地的报文会定位到同一队列
。
2.4 UDP使用场景
1)UDP的三大使用场景
- 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用;
- 不需要一对一沟通,建立连接,而是可以广播的应用;UDP的不面向连接的功能,可以使得可以承载广播或者多播的协议。DHCP就是一种广播的形式,就是基于UDP协议的;
- 需要处理速度快,时延低,可以容忍少数丢包,即便网络堵塞,也毫不退缩,一往无前的时候;UDP简单、处理速度快,不像TCP一样,操那么多心;TCP在网络不好出现丢包的时候,拥塞控制策略会主动的退缩,降低发送速度,这就相当于本来环境就差,还自断臂膀,用户本来就卡,这下更卡了
2)基于UDP的实际应用
- 网页或者APP的访问:访问网页和手机APP都是基于HTTP协议(基于TCP)的,建立连接需要多次交互,比较耗时,Google提出了QUIC实现快速连接建立、减少重传时延,自适应拥塞控制;
- 流媒体的协议:直播协议多使用RTMP(基于TCP),当数据丢包或者网络不好,影响直播的实时性,很多直播应用,都基于UDP实现了自己的视频传输协议;
- 实时游戏:采用自定义的可靠UDP协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响;
- IoT物联网:物联网通信协议Thread,就是基于UDP协议的,解决了物联网领域终端资源少,实时性要求高的问题;
- 移动通信领域:4G网络里,移动流量上网的数据面对的协议GTP-U是基于UDP的;
这跟接下来我们要讨论的TCP不一样,因为UDP是无连接的,大家都是用这一条通道,所以其队列中就会出现上面所说的这样的情况。
TCP的介绍就另写一篇博客来介绍:TCP(三路握手与四路挥手)(点击这里)
以上是关于传输层——UDP的主要内容,如果未能解决你的问题,请参考以下文章