写在前面
上一篇文章中我们说明了计网当中运输层的作用,还有其中两个主要角色TCP、UDP的差别。在本篇文章我们主要说一说比较简单的一种运输层协议UDP(用户数据报协议),分为两个重点——UDP的首部格式,和用于检查数据传输是否有误的检验和字段。
本文主要参阅谢希仁老师的《计算机网络(第5版)》
UDP的首部格式
UDP的一个传输单位就是用户数据报,一个用户数据报包含数据字段和首部字段。首部字段很简单,就只有8个字节,由4个字段组成,每个字段的长度都是两个字节。但如果要较真的话,在UDP用户数据报的首部其实还有12个字节大小的**伪首部**,但这并不算入UDP用户数据报真正首部中,至于为什么我们之后再去说。
这4个字段分别为:
1. 源端口(在需要对方回信时选用,不需要时可用全0)
2. 目的端口(不可为0。在终点交付报文时必须要使用到。当运输层从IP层收到UDP数据报时,就根据这个字段,把UDP数据报经由相应的端口,上交到目的进程——这个进程就叫UDP分用)
3. 长度(写明UDP用户数据报的长度,包含首部和数据部分的总长度。最小值为8,这个情况下UDP用户数据报只有首部)
4. 检验和(检测UDP用户数据报在传输中是否有错。有错就丢弃,并借由ICMP协议发送“端口不可达”差错报文给发送方)
UDP检验和——伪首部
伪首部存在的意义就只是为了计算检验和。在计算检验和的时候,伪首部添加到UDP用户数据报前,得到一个临时的UDP用户数据报,不向上呈递也不向下传送。伪首部通常由5个字段组成:
1. 源IP地址(4字节)
2. 目的IPD地址(4字节)
3. 第3字段规定全0(1字节)
4. IP首部中的协议字段的值(在UDP中,此值为17。1字节大小)
5. UDP长度(不含伪首部的UDP首部+数据部分。2字节大小)
UDP检验和——检验和的检验原理
UDP检验和是怎么起到检验的作用的呢?原理其实很简单:在发送方,把计算出的检验和的值写入UDP首部中(我们记作$S1$),在接收方再根据接收到的报文(UDP用户数据报的IP数据报的源IP地址和目的地址,源端口号和目的端口号以及数据部分)在计算一次检验和(记作$S2$),若两次检验和结果相同($S1=S2$),则说明这次传输没有数据丢失
了解了这个,其实UDP检验和具体是如何计算的就不是很重要了,但还是简要说一下,就是反码求和。在《计算机网络》中谢老师举了一个例子,我们拆解来看看:
//这是所有字段的16位二进制表示
10011001 00010011→153.19
00001000 01101000→8.104
10101011 00000011→171.3
00001110 00001011→14.11
00000000 00010001→0和17
00000000 00001111→15
00000100 00111111→1087
00000000 00001101→13
00000000 00001111→15
00000000 00000000→0(检验和)
01010100 01000101→数据
01010011 01010100→数据
01001001 01001110→数据
01000111 00000000→数据和0(填充)
//这是每个二进制串对应的反码格式
01100110 11101100
11110111 10010111
01010100 11111100
11110001 11110100
11111111 11101110
11111111 11110000
11111011 11000000
11111111 11110010
11111111 11110000
11111111 11111111
10101011 10111010
10101100 10101011
10110110 10110001
10111000 11111111
//这是上述二进制串求和得到的结果
10010110 11101101
//结果求反码
01101001 00010010
原理很简单,这样一个简单的计算就既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分,又检查了IP数据报的源IP地址和目的地址。 然而,显而易见的是,这样的计算检验能力并不强,但足够简单,况且UDP本身也被称认为不可靠。
接下来
UDP的内容非常简单,与之形成鲜明对比的是,TCP的内容却多到需要花费很多章节才能讲全面。接下来,我们会从工作原理、首部格式、可靠传输的实现、流量控制、拥塞控制和运输连接管理等方面着重讲解TCP。
本篇文章到这里就结束了,如果你觉得有哪些地方讲的不妥当,请不吝赐教。