传输层协议UDP

2024-09-07 01:12
文章标签 协议 udp 传输层

本文主要是介绍传输层协议UDP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        本篇将主要介绍 UDP 协议,介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项,以及有关 UDP 的 Socket 编程程序,同时重点介绍了操作系统对于 UDP 协议报文的管理。

        接着介绍了有关端口号的映射。

目录

UDP协议

1. UDP协议报头

2. UDP协议特点

3. UDP的缓冲区

4. OS对UDP报文的管理

4. UDP 使用的注意事项

5. 基于UDP的应用层协议

6. 基于UDP协议的程序 

端口号的映射

1. 端口号范围划分

2. 端口号与进程的映射

UDP协议

        对于 UDP 报文的格式如下:

1. UDP协议报头

        对于如上 UDP 报文,分别由 16 位的源端口,目的端口,UDP 长度以及 UDP 校验和组成,这样的一个组成在 Linux 源码其实也已经将其抽象为了一个结构体,如下:

        对于 16 位 UDP 长度,表示整个数据报(首部 + 数据)的最大长度;若校验和出错,就会直接将该 UDP 数据包给丢弃。

        通过如上的 UDP 报文结构我们也可以得出,若我们想要将报头和有效载荷进行分离,只需要将前 8 个字节截断即可,因为这是固定长度的报头。当需要将数据向应用层进行分用的时候只需要通过 16 位目的端口和进程的映射就可以直接将数据传输上去。

        那么我们在接收对应的 UDP 报文数据之后,如何轻易的拿到首部中的四个数据呢?我们只需要使用一个 struct udphdr * 一样的指针接收对应的报文,然后就可以拿出对应的四个首部数据了,通过该方法拿出数据,我们只需要注意网络序列的转化,不用担心在不同的操作系统下不兼容的情况,因为所有的操作需求都是由 C 语言写的。

2. UDP协议特点

        UDP 传输协议一共有以下 3 个特点:

无连接:只要知道对方的 IP 和 PORT 就可以直接进行传输,不需要双向进行连接不可靠:没有数据确认机制,没有数据丢失后的重传机制,如果因为网络故障该段无法发送到对方,UDP 协议层也不会给应用层返回任何的错误信息面向数据报:不能够灵活的控制读写数据的次数和数量

         对于以上的不可靠并不能代表这是 UDP 协议的一个缺点,最好将其认识为 UDP 数据报的一个特点,因为不可靠的同时,带来的是传输速率的提高。

        对于面向数据报而言,每一个数据报都是独立的个体,也就是应用层向下发送多大的数据,UDP 就包装多大的数据,并不会将传下来的数据拆分或者合并后在封装(同时,如果在发送端调用 sendto 发送了 100 个字节,那么接收端也必须使用 recvfrom 一次接收 100 个字节的数据,不能分多次来接收)。

3. UDP的缓冲区

        UDP 没有真正意义上的缓冲区,当我们调用 sendto 会直接交给内核处理,由内核将数据传给网络层协议进行后续的传输动作。

        UDP 具有接收缓冲区,但是这个接收缓冲区并不能保证收到的 UDP 报文的顺序和发送 UDP 报的顺序一致,同时,若接收缓冲区满了,再达到的 UDP 的数据就会被丢弃。

4. OS对UDP报文的管理

        我们的传输层是属于操作系统内核中的,同时说明对于 UDP 协议的接收缓冲区也是在 OS 中的,在操作系统中可能有着很多的 UDP 数据报在其中,有的数据报存储在缓冲区中准备向上交付,有的数据报正从上层向下传输,这个时候 OS 中充满了 UDP 数据报,这个时候 OS 就会对其进行管理,使用 struct sk_buff 结构体对 UDP 数据报进行管理,管理方法如下:

        在操作系统内会存在一个管理 UDP 数据报的一个结构体 struct sk_buff,同时这个结构体还有一个缓冲区,结构体中的 head 和 data 指针起初都是指向缓冲区的中间,当有数据从应用层向下交付的时候,先将数据拷贝到缓冲区,然后 head 指针向前移动 8 个字节,接着将 UDP 首部的四个数据给填充即可,同时这样的 sk_buff 结构体不止一个,每个结构体之间使用指针相连接,如下:

4. UDP 使用的注意事项

        我们在 UDP 报头中有一个 16 位的报文长度,也就是说对于一个 UDP 能传输的数据最大长度为 64K(包含首部)。但是在当今的互联网环境下,64K 的数据是一个很小的数据量,所以当我们需要传输的数据超过 64K 的时候,就需要在应用层将数据手动分包,分多次发送,并在接收端手动拼装。

5. 基于UDP的应用层协议

        常见的基于 UDP 协议的应用层协议如下:

NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议

        同时还包括自己写的基于 UDP 协议的程序。

6. 基于UDP协议的程序 

        如下是一个基于 UDP 协议写的三个程序:UDP/TCP --- Socket编程-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_74830524/article/details/141218715?spm=1001.2014.3001.5501        以上链接便是写的三个程序。

端口号的映射

        对于端口号而言,它标识了一个主机上进行通信的不同的应用程序。特别是在 TCP/IP 协议中,用:源 IP + 源端口号 + 目的 IP + 目的端口号 + 协议号 这五元组来标识一个通信,如下:

1. 端口号范围划分

        对于端口号而言都是 16 位的一个数据,所以一个端口号的范围为:0 ~ 65535,但是其中也分为知名端口号和普通端口号。如下:

0 - 1023:知名端口号,HTTP、FTP、SSH 等这些广为使用的应用层协议,他们的端口都是固定的
1024 - 65535:操作系统动态分配的端口号,客户端程序的端口号,就是操作系统从这个范围分配的

        对于知名端口号而言,我们平时写的程序并不能绑定这些端口号,如下:        

        当想要绑定知名端口号的时候,就会显示权限不够,只有当使用 root 权限才能绑定知名端口。

        其中常见的知名端口号有以下这些:

ssh 服务器:使用22号端口
ftp 服务器:使用21号端口
telnet 服务器:使用23号端口
http 服务器:使用80号端口
https 服务器:使用443号端口

        使用命令 cat /etc/services 就可以看见知名端口号:

2. 端口号与进程的映射

        一个端口号只可以绑定一个进程,但是一个进程可以绑定多个端口,如下:

        如上所示,对于端口号而言其实就像一个已经安排的 hash 表,在表中存储着对应的进程,当传输信息向上传递的时候,找到对应的端口之后就可以直接找到与端口绑定的进程。

这篇关于传输层协议UDP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143641

相关文章

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

9.7(UDP局域网多客户端聊天室)

服务器端 #include<myhead.h>#define SERIP "192.168.0.132"#define SERPORT 8888#define MAX 50//定义用户结构体typedef struct{struct sockaddr_in addr;int flag;}User;User users[MAX];//用户列表void add_user(struct s

HTTP协议 HTTPS协议 MQTT协议介绍

目录 一.HTTP协议 1. HTTP 协议介绍 基本介绍: 协议:  注意: 2. HTTP 协议的工作过程 基础术语: 客户端: 主动发起网络请求的一端 服务器: 被动接收网络请求的一端 请求: 客户端给服务器发送的数据 响应: 服务器给客户端返回的数据 HTTP 协议的重要特点: 一发一收,一问一答 注意: 网络编程中,除了一发一收之外,还有其它的模式 二.HTT