网络协议6:【传输层】UDP协议

716 阅读4分钟

很痛苦,看到了跟我们内容基本完全一样的CSDN ,更痛苦的是他在推顾城——我当年最喜欢的中国现代诗作者了。罢了,来首死神

本篇除却参考了课件还参考了这里


讲了零零碎碎那么多终于到UDP了,它是传输层最重要的两个协议之一(还有TCP),虽然在考试里还是不怎么重要

这两者使用“网”的方式走了两个极端。两个协议的对比非常有趣。TCP协议复杂,但传输可靠。UDP协议简单,但传输不可靠。其他的各个传输层协议在某种程度上都是这两个协议的折中。

简介

UDP (User Datagram Protocol),等到网络层你会发现这玩意和IP协议简直亲兄弟——非要说的话,它实现了端口

  • IP协议进行的是IP地址到IP地址的传输,但想要分配给不同进程使用就要多个通信通道,一个端口就代表了这样的一个通信通道。
  • UDP协议实现了端口,从而让数据包可以在送到IP地址的基础上,进一步可以送到某个端口。

你可以将UDP协议看作IP协议暴露在传输层的一个接口。UDP协议同样以数据包(datagram)的方式传输,它的传输方式也是"Best Effort"的,所以UDP协议也是不可靠的(unreliable)。

实际上,UDP是作为TCP的简化出现的——因为TCP需要太多处理很容易造成负担,实际上只为IP传输起到了桥梁的作用。对比可以在讲TCP的时候看到

性质们

得了解,能说出什么时候选择TCP什么时候选它

  • 最简单的可用因特网传输协议 Simplest usable Internet transport protocol
  • 就像前面提到的,在所谓“best effort”我就只送我不背锅原则下,UDP的数据段segments可能会
    • 丢包 lost
    • 顺序全乱 delivered out-of-order to app
  • connectionless——不追求“建立互联”
    • UDP发送端间不会“握手”(无需事先询问、确立连接而是立即发送,详见TCP)
    • 每个 UDP 数据包是独立处理的
  • 所以说想要把UDP变得可靠(reliable transfor over UDP),只能在应用层上作手脚
    • 增加应用层的可靠性
    • 特定于应用程序的错误恢复application-specific error recovery!

话说回来,UDP优点也是它们带来的(还挺重要):

  • 快,Quick to send data,毕竟没有没有增加延时的连接
  • 简单、易于实现 Simple to implement:发送方、接收方没有连接状态啥的乱七八糟的
  • 因为以上,header很小,Efficient
  • 没有堵塞控制,可以嗖得飞快,甚至能选择速率 Can choose rate of sending

使用场景

  • 一些流媒体应用程序(容错高、而对速率更敏感),看直播啥的
  • 域名系统DNS
  • ……

UDP 的段落头(segment header)

得记住都有啥捏

image.png

Source port

标识发送数据的应用程序套接字的端口 Port identifying the application socket sending the data

Dst port

标识接收数据的应用程序套接字的端口 Port identifying the application socket to receive the data

length

Length of packet including header at layer 4。是以bytes为单位的UDP包长,包括了头的长度
UDP头的总长为 16bits4=8bytes16bits \cdot 4=8bytes

checksum

用于检测数据包是否已损坏。A sum over the header and data used to detect if the packet has corrupt.
目标是发现段中错误(如flipped bits - 0变为1或1变为0),没有改正的能力。

其所校验的序列包括了整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP)。这样,checksum就可以校验IP:端口的正确性了。在IPv4中,checksum可以为0,意味着不使用checksum。IPv6要求必须进行checksum校验(IPV6头中没有校验部分)

具体功能通过以下方式实现(不重要)

在发送端

  • 将整一段所有内容(包括header)分成数个十六位一组的整数组
  • 除checksum对应的组外的所有组作和(1的补运算one's complement sum)(看图理解)
    • 补运算再取反就得到checksum
  • sender将校验和值放入UDP校验字段

详见这里有专门一段讲解

补运算图:
image.png

receiver

  • 计算接收到的段的checksum
  • 检查计算的校验和是否等于校验和字段值,等于当做对了不等当做出错了

很明显,还是有可能出错,但没人在乎

封装与解包

似乎没有特殊的

image.png

Questions

  • When it is examined by the transport layer does a UDP packet have layer 2 and 3 headers?
    • No, the network layer removes those headers before sending the packet up. The application layer could not add them. 不会的,你网上看图就知道了,到4的时候都根本没有这些玩意,还没到呢
  • What is the purpose of the UDP checksum?
    • Helps us tell if the packet is corrupted
  • What are the four things in a UDP header apart from data?
    • Checksum, packet length, source port, dest port
  • Is UDP connection oriented or connectionless?
    • Connectionless

image.png