运输层的功能是:提供进程之间的逻辑通信。这里的进程可以是主机之间的不同进程,也可以是同一个主机内的不同进程。
运输层网络层只负责数据包的接收与发送,它并不知道这个数据属于哪个进程。运输层负责收集各个进程的数据交给网络层,并将网络层的数据拆分交给不同的进程。将数据收集起来交给网络层这一步被称为多路复用,将网络层的数据拆分出来交给不同进程这一步被称为多路拆分。
运输层的表现受网络层的限制。因为网络层是运输层的底层支持,运输层无法决定自己的带宽、时延等,但运输层可以基于网络层开发更多的特性:如可靠传输。网络层只负责尽力把数据包从一端发送到另一端,但不保证数据可以到达并且完整。在运输层可以对接收的数据做校验,保证可靠传输。
1.socket 通信
运输层提供的进程间通信,在底层是通过 socket 完成的。在网络层中,IP 地址是用来进行主机通信的标识,在运输层中,socket 是用来进行进程间通信的标识。
socket 通信运输层增加了端口这个概念,用来区分不同的 socket。一个主机上有很多的端口,每个端口都有一个端口号,端口的数量由运输层协议决定。
2.运输层协议
不同的运输层协议对 socket 有不同的定义方式。在 UDP(User Datagram Protocol) 协议中,使用 目标 IP + 目标端口号 来定义一个 socket;在 TCP (Transfer Control Protocol)协议中,使用 目标 IP + 目标端口号 + 源 IP + 源端口号 来定义一个 socket。我们只需要在运输层报文的头部附加上这些信息,目标主机就会知道我们要发送给哪个 socket,对应监听该 socket 的进程就可以收到数据。
UDP 是最精简的运输层协议,只实现了进程间通信;而 TCP 协议在 UDP 的基础上,实现了可靠传输、流量控制、拥塞控制、面向连接等等特性,同时也更加复杂。
除了 UDP 和 TCP 之外,还有很多优秀的运输层协议,但使用最广泛的,还是 TCP 和 UDP。
2.1.TCP 协议首部
TCP 协议表现在报文上,就是会在应用层传输过来的数据前附加一个 TCP 首部,这个首部携带了 TCP 信息。TCP 首部结构如下:
TCP 协议首部TCP 首部的固定长度是 20 字节,下面还有 4 字节是可选的。其中有一些我们熟悉的:源端口、目标端口。上文说到,socket 还需要 IP 地址进行定位,IP 地址会在网络层附加上。
TCP 首部各字段的作用如下:
TCP 首部字段表选项字段中包含以下其他选项:
选项字段2.2. TCP 面向字节流特性
TCP 并不是把应用层传输过来的数据直接加上首部然后发送给目标,而是把数据看成一个字节流,给他们标上序号之后再发送。这就是 TCP 的面向字节流特性:
TCP 面向字节流特性- 首先,TCP 以流的形式从应用层读取数据并存放在自己的缓冲区中,同时为这些字节标上序号
- 然后,TCP 从缓冲区选择适量的字节组成 TCP 报文,通过网络层发送给目标
- 最后,接收方读取字节流并存放在自己的缓冲区中,并在合适的时候交付给应用层
面向字节流的好处是无需一次存储过大的数据占用太多内存,坏处是无法知道这些字节代表的意义,例如应用层发送一个音频文件和一个文本文件,对于 TCP 来说就是一串字节流,没有意义可言,所以应用层不得不处理粘包和拆包问题。
网友评论