UDP传输层通信协议详解

引言

在计算机网络通信的广阔天地中,传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中,UDP(User Datagram Protocol,用户数据报协议)以其独特的特性和应用场景脱颖而出。UDP传输层通信协议详解,将为我们揭示这一协议的工作原理、优缺点以及在现代网络通信中的重要作用。

以下是本文需要的几个基础知识。

**传输层--**负责数据能够从发送端传输接收端。
**端口号---**端口号 (Port) 标识了一个主机上进行通信的不同的应用程序 ;

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


端口号范围划分--uint16_t
0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.
认识知名端口号 (Well-Know Port Number)
有些服务器是非常常用的 , 为了使用方便 , 人们约定一些常用的服务器 , 都是用以下这些固定的端口号(我们自己写一个程序使用端口号时 , 要避开这些知名端口号 .):
ssh 服务器 , 使用 22 端口
ftp 服务器 , 使用 21 端口
telnet 服务器 , 使用 23 端口
http 服务器 , 使用 80 端口
https 服务器 , 使用 443
执行下面的命令 , 可以看到知名端口号
cat /etc/services
两个问题

  1. 一个进程是否可以 bind 多个端口号 ?--Y
  2. 一个端口号是否可以被多个进程 bind?---N
    netstat
    netstat 是一个用来查看网络状态的重要工具
    语法 : netstat [ 选项 ]
    功能 :查看网络状态
    常用选项
    n 拒绝显示别名,能显示数字的全部转化成数字
    l 仅列出有在 Listen (监听) 的服務状态
    p 显示建立相关链接的程序名
    t (tcp)仅显示tcp相关选项
    u (udp)仅显示udp相关选项
    a (all)显示所有选项,默认不显示LISTEN相关
    pidof
    在查看服务器的进程 id 时非常方便 .
    语法 : pidof [ 进程名 ]
    功能 :通过进程名 , 查看进程 id

UDP****协议

0-31表示宽度,第一行的数据就是位段前两个数据,分别占用了16位

可以看到UDP的报头与格式还是比较简单的,符合了UDP效率高,不可靠的特性。

UDP的报头一共8字节,8*8 = 64bite,所以内部采用了**位段(比特位)**的方式梳理结构。包含了源端口号与目的端口号的信息(uint16_t)


16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度(单位是1字节);
校验和: 如果校验和出错, 就会直接丢弃

校验和解读

UDP(用户数据报协议)中的16位校验和是一个重要的错误检测机制,它用于验证数据在传输过程中的完整性。以下是关于UDP 16位校验和的详细介绍:

工作原理

  1. **计算校验和**:发送方在发送数据之前, 会计算整个UDP数据报的校验和 。这个计算包括 UDP头部、UDP数据以及一个伪头部(pseudo-header)伪头部包含了源IP地址、目的IP地址、保留位(置为0)、协议号(对于UDP来说是17)和UDP数据报的长度

  2. **伪头部的使用**:伪头部 并不真正存在于UDP数据报中,它仅在计算校验和时被使用 。伪头部的目的是为了 确保数据报在传输过程中能够正确地到达目的地,即使它们在传输过程中可能会经过不同的网络路径。

  3. **校验和的计算方法**:校验和的计算是通过将所有16位字(包括伪头部、UDP头部和数据)相加,并取反来完成的。如果相加的结果有进位,进位会被加回到最低位上。最终得到的16位值就是校验和。

校验和的验证

  1. **接收方验证**:接收方在收到UDP数据报后, 会重新计算整个数据报(包括伪头部)的校验和,并与数据报中携带的校验和进行比较
  2. **错误检测**:如果接收方计算出的校验和与数据报中的校验和不匹配,那么接收方可以认为数据在传输过程中发生了错误。在这种情况下, UDP通常会丢弃这个数据报,并且不会通知发送方

特点

  • **简单性**:校验和的计算相对简单,不需要复杂的算法。
  • **有限性**:1 6位的校验和只能检测出一定范围内的错误,它不是绝对可靠的。例如,它不能保证检测出所有类型的错误,也不能纠正错误。
  • **无连接性**:由于 UDP是无连接的,校验和是UDP提供的一种基本错误检测手段,但它不保证数据的可靠传输

注意事项

  • 如果发送方或接收方在 计算校验和时发现错误UDP协议本身不会尝试重传数据报这是与TCP协议的一个重要区别
  • 在某些特殊情况下 ,发送方可以选择不计算校验和,并将校验和字段置为0 。这通常用于 性能敏感的应用,但这样做会降低错误检测的能力。

UDP****的特点

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

面向数据报

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
用UDP传输100个字节的数据:
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;
UDP 的缓冲区与全双工
UDP没有真正意义上的 发送缓冲区 . 调用sendto会直接交给内核 , 由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区 . 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;
如果缓冲区满了, 再到达的UDP数据就会被丢弃;

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

UDP****使用注意事项

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

基于UDP的应用层协议

NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议 ( 用于无盘设备启动 )
DNS: 域名解析协议
当然 , 也包括你自己写 UDP 程序时自定义的应用层协议

DNS

DNS(Domain Name System,域名系统)是一种用于将域名和IP地址相互转换的分布式数据库和协议。DNS的主要目的是便于人们使用易于记忆的域名来访问互联网上的资源,而不需要记住复杂的IP地址。以下是DNS协议的简介:

功能:

  • **域名解析**:将人类可读的域名(如 www.example.com)转换为机器可读的IP地址(如 192.0.2.1)。

  • **反向解析**:将IP地址转换为对应的域名(主要用于某些网络管理和安全功能)。

  • **域名服务**:提供域名注册、更新和删除等服务。

工作原理:

  1. **递归查询**:
  • 用户在浏览器中输入域名,计算机会向本地DNS服务器发送解析请求。

  • 如果本地DNS服务器没有缓存该域名的记录,它会作为递归解析器,向其他DNS服务器发送查询请求,直到找到解析结果。

  1. **迭代查询**:
  • DNS服务器之间通常使用迭代查询。当一个DNS服务器收到查询请求时,如果它没有所需的信息,它会返回另一个DNS服务器的地址,让请求者向该服务器发送新的查询。
  1. **DNS记录**:
  • DNS记录存储在DNS服务器上,它们包含有关域名的各种信息,如A记录(域名到IPv4地址的映射)、AAAA记录(域名到IPv6地址的映射)、MX记录(邮件交换记录)、CNAME记录(别名记录)等。

DNS服务器类型:

  • **根域名服务器**:顶级域名(如.com、.net、.org)的DNS服务器。

  • **顶级域名服务器**(TLD):管理特定顶级域名的DNS服务器。

  • **权威域名服务器**:管理特定域名的DNS服务器。

  • **本地DNS服务器**:通常由互联网服务提供商(ISP)或组织提供,为用户提供本地解析服务。

安全性:

- DNS存在一些安全风险,如DNS劫持、缓存投毒等。

- 为提高安全性,可以使用DNSSEC(DNS安全扩展)来验证DNS响应的真实性和完整性。

DNS是互联网基础设施的重要组成部分,它使得用户能够通过简单的域名来访问互联网上的各种资源。

相关推荐
大面积秃头18 小时前
Http基础协议和解析
网络·网络协议·http
Michael_lcf19 小时前
Java的UDP通信:DatagramSocket和DatagramPacket
java·开发语言·udp
我也要当昏君20 小时前
6.3 文件传输协议 (答案见原书 P277)
网络
Greedy Alg20 小时前
Socket编程学习记录
网络·websocket·学习
刘逸潇200521 小时前
FastAPI(二)——请求与响应
网络·python·fastapi
软件技术员21 小时前
使用ACME自动签发SSL 证书
服务器·网络协议·ssl
我也要当昏君21 小时前
6.4 电子邮件 (答案见原书 P284)
网络协议
Mongnewer21 小时前
通过虚拟串口和网络UDP进行数据收发的Delphi7, Lazarus, VB6和VisualFreeBasic实践
网络
我也要当昏君1 天前
6.5 万维网(答案见原书P294)
网络
嶔某1 天前
网络:传输层协议UDP和TCP
网络·tcp/ip·udp