UDP协议

文章目录

  • UDP协议
    • [1. 传输层](#1. 传输层)
      • [1.1 再谈端口号](#1.1 再谈端口号)
        • [(1) 端口号范围划分](#(1) 端口号范围划分)
        • [(2) 认识知名端口号](#(2) 认识知名端口号)
        • [(3) 两个问题](#(3) 两个问题)
        • [(4) netstat](#(4) netstat)
        • [(5) pidof](#(5) pidof)
    • [2. UDP协议](#2. UDP协议)
      • [2.1 UDP协议端格式](#2.1 UDP协议端格式)
        • [(1) 2个核心问题(解包与分用)](#(1) 2个核心问题(解包与分用))
        • [(2) 深入理解UDP协议](#(2) 深入理解UDP协议)
      • [2.2 UDP的特点](#2.2 UDP的特点)
      • [2.3 UDP的缓冲区](#2.3 UDP的缓冲区)
      • [2.4 UDP使用注意事项](#2.4 UDP使用注意事项)
      • [2.5 基于UDP的应用层协议](#2.5 基于UDP的应用层协议)
      • [2.5 基于UDP的应用层协议](#2.5 基于UDP的应用层协议)

UDP协议

1. 传输层

我们前面学习的HTTP,HTTPS是基于应用层的协议,实际发送数据时是把数据向下交付给传输层,传输层对数据处理后再向下交付,贯穿整个协议栈,才能把数据发送到网络中。传输层在这里的作用:提供传输策略,负责数据能够从发送端传输接收端。

1.1 再谈端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序;

在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过netstat -n查看);

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

有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:

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

执行下面的命令, 可以看到知名端口号

c 复制代码
cat /etc/services
(3) 两个问题
  1. 一个进程是否可以bind多个端口号? 可以
  2. 一个端口号是否可以被多个进程bind? 不可以
(4) netstat

netstat是一个用来查看网络状态的重要工具。

  • 语法:netstat [选项]
  • 功能:查看网络状态
  • 常用选项:
    • n 拒绝显示别名,能显示数字的全部转化成数字
    • l 仅列出有在 Listen (监听) 的服务状态
    • p 显示建立相关链接的程序名
    • t (tcp)仅显示tcp相关选项
    • u (udp)仅显示udp相关选项
    • a (all)显示所有选项

指令演示

查看tcp相关网络信息(仅在Listen状态),一般选择使用-nltp组合选项(查看udp时把t换成u即可)

cpp 复制代码
netstat -nltp

查看所有的tcp和udp相关网络信息

cpp 复制代码
netstat -natp    // tcp
netstat -natp    // udp
(5) pidof

在查看服务器的进程id时非常方便。

  • 语法:pidof [进程名]
  • 功能:通过进程名, 查看进程id

指令演示

2. UDP协议

2.1 UDP协议端格式

前8个字节代表UDP协议的报头

  • 16位UDP长度:表示整个数据报 (UDP首部+UDP数据)的最大长度,故UDP报文最大长度为64KB
  • 16位UDP校验和:如果校验和出错,就会直接丢弃;
(1) 2个核心问题(解包与分用)
  1. UDP是怎么做到报头和有效载荷分离呢?
  • 报头长度是固定的8个字节,报文读完8个字节后就是有效载荷;

  • 有效载荷读取长度 = 16UDP长度(整个数据报的长度) - 8字节报头长度

  1. 有效载荷是如何做到交付给应用层的哪一个进程呢?

    根据目的端口号向上交付给应用层,绑定该端口号的进程,即分用的过程

(2) 深入理解UDP协议

上图中所画的报文,究竟是什么呢?

UDP协议属于传输层协议,是在操作系统内核中的,linux内核是由C语言写的,则UDP协议也是用C语言实现的,所以所谓的报头就是一种结构化数据,在C语言中可以采用结构体或位段来实现。

什么叫做封装呢?

定义一个大的缓冲区向其中添加字段

什么叫做解包呢?

定位出报头和有效载荷,根据报头中的字段来解析内容

2.2 UDP的特点

UDP传输的过程类似于寄信。

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

面向数据报

  • 应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;

  • UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

  • 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包,多次发送, 并在接收端手动拼装;

  • 用UDP传输100个字节的数据:如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节。即UDP协议,发送函数的次数 : 接收函数的次数 = 1 : 1

2.3 UDP的缓冲区

  • UDP没有真正意义上的发送缓冲区。调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
  • UDP具有接收缓冲区 。但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了,再到达的UDP数据就会被丢弃;

UDP的socket既能读, 也能写, 这个概念叫做全双工

2.4 UDP使用注意事项

  • 我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
  • 然而64K在当今的互联网环境下, 是一个非常小的数字。如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;

2.5 基于UDP的应用层协议

  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
    据最大长度是64K(包含UDP首部)。
  • 然而64K在当今的互联网环境下, 是一个非常小的数字。如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;

2.5 基于UDP的应用层协议

  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
  • DNS: 域名解析协议
相关推荐
sunfove27 分钟前
光网络的立交桥:光开关 (Optical Switch) 原理与主流技术解析
网络
Kevin Wang7273 小时前
欧拉系统服务部署注意事项
网络·windows
min1811234563 小时前
深度伪造内容的检测与溯源技术
大数据·网络·人工智能
汤愈韬3 小时前
NAT策略
网络协议·网络安全·security·huawei
汤愈韬3 小时前
Full Cone Nat
网络·网络协议·网络安全·security·huawei
zbtlink4 小时前
现在还需要带电池的路由器吗?是用来干嘛的?
网络·智能路由器
桌面运维家4 小时前
vDisk配置漂移怎么办?VOI/IDV架构故障快速修复
网络·架构
dalerkd4 小时前
忙里偷闲叙-谈谈最近两年
网络·安全·web安全
汤愈韬5 小时前
NAT ALG (应用层网关)
网络·网络协议·网络安全·security·huawei
运维栈记6 小时前
虚拟化网络的根基-网络命名空间
网络·docker·容器