计算机网络--运输层

2020/10/28 posted in  网络协议

运输层

运输层向上面的应用层提供通信服务,属于面向通信部分的最高层。

  1. 运输层为相互通信的应用进程提供逻辑通信
  2. 端口和套接字的意义
  3. 无连接的UDP的特点
  4. 面向连接的TCP的特点
  5. 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议
  6. TCP的华东窗口、流量控制、拥塞控制和连接管理

1、运输层协议概述

1.1 进程之间的通信

运输层向它上面的应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最底层。

两台主机进行通信就是两台主机中的应用进程互相通信。
通信的真正端点并不是主机而是主机中的进程。也就是说端到端的通信时应用进程之间的通信。

复用

指在发送方不同的应用进程都可以使用同一个运输层协议传送数据。需要加上适当的首部

分用

指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。

1.2 运输层两个主要协议

  1. 用户数据报协议UDP,User Datagram Protocol
  2. 传输控制TCP,Transmission Control Protocol

通信时传送的数据单位叫做运输协议数据单元TPDU,TCP称为TCP报文段,UDP称为UDP用户数据报。

UDP在传送数据之前不需要先建立连接。在收到UDP报文后,不需要给出任何确认。

TCP则提供面向连接件的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。

2、 UDP

UDP只在IP的数据报服务至上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。

2.1 UDP特点

  • 无连接的。即发送数据之前不需要建立连接,发送数据结束时也没有连接可释放,减少了开销和发送数据之前的时延。
  • 使用尽最大努力交付。即不保证可靠交付。
  • 面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。在接收方的UDP,对IP层交上来的UDP数据报,在去除首部后原封不动的交付上层的应用进程,
  • UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。允许在网络发生拥塞时丢失一些数据
  • UDP支持一对一、一对多、多对一和多对多的交互通信。
  • UDP首部开销小,只有8字节,比TCP的20字节首部要短。

2.2 UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部字段。首部字段由4个字段、8个字节,每个字段长度都是两个字节。

  • 源端口
    源端口号,在需要对方回信时选用,不需要时可用全0。

  • 目的端口
    目的端口号,这在终点交付报文时必须使用。

  • 长度
    UDP用户数据报的长度,其最小值是8(仅有首部)。

  • 检验和
    检测UDP用户数据报在传输中是否有错,有错就丢弃。


当运输层收到UDP数据报时,根据首部中的目的端口,把UDP数据报通过相应的端口,上交应用进程。

3、TCP

3.1 TCP特点

  • 面向连接
    在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。

  • 每一条TCP连接只能有两个端点,每一条TCP连接都是点对点的

  • 提供可靠交付的服务
    无差错、不丢失、不重复,按序到达

  • 提供全双工通信
    TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。发送时,应用程序把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候会读取缓存中的数据。

  • 面向字节流
    流,指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互式一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流

3.2 TCP的连接

每一条TCP连接有两个端点。端点叫做套接字或插口,

RFC793定义:端口号拼接到IP地址即构成了套接字。

4、可靠传输的工作原理

TCP下面的网络所提供的是不可靠的传输。因此,TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。

4.1 停止等待协议

停止等待,就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。

无差错情况


发送一个,确认完一个,然后在发下一个。

出现差错


当出现差错,接收方丢掉收到的报文,发送发收不到确认消息,超时后重传。

确认丢失和确认迟到


发送方收到报文,发送方没有收到确认消息,发送方超时重传,接收方收到上次已经接收到的报文,丢弃重复的报文并发送确认消息。

信道利用率


4.2 连续ARQ协议

滑动窗口是TCP协议的精髓。
连续ARQ协议规定,发送发每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方一般都是采用累积确认的方式。接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,就表示到这个分组为止的所有分组都已经正确收到了。

5、TCP报文段的首部格式

TCP是面向字节流的,但TCP传送的数据单元确实报文段。

TCP报文段分为首部和数据两部分,TCP的全部功能都体现在它首部中各字段的作用。

  1. 源端口和目的端口
    TCP的分用功能

  2. 序号,也称作报文段序号
    4字节,范围是[0,2^32 - 1],TCP中传送的字节流中的每一个字节都是按顺序编号。在建立连接的时候设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。

  3. 确认号
    4字节,是期望收到对方下一个报文段的第一个数据字节的序号。确认号=N,表示序号N-1为止的所有数据都已正确收到。

  4. 数据偏移
    4位。TCP报文段的数据起始处距离TCP报文段的起始处有多远,实际上是指出TCP报文段的首部长度。

  5. 保留

  6. 紧急URG
    URG = 1 时表示紧急指针字段有效,应当尽快传送,而不需要按照原来的排队顺序传送。

  7. 确认ACK
    仅当 ACK = 1 时有效。在建立连接后所有传送的报文段都必须把 ACK 设置为1.

  8. 推送PUSH
    两个进程进行交互式的通信时,有时在一段的应用进程希望在键入一个命令后立即就能够收到对方的响应,这种情况下使用PUSH操作。
    这时,发送方 TCP 把 PSUH 设置为1,并立即创建一个报文段发送出去。接收方收到后尽快交付给应用进程,而不用等到整个缓存都满了之后在向上交付。

  9. 复位RST
    当 RST = 1 时,表明TCP连接中出现严重差错,必须释放连接,然后在重新建立连接。

  10. 同步SYN
    在建立连接时用来同步序号。当SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则在响应的报文段中使 SYN = 1 和 ACK = 1。

  11. 终止FIN
    用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

  12. 窗口

  13. 检验和
    范围包括首部和数据两部分。在计算检验和时要在TCP报文段的前面加上12字节的伪首部。

  14. 紧急指针

  15. 选项

6、TCP可靠传输的实现

6.1 以字节为单位的滑动窗口

TCP的滑动窗口是以字节为单位的。

发送窗口,在没有收到确认的情况下,可以连续把窗口内的数据都发送出去,凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

发送窗口里面的序号表示允许发送的序号,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而能获得更高的传输效率。

发送窗口的位置由前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。不可能向后移动,因为不能撤销已收到的确认。

后沿后面的部分表示已经发送并且收到了确认。

发送窗口前沿有可能向后收缩。但是TCP的标准强烈不赞成这样做。

6.2 超时重传时间的选择

重传时间的选择是TCP最复杂的问题之一。
TCP采用了一种自适应算法,记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs(这又称为平滑的往返时间)。

在计算加权平均RTTS时,只要报文段重传了,就不采用其往返时间样本,这样得出的加权平均RTTS和RTO就较准确。

6.3 选择确认ACK

假设TCP的接收方在接收对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块。如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确告诉发送方,使发送方不要再重复发送这些已收到的数据。

7、TCP的流量控制

所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

7.1 利用滑动窗口实现流量控制

发送方的发送窗口不能超过接收方给出的接收窗口的数值。

大写ACK表示TCP首部确认位,小写ack表示确认字段的值。

7.2 TCP的传输效率

8、TCP的拥塞控制

8.1 拥塞控制的一般原理

在某段时间,若对网络中国呢某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 供不应求的情况。供大于求

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

发送方如何知道网络发生拥塞?
出现超时

8.2 TCP的拥塞控制方法

慢开始

发送方在发送之前先探测一下,由小到大逐渐增大发送窗口,由小到大逐渐增大拥塞窗口的数值。

发送方的最大报文段:SMSS(Sender Maximum Segment Size)。

旧的规定:在刚刚开始发送报文段时,先把初始拥塞窗口 cwnd 设置为 1 至 2 个发送方的最大报文段的数值,但新的 RFC 5681 把初始 拥塞窗口 cwnd 设置为不超过 2 至 4 个 SMSS值。

慢开始规定,在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值。

一开始发送方 cwnd = 1,发送第一个报文段 M1,接收方收到后确认M1,发送方收到确认后,把 cwnd 增大到 2,于是发送方可以发送 M2 和 M3 两个报文段。
接收方收到后发回对 M2 、M3的确认,发送方 cwnd + 2

发送方每收到一个对新报文段的确认就使发送窗口增加1。

每经过一个传输轮次,拥塞窗口 cwnd 就加倍。

拥塞避免

为了防止拥塞窗口 cwnd 增长过大引起网络拥塞,还需要设置一个慢开始门限 ssthresh 状态变量。
当 cwnd < ssthresh,使用慢开始算法。
当 cwnd > ssthresh,停止使用慢开始算法而改用使用拥塞避免算法。
当 cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法。

拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的 拥塞窗口 cwnd 加 1,而不是像慢开始阶段那样加倍增长。
把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传

快重传算法可以让发送方尽早知道发生了个别报文的丢失。
要求接收方立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

快恢复

在上图的点 4,发送方知道现在只是丢失了个别额的报文段,于是不启动慢开始,而是执行 快恢复 算法。这时,调整发送方门限值 ssthresh = cwnd / 2,同时设置拥塞窗口 cwnd = ssthresh ,并开始执行拥塞避免算法。

8.3 主动队列管理AQM

9、TCP的运输连接管理

TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。

连接建立的过程中要解决三个问题:

  1. 要使每一方都能够确知对方的存在
  2. 要允许双方协商一些参数(最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量)
  3. 能够对运输实体资源进行分配(缓存大小、连接表中的项目)

9.1 TCP连接的建立

  1. 客户端 A 先发送 SYN = 1,表示要与服务端 B 建立连接
  2. B收到后,发送确认。 ACK = 1,表示 A可以建立连接,SYN = 1 表示 B 要与 A 建立连接, A --> B 方向已建立连接。
  3. A收到B的确认后,在给一个确认 ACK = 1 ,B --> A 方向已建立连接。

9.2 TCP连接的释放

  1. 客户端 A 先提出要断开连接,发送 FIN = 1 表示要断开连接,
  2. B 收到后给出确认 ACK = 1,A -> B 方向连接已经断开,A 不能再发送数据给 B,但是 B 可以发送数据给 A,
  3. 等数据传送完成后,B 要跟 A 断开连接, B 发送 FIN = 1,
  4. A 收到后确认 ACK = 1,双方连接都已经断开。

9.3 TCP的有限状态机