[计网] 一、运输层 TCP 详解

313 阅读13分钟

学习思路:

  1. 运输层是个啥,
  2. TCP和UDP的特点
  3. TCP的首部格式
  4. TCP可靠传输的基本原理:停止等待,ARQ自动重传请求。基本实现:滑动窗口
  5. TCP流量控制:控制窗口的大小,点对点的
  6. TCP拥塞控制:拥塞窗口,拥塞的判断,4个拥塞控制算法,全局的。
  7. TCP的运输管理(连接和释放):三次握手四次挥手

0. 运输层协议概述

  • 运输层向它上面的应用层提供通信服务
  • 它属于面向通信部分的最高层,同时也是用户功能中的最低层
  • 只有位于网络边缘部分的主机的协议栈才有运输层
  • 端到端的通信是应用进程之间的通信
  • 网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信

运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。

image-20200812203009468 image-20200812203256198

TCP:全双工,面向连接,可靠信道,不提供广播或者多播服务

UDP:无连接,不可靠信道

1. UDP

UDP只在IP的数据报服务之上增加了很少一点的功能:

  • 复用和分用的功能
  • 差错检测的功能

UDP的主要特点:

  • 1.无连接的
  • 2.使用尽最大努力交付
  • 3.面向报文的:UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文
  • 4.没有拥塞控制
  • 6.UDP支持一对一,一对多,多对一,多对多交互通信
  • 7.UDP的首部开销小
  • 传送数据单位协议是UDP报文或者用户数据报

发送方UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来 的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给UDP多长的报文, UDP就照样发送,即一次发送一个报文。

所以,应用程序必须自己选择合适大小的报文:

  • 若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。
  • 若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。

2. TCP概述

TCP主要特点

  1. 面向连接的运输层协议

  2. 一对一,每条TCP连接只能有两个端点,只能是点对点的。

  3. 提供可靠交付的服务

  4. 提供全双工通信

  5. 面向字节流

    • TCP中的“流”(stream)指的是流入或流出进程的字节序列。
    • “面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
    • TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
    • 但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。

    image-20200812210239224

  6. 传送的数据单位协议是:TCP报文段(segment)

其中需要注意的是:

  • TCP连接是一条虚连接而不是一 条真正的物理连接,
  • TCP对应用进程一次把多长的报文发送到TCP的缓存中是不关心的。
  • TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)
  • TCP可把太长的数据块划分短一些再传送。
  • TCP也可等待积累有足够多的字节后再构成报文段发送出去。

TCP的连接

image-20200812210545981

image-20200812210628618

3. TCP报文首部格式

  • TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。
  • 一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。
  • TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项(n是整数)。因此TCP首部的最小长度是20字节
image-20200812213203537

源端口和目的端口

各占 2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

序号

序号字段——占 4 字节。TCP 连接中传送的数据流中的==每一个字节都编上一个序号==。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

确认号

确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。==在ACK = 1 的时候才有效==

数据偏移量

数据偏移(即首部长度)占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移” 的单位是32位字(以4字节为计算单位)

标志位

1. URG

紧急URG--当 URG =1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

2. ACK

ACK = 1时,确认号字段才有效,ACK = 0时,确认号无效

3. PSH

push,PSH = 1时,表示接收方立即将尽快地交付给接收应用进程,而不再等到整个缓存都慢了后再向上交付

4. RST

复位,reset,当RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

5. SYN

同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文

6. FIN

终止 FIN (FINish) —— **用来释放一个连接。**FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

窗口

窗口字段 占 2 字节,用来让对方设置发送窗口的依据,单位为字节

紧急指针

紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

image-20200812214727961

4. 可靠传输的工作原理

概述

  • 停止等待协议
  • ARQ-自动重传请求

这两个是TCP的基础底层原理。

单条单条的发送效率太低

停止等待协议

image-20200812211024065

传输中会出现的情况:

  1. 无差错:

image-20200812211106810

  1. 出现差错:

    image-20200812211221417

    image-20200812211258889

    确认丢失或者确认迟到

    image-20200812211704889

    image-20200812211712888

    image-20200812211723337

需要注意的是:

  • 在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发。
  • 分组和确认分组都必须进行编号。
  • 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。

小结:

  • 通常A最终总是可以收到对所有发出的分组的确认。如果A不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。
  • 使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。
  • 像上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

出现的问题:

image-20200812212331394

为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输

image-20200812212433975

连续ARQ协议

  • 滑动窗口协议比较复杂,是TCP协议的精髓所在。
  • 发送方维持的发送窗口,它的意义是:位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。
  • 连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

image-20200812212752208

image-20200812212809384

image-20200812212829480

image-20200812212947751

详细后面会说

5. TCP可靠传输的实现

以字节为单位的滑动窗口

  • TCP的滑动窗口是以字节为单位的。
  • 现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31 (这表明B期望收到的下一个序号是31,而序号30为止的数据已经收到了)
  • 根据这两个数据,A就构造出自己的发送窗口,

image-20200812231915406

image-20200812231923037

需要强调三点:

image-20200812232022587

image-20200812232118038

超时重传时间的选择

image-20200812232358949

image-20200812232405375

具体计算重传时间的算法,没分析,在ppt里05章,105页左右

image-20210107145631989

选择确认SACK

image-20200812233321269

image-20200812233328291

6. TCP的流量控制

啥是TCP的流量控制

image-20200812233907670

例子:

image-20200812234130928

可能出现的问题:死锁

image-20200812234306997

持续计时器解决死锁

image-20200812234342810

发送效率问题 - Nagle算法

image-20200812234605636

详细算法先放一放,

7. TCP的拥塞控制

拥塞控制一般原理

image-20200813091557149

image-20200813091608781

拥塞的特点:

image-20200813091641361

拥塞控制和流量控制的区别

image-20200813091743443

image-20200813091751522

  • 面向的对象不同:流量控制是面向点对点的,拥塞控制是面向整个网络的。

TCP的拥塞控制方法

  • TCP采用基于窗口的方法进行拥塞控制,该方法属于闭环控制方法。
  • image-20200813092442407
  • image-20200813115149274

拥塞控制的原则:

  • 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
  • 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些, 以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

拥塞的判断

image-20200813104005632

TCP拥塞控制算法

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

一些概念:

  • cwnd:拥塞窗口大小
  • ssthresh:慢开始门限

1. 慢开始

“指数增大”

拥塞窗口cwnd控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值

拥塞窗口cwnd每次的增加量 = min (N, SMSS)

  • 其中N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
  • 不难看出,当N< SMSS时,拥塞窗口每次的增加量要小于SMSS。
  • 用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。

image-20200813105137204

设置慢开始门限状态变量 ssthresh :

  • 当cwnd < ssthresh时,使用慢开始算法。
  • 当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
  • 当cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。

2. 拥塞避免算法

“加法增大”

image-20200813105535295

3. 出现拥塞

当出现超时:

image-20200813105824005

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

应用举例:

image-20200813110036664

  1. 当TCP连接进行初始化时,将拥塞窗口置为1。图中的窗口单位不使用字节而使用报文段为单位。即慢开始门限的初始值设置为16个报文段,ssthresh= 16。
  2. 发送端的发送窗口不能超过拥塞窗口cwnd和接收端窗口rwnd这二者之间的最小值,我们假定接收端窗口足够大,窗口rwnd中的最小值。窗此现在发送窗口的数值等于拥塞窗口的数值。

如果出现超时:调整门限值 ssthresh=cwnd/2=12 && 重新开始 慢开始阶段,

image-20200813110726743

如果出现 3-ACK:进行快重传快恢复算法

image-20200813110955702

3. 快重传算法

采用快重传FR (Fast Retransmission)算法可以让发送方尽早知道发生了个别报文段的丢失。

image-20200813112220033

image-20200813112227869

4. 快恢复算法

image-20200813112451474

image-20200813112732469

主动队列管理 AQM

网络层的策略对TCP 拥塞控制影响最大的就是路由器的分组丢弃策略

所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组。这样就太被动了。应当在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组.

8. TCP 运输连接管理

1. TCP连接建立 - 三次握手

建立连接需要解决的三个问题:也就是为什么要先建立连接?

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

客户-服务器方式 建立连接

  • TCP连接的建立采用客户服务器方式。
  • 主动发起连接建立的应用进程叫做客户(client),
  • 被动等待连接建立的应用进程叫做服务器(server)。

image-20200813120502885

image-20200813120511535

image-20200813120545328

image-20200813120607295

两次握手行不行?为什么?

不行,三次握手主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

2. TCP连接释放 - 四次挥手

image-20200813121754984

image-20200813121805641

image-20200813121819349

image-20200813121849764

image-20200813121913125

MSL:最长报文段寿命

image-20200813121921904