传输层——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的主要内容,如果未能解决你的问题,请参考以下文章

传输层——UDP

用UDP实现可靠传输

Linux-UDP协议(传输层协议)-知名端口-UDP协议特点-UDP协议格式

传输层 —— UDP协议

传输层协议(TCP, UDP)

传输层协议之TCP/UDP