网络基础之UDP协议详解

195 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

UDP协议

一、UDP协议简介

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务

UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用分用以及差错检测

二、UDP的特点

UDP提供不可靠服务,具有TCP所没有的优势,UDP的传输类似于寄信:

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

UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)

三、UDP协议格式

image-20230214104030411

  • 源端口号,需要对方回信时选用,不需要时全部置0
  • 目的端口号,在终点交付报文的时候需要用到
  • 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度
  • 如果校验和出错, 就会直接丢弃

四、面向数据报

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

如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个
字节; 而不能循环调用10次recvfrom, 每次接收10个字节

image-20230214104917894

五、UDP的缓冲区

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

六、端口号

端口(port)是伴随着传输层诞生的概念。它可以将网络层的IP通信分送到各个通信通道

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

image-20230214105549329

端口号范围划分

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

认识知名端口号

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

可以用下面的命令查看知名端口号

cat /etc/services

其实就是端口号的内容存储在serveices这个文件里,用cat命令取出来而已

image-20230214110424605

两个问题

  1. 一个进程是否可以bind多个端口号?
  2. 一个端口号是否可以被多个进程bind ?

如果进程先绑定一个端口号,然后在fork一个子进程,这样的话就可以是实现多个进程绑定一个端口号,但是不同的进程绑定同一个端口号是不可以的

七、基于UDP的应用层协议

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