传输层所属OSI模型框架

流程框架

一句话解释
- 主要功能就是让应用程序之间互相通信,通过端口号识别应用程序,使用的协议有面向连接的 TCP 协议和面向无连接的 UDP 协议
什么是传输层,怎么通俗的去理解?
比喻:寄送快递
我想从上海寄一个巨大的、装满了乐高积木的箱子到北京给我的朋友。
- 第一步:打包和分装
箱子太大,快递不接受。必须把它拆分成好几个标准尺寸的小纸箱(第1箱,第2箱,第3箱)。
这对应传输层的"分段"功能。 传输层将上层应用(比如你下载文件)传来的大数据块,分割成更小的"数据段",以便在网络中传输。 - 第二步:写地址和编号
在每一个小纸箱上都写上:收件人地址(北京朋友家)、发件人地址(上海),并且给每个箱子编号(1/3, 2/3, 3/3)。
这对应传输层的核心工作:
收/发件人地址 -> 端口号。地址找到了具体的建筑(你的电脑),而端口号找到了建筑里具体的人或公司(电脑上运行的特定软件,如微信、浏览器)。这就是 IP地址 + 端口号 构成一个唯一连接的概念。
箱子编号 -> 序列号。传输层给每个数据段编号,以便接收方能按顺序重组。 - 第三步:交给快递公司
把所有小纸箱交给快递公司。
快递公司不关心箱子里面是什么乐高,它只负责根据物理地址,通过自己的物流网络(卡车、飞机、中转站),把这些箱子送到目的地。这些箱子可能会走不同的路线,也可能有丢失或损坏。
这对应网络层(IP层)的工作。 它负责"尽力而为"地将数据包从源主机路由到目标主机。 - 第四步:收件人处理
在北京收到了所有小纸箱。
首先根据箱子上的编号(1/3, 2/3, 3/3)把它们按顺序拼凑起来,还原成那个完整的大箱子。
如果发现2号箱丢失了或者箱子破损了,他会打电话说:"喂,我的2号箱没收到,请再寄一次!"
这对应传输层的另外两个核心功能:
按编号重组 -> 重组数据段。
检查丢失和重发 -> 差错恢复(通过确认和重传机制)。
刚说的很零散,我们这里正式的说明一下:
- 承上启下的关键层
下层(网络层):只负责把数据包从一个设备送到另一个设备(IP地址 到 IP地址)。它不保证顺序、不保证送达,就像不靠谱的快递。
上层(应用层):是各种具体的应用程序,如微信、浏览器。它们需要可靠的、有序的数据传输。
传输层:就在这两者之间,它弥补了网络层服务的不足,为应用层提供了稳定、可靠的数据传输服务。它是"面向通信部分的最高层,也是用户功能中的最底层"。
- 传输层的两大代表协议(就像两家不同的快递公司)
1)TCP(传输控制协议)- 像快递
特点:可靠、面向连接、速度稍慢
工作方式:在寄送数据前,先和对方"三次握手"建立连接。发送数据时有编号、有确认、有重传。保证数据不丢失、不重复、按顺序到达
适用场景:网页浏览(HTTP)、电子邮件(SMTP)、文件传输(FTP)------任何不能出错的数据传输
2)UDP(用户数据报协议)- 像广播
特点:不可靠、无连接、速度极快
工作方式:不建立连接,直接把数据段发出去。不编号、不确认、不重传。只管发,不管对方收没收到
适用场景:视频直播、网络电话(VoIP)、在线游戏------允许少量丢失,但要求速度极快的实时数据传输
UDP 是不具有可靠性的协议,但是可靠性功能可以交给上层的应用去完成。
这里提出了TCP和UDP的传输协议
-
TCP(面相连接):是在发送数据之前,在收发主机之间连接一条逻辑通信链路。
是一种面向有连接的传输层协议,能够对自己提供的连接实施控制。适用于要求可靠传输的应用。
TCP建立的流程,也就是"三次握手":

一个 IP 地址可以标识一台主机,IP 报文头部有一个字段,用来标识上层协议类型。根据这个字段的协议号,来识别 IP 传输的数据是 TCP 还是 UDP 。IP 用协议号 6 标识 TCP ,用协议号 17 标识 UDP 。

同理,我们可以根据传输层的目的端口号,来确定服务程序

-
UDP(面相无连接):不要求建立和断开连接,发送端可于任何时候自由发送数据。
是一种面向无连接的传输层协议,不会对自己提供的连接实施控制。适用于实时应用,例如视频会议、直播等。
一台主机可能同时有多个程序,传输层的 TCP 和 UDP ,为了识别上一层的应用程序类型,使用端口号来识别具体的程序,从而使这些程序可以复用网络通道。

四次挥手

为什么是"三次"而不是"两次"握手?
- 在于防止已失效的连接请求突然传到服务器,导致错误和资源浪费
层级相关的数据在每一层都有不同的名称

传输层中的重要功能
单位段
- 经过传输层协议封装后的数据称为段。在建立 TCP 连接时,可以确定数据段的大小,也就是最大消息长度( MSS )。TCP在传输大量数据时,是以 MSS的大小将数据进行分割发送,重发也是以 MSS 为单位

- MSS 是在三次握手时,由两端主机计算出来的。两端主机在发出建立连接的请求时,会在 TCP 头部写入 MSS 值。
- 然后在两者间选择较小的值使用。MSS默认值为 536 字节,理想值是 1460 字节,加上 IP 头部 20 字节和 TCP头部 20字节,刚好在 IP 层不会被分片。
窗口控制(也称为滑动窗口控制)
- TCP 是以 1 个段为单位,每发一个段进行一次确认应答。如果包的往返时间越长,通信性能就越低

- 为解决这个问题,TCP 引入了窗口的概念。确认应答不再是每个分段,而是以窗口的大小进行确认,转发时间被大幅度的缩短。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口大小是一个 16 位字段,因此窗口最大是 65535 字节。在 TCP传输过程中,双方通过交换窗口的大小来表示自己剩余的缓冲区( Buffer )空间,以及下一次能够接受的最大数据量,避免缓冲区的溢出。

发送数据中,窗口内的数据即使没有收到确认应答也可以发送出去。如果窗口中的数据在传输中丢失,也需要进行重发。因此,发送端主机在收到确认应答前,必须在缓冲区保留这部分数据。 - 收到确认应答后,将窗口滑动到确认应答中的序列号位置。这样可以按顺序将多个段同时发送,这种机制也被称为滑动窗口控制



重发控制
- 在使用窗口控制时,如果是确认应答未能返回的情况,数据已经到达对端,是不需要再进行重发的。
然而,在没有使用窗口控制时,没收到确认应答的数据是必须重发的。而使用了窗口控制,某些确认应答即使丢失也无需重发。

发送端未收到接收端的2号、5号确认应答,但是因为收到了后面的应答帧,所以不会进行重发 - 如果某个报文段丢失,接收主机收到序号不连续的数据时,会为已经收到的数据返回确认应答。即使接收端收到的包序号不是连续的,也不会将数据丢弃,而是暂时保存至缓冲区。出现报文丢失时,同一个序号的确认应答将会被重复发送。

如果发送端收到连续 3 次同一个确认应答,就会将对应的数据进行重发。这种机制比超时管理更高效,也被称为高速重发机制。
流控制
为什么需要流控制?
- 接收端处于高负荷状态时,可能无法处理接收的数据,并丢弃数据,就会触发重发机制,导致网络流量无端浪费
什么是流控制?
- 为了防止这种情况,TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流控制
具体如何实现呢?
- 接收端主机通知发送端主机自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。这个限度的大小就是窗口大小
- TCP 头部中有一个字段用来通知窗口大小。接收主机将缓冲区大小放入这个字段发送给接收端。当接收端的缓存不足或处理能力有限时,窗口大小的值会降低一半,从而控制数据发送量。

发送端主机会根据接收端主机的指示,对发送数据的量进行控制,也就形成了一个完整的 TCP 流控制。
特殊情况
- 若接收端要求窗口大小为 0 ,表示接收端已经接收全部数据,或者接收端应用程序没有时间读取数据,要求暂停发送

如果窗口更新的报文丢失,可能会导致无法继续通信。为避免这个问题,发送端主机会时不时的发送一个叫窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。
如下是窗口大小为 0,并且收到了窗口更新的包截图

窗口探测包是什么包?
- 窗口探测包是一个携带1字节旧数据的TCP重传包,它利用TCP的确认机制来获取接收方的最新窗口信息
拥塞控制
拥塞控制和流控制什么关系?
- 流量控制考虑点对点的通信量的控制,拥塞控制考虑整个网络,是全局性的考虑
网络拥塞场景
- TCP的窗口控制,收发主机之间不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。在网络出现拥堵时,突然发送一个较大量的数据,可能会导致整个网络瘫痪
为了防止这个问题出现,在通信开始时,就会通过一个叫慢启动的算法得出的数值,对发送数据量进行控制。为了在发送端调节发送数据的量,需要使用拥塞窗口。
如何理解网络拥塞窗口算法?
- 在慢启动时,将拥塞窗口的大小设置为 1 MSS 发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1 。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,选择它们当中较小的值发送数据。这样可以有效减少通信开始时连续发包导致网络拥堵,还可以避免网络拥塞的发生
- 慢启动算法: 发送的数据量以此为:1 2 4 8 16,是指数增长的。当使用慢启动算法增长到慢启动阈值时,就会使用拥塞避免算法;拥塞避免算法:维护一个拥塞窗口的变量,只要网络不拥塞,就试探着拥塞窗口调大,如1 2 4 8 16 17 18

再次理解拥塞控制和流控制的关系

