【Linux】传输层协议 UDP

UDP 的全称 用户数据报协议(User Datagram Protocol),无连接,客户端和服务器绑定(bind)对应的IP地址和端口号,通过sendto和recvfrom发送和接收消息,不需要考虑黏包问题,和字节流问题,UDP 报文的长度,操作系统是知道的!

一. 端口号

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

在这里插入图片描述

在 TCP/IP 协议中,用 “源 IP”,“源端口号”,“目的 IP”,“目的端口号”,“协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看),下面的 http 服务是多线程的!

在这里插入图片描述

1. 端口号范围划分

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

2. 认识知名端口号

  1. ssh 服务器,使用 22 端口
  2. ftp 服务器,使用 21 端口
  3. telnet 服务器,使用 23 端口
  4. http 服务器,使用 80 端口
  5. https 服务器,使用 443 端口
# 查看知名端口号
cat /etc/services

我们自己写一个服务器绑定(bind)端口号时,要避开这些知名端口号!客户端不需要手动绑定端口号,操作系统自动为其绑定!

3. 两个问题

  1. 一个进程是否可以 bind 多个端口号?可以!
  2. 一个端口号是否可以被多个进程 bind?不可以!
  3. 记住:需要通过端口号找到唯一的进程!

二. UDP 协议

1. UDP 协议格式

  • 协议就是一种约定!就是结构化字段!本质就是 struct / class!

在这里插入图片描述

字段名称 字节 描述
源端口 2 标识发送方应用程序的端口号
目的端口 2 标识接收方应用程序的端口号
长度(自描述字段) 2 UDP数据报的总长度,包括报头和数据(如果有),最小值为8字节
校验和 2 用于检测数据报在传输过程中是否出现错误,出错了就丢弃
  1. UDP 是如何做到解包的?报头的固定长度的,直接读取 UDP 数据报的前 8 个字节(报头),将剩下的有效载荷交给应用层!
  2. UDP 是如何做到分用的(交给应用层的哪一个协议)?通过 16 位的目的端口号,找到响应的协议!
  3. UDP 是如何做到封装的?例如:应用层->传输层,将应用层协议 http 结构体对象和我们的数据拷贝合并起来,向传输层传输!

在这里插入图片描述

2. UDP 特点

  1. 无连接:发送数据之前不需要建立连接connect,因此没有连接建立和释放的开销。
  2. 不可靠:不提供确认、重传和排序机制,数据包可能会丢失、重复或无序到达。
  3. 面向数据报:不能够灵活的控制读写数据的次数和数量。

3. UDP 面向数据报

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

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

4. UDP 缓冲区

  • UDP 没有 发送缓冲区。调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。数据发送出去就不管了(不可靠),所以没有发送缓冲区。
  • UDP 具有 接收缓冲区。但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致(不可靠),如果缓冲区满了,再到达的 UDP 数据就会被丢弃。
  • UDP 的 socket 既能读,也能写,这个概念叫做 全双工。

5. UDP 使用注意事项

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

6. UDP 的应用层协议

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

当然,也包括你自己写 UDP 程序时自定义的应用层协议!

猜你喜欢

转载自blog.csdn.net/2203_76003626/article/details/146453278
今日推荐