传输层构建在网络层之上,传输层提供端口到端口之间的通讯。
传输层通过端口号来标识一个端口,不同于网卡,端口是逻辑上的概念。传输层的端口为16个比特(bit)长度,即最多能表示65 536个端口,端口号范围在0~65535之间。
UDP
UDP的全称是User Datagram Protocol,用户数据报协议。UDP协议在IP协议之上提供了端口到端口之间的通讯。
UDP协议的数据单元我们称为用户数据报(User Datagram),即UDP负责传输的数据被称作用户数据报文。
UDP的实现
UDP协议通过在用户数据的前面添加一段控制信息用来实现端到端之间的数据传输,我们称之为UDP首部。
UDP首部的长度固定为8个字节,其中源端口和目的端口共占用4个字节。
此外UDP还必须解决两个问题:
- 如何完整地提取用户数据
- 如何检测收到的数据(包括UDP首部和用户数据)和发送的数据一致
如何完整地提取用户数据==>长度字段
因为UDP的首部的固定的,因此我们只需要在首部中添加一个长度字段来标识这个用户数据报的总长度(首部+用户数据)就可以标识这个用户数据报的结束位置,这样接收方在提取数据的时候就可以将用户的数据正确的提取出来。
UDP协议规定用户数据报的最大长度为65535,通过16个比特位来实现,即长度字段占用2个字节
如何检测收到的数据和发送的数据一致==>校验和字段
由于在传输的过程中可能会造成数据的损坏,造成接收方收到的数据和发送方发送的数据不一致。检测数据一致的方法就是通过摘要算法,对数据报生成一段摘要信息,用来唯一标识这个数据报。
UDP协议在计算校验和时是将整个UDP数据报进行校验,包括UDP首部和用户数据。既然要包括UDP首部,而校验和字段属于UDP首部,因此我们规定在计算校验和之前,校验字段的值为0(即使用全0填充)
校验过程如下:
UDP在计算校验和时将UDP数据报当做由若干16bit长度的分块组成,计算时对这些分块进行二进制反码求和,同时规定UDP的校验字段长度为16个bit。
因此在计算校验和时,如果UDP数据的长度不是16bit的整数倍,为了减少数据的大小,我们不对数据进行填充,而是在计算时进行填充0使其长度为16bit的整数倍。
发送端:
- 首先使用全0填充校验和字段,构成一个完成的UDP数据报
- 在计算校验和时,判断UDP数据报的长度是否为16bit的整数倍,如果不是则对UDP数据报进行填充0使其长度为16bit的整数倍
- 根据二进制反码计算这些16bit字(word)的和:两个数进行二进制反码求和的运算是:从低位到高位逐位进行运算。0和0相加是0,0和1相加是1,1和1相加是0但要产生1个进位1加到下一列.若最高位相加后产生进位,则最后得到的结果要加1)
- 将计算结果写入校验和字段。
接收端:
- 将收到的UDP数据报按二进制反码求这些16bit字的和。
- 如果全为1,则表示接收到的数据与发送的数据一致。否则不一致,将此数据报丢弃。
因为计算机处理起来最快,采用其他方式例如摘要算法则会慢很多
UDP报文格式
源端口(16bit) | 目的端口(16bit) | UDP数据报长度(首部长度+用户数据长度)(16bit) | 校验和(16bit) |
---|