1 运输层概述
1.1 运输层存在的意义
之前我们讲网络层的时候,已经可以将信息从一个主机传递到另一个主机了。
那么为什么我们还需要运输层呢?
是因为我们两个主机通信的时候,大多数情况是两个主机不同的进程在通信,比如我们浏览器访问需要一个进程,发邮件又需要一个进程。很多时候这些进程都是并行通信的。那么网络层是无法区分的,实际的区分通信的不同进程就交给了运输层,这也是运输层的重要作用——复用和分用
当然除了复用和分用,运输层还提供一些其他的功能如差错检测等
应用层不同进程的报文通过不同的端口向下交付到运输层
运输层提供应用进程的逻辑通信——逻辑通信的意思是:运输层之间的通信好像是沿着水平方向传送数据,但事实上这两个运输层之间并没有一条水平方向的物理连接
所以总结来看
网络层和运输层的区别
网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信
1.2 运输层协议概述
运输层主要有两个不同的运输协议
TCP和UDP
他们各自的PDU(运输协议单元如下)
UDP:它的PDU是TCP报文段
TCP:它的PDU是UDP报文段或用户数据报
那么实际中运输层如何区分不同的进程呢?通过抽象了端口号这种方式
由此可见,两个计算机中的进程需要对方的IP地址,还要知道对方的端口号(为了找到对方计算机中的应用程序)
不同端口号代表不同进程。
设计者们对端口号做了如下一些规定
1.3 主要端口号
两大类端口
(1)服务端使用的端口号
又分为两大类
熟知端口,数值一般为0~1023
熟知端口号用来指派给TCP/IP最重要的一些程序,如下图所示
登记端口,数值为1024~49151
没有数值端口使用的,使用的话必须登记
(2)客户端使用的端口号
短暂端口号,数值49152~65535
仅在客户端进程运行时动态选择,因此又叫做短暂端口号
下面分别讨论UDP和TCP
其中UDP比较简单
2 运输层主要协议 UDP
UDP只在IP数据报上增加了很少一点的功能,即端口功能和差错检测的功能
2.1 UDP的特点
- UDP是一种无连接协议
- 提供无连接服务 传送数据前不需要先建立连接
- 不提供可靠交付 对方的运输层在收到UDP报文后,不需要给出任何确认
- 尽最大努力交付
- 没有拥塞控制
- UDP支持一对一,一对多,多对一和多对多的交互通信
- 对于应用层的报文,不合并不拆分,多长就都发送
- UDP首部开销较小
2.2 UDP首部格式
UDP首部很简单就八个字节,由四个字段组成,每个字段长度都是2字节
- 源端口
- 目的端口
- 长度 数据报长度,最小值是8
- 检验和 检测传输中是否有错
2.3 UDP工作流
如果接收方UDP发现报文端口号不正确,就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方
对于UDP的差错检测,和IP数据报检测方法类似
首先,将UDP首部中的检验和字段置为0,以便进行计算。
将UDP伪首部添加到UDP数据包前面。伪首部包含了一些IP层的信息,用于计算检验和。伪首部的格式如下:
1
2
3
4
5Source IP Address (32 bits)
Destination IP Address (32 bits)
Reserved (8 bits, 值为0)
Protocol (8 bits, UDP的协议值为17)
UDP Length (16 bits, UDP首部+UDP数据的总长度)伪首部中的字段分别是源IP地址、目标IP地址、保留字段、协议字段(UDP的协议值为17)和UDP长度字段。这些字段一起构成了伪首部。
将UDP伪首部的各字段以及UDP首部和UDP数据中的所有16位字(如果数据不是16位的倍数,需要填充0使其满足16位字的条件)进行按位求和。这意味着将它们视为16位整数,将它们相加,如果结果溢出,则将溢出部分加到总和的末尾。
取总和的反码(将所有位取反,1变为0,0变为1),并将结果存储在UDP首部的检验和字段中。
发送方将带有计算后的检验和字段的UDP数据包发送到目标主机。
接收方在收到UDP数据包后,重复以上步骤,计算接收方的检验和。
接收方将计算得到的检验和与UDP首部中的检验和字段进行比较。如果它们匹配,说明数据包未损坏;如果不匹配,说明数据包可能已损坏或被篡改,接收方可以选择丢弃这个数据包。
总之,UDP检验和用于检测UDP数据包在传输过程中的完整性,但它不提供数据包的可靠传输和重传机制。如果检验和不匹配,接收方可以选择忽略数据包或向上层报告错误,但UDP本身不会进行重传。这是与TCP不同的地方,TCP提供了可靠的数据传输和重传机制。