# 4.传输层

# UDP 和 TCP

  1. 传输控制协议 TCP(Transmisson Control Protocol)–提供面向连接的,可靠的数据传输服务。

  2. 用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

# TCP 的主要特点

  1. TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
  2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一);
  3. TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、并且按序到达;
  4. TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
  5. 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

# UDP 的主要特点

  1. UDP 是无连接的;
  2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
  3. UDP 是面向报文的;
  4. UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
  5. UDP 支持一对一、一对多、多对一和多对多的交互通信;
  6. UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短

# 差别

TCP:面向链接、可靠、占用空间大、传输速率慢

​ 用在:文件传输、邮箱发送

​ 应用层协议:HTTP、HTTPS、DNS

UDP:面向报文、不可靠、占用空间小、传输速率快

​ 用在:直播、音视频通话

​ 应用层协议:DNS

# TCP/IP 协议

  • 由网络层的(IP)与传输层的(TCP)组成

# 1. 三次握手

客户端–发送带有 SYN 标志的数据包–一次握手–服务端

服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端

客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端

  • 以客户端作为连接发起端,第一次握手时,客户端发送 SYN 连接报文与 seq 序列号到服务端;第二次握手时,服务端回复 ACK 确认与 SYN 连接报文,同时将收到的客户端的 seq+1 并返回给客户端,并随机生成一个新的序列号 seq 发送给客户端。第三次握手时,此时已经建立连接,所以没有 SYN 的交换。第三次握手还可以携带数据,具体是客户端回复 ACK 确认报文,seq+1 并生成新的 seq 发送到服务端,并至此三次握手结束。

  • A (SYN 和 ISN(即初始的 seq100))=>B

  • B(标志位 ACK 和 SYN,和 ack101,、B 的 seq300)=>A

  • A(标志位 ACK 和 SYN,和 ack301、之前的 seq101)=>B

    img

    img

    # 为什么要传回 SYN

    接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

    # 传了 SYN,为啥还要传 ACK

    双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。

# 2. 为什么要三次握手

  1. A 对 B:听得到我说话吗=>B 对 A:听得到=>A 对 B:好的我知道了
  2. 至于为什么不能两次,分两种情况讨论: 1、是为了确认收发双方的接收、发送能力都正常,如果只有两次,服务端无法确认客户端的接收能力是否正常(因为服务端没收到客户端第三次握手回复)。2、如果两次握手就结束,那么万一第三次握手的报文被阻塞,直到后来到达的时候,会被服务端误认为是建立连接,然而这个报文早已失效,让服务端白白等待,浪费资源

# 3. 可靠传输——连续 ARQ 协议+滑动窗口协议

# 校检和、流量控制、拥塞控制、停止等待协议

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制: 当网络拥塞时,减少数据的发送。
  7. 停止等待协议 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  8. 连续 ARQ 协议:连续发送多组数据,接收方再一次性返回答复信息。(SACK 选择性确认,可以识别缺失的,重新发送)

# 3.1 为什么 TCP 可靠

  1. 靠 seq(sequence numbers 序列号)达成
  2. TCP 发送的每个包都有 seq。
  3. 机制是累积的,所以 X 序列号之前的包都是确认接受到的

# 3.2 停止等待协议

  • 停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组;
  • 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
  • 发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。

# 4. 流量控制

  • 点对点

# 滑动窗口

  • TCP 利用滑动窗口实现流量控制的机制
  • 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
  • TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据
    • 当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

# 流量控制

  • TCP 利用滑动窗口实现流量控制。
  • 流量控制是为了控制发送方发送速率,保证接收方来得及接收。
  • 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

# 5. 拥塞堵塞

什么是拥塞堵塞?

  • 链路的吞吐量 < 输入的负载 (就是很多电脑,发送的数据太多了)

# 拥塞控制

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP 的拥塞控制采用了四种算法,即 慢开始拥塞避免快重传快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。

# 5.1 慢开始:即由小到大逐渐增大发送窗。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。

# 5.2 拥塞避免 :让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1.

# 5.3 快恢复与快重传(FRR):

没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。

当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

# 6. TCP 保活机制(应用层实现)

作用:检测对方是否在线或者维持网络连接的需要

保活机制的开启:保活功能在默认情况下是关闭的,TCP 连接的任何一端都可以请求打开这一功能。保活功能可以被设置在连接的一端、两端,或者两端都没有。

机制:开启保活机制的一端,在一段时间内链接处于非活动状态( 通常这段时间设定为 2 小时),那么就会发送一个保活探测报文(空报文或 1 个字节),如果没有收到响应报文,就会经过一个提前设定好的时间间隔再发送一次探测报文。直到探测次数达到设定的保活探测数时,就会认为断开链接,链接中断。

弊端:

  1. 保活机制会占用不必要的带宽;
  2. 在出现短暂的网络错误的时候,保活机制会使一个好的连接断开;

# 7. 为什么要四次挥手

  1. A 对 B:我要关闭了=>B 对 A:好的,我知道你要关闭了=>B 对 A:我也要关闭了=>A 对 B:好的你关闭吧。(等待 2MSL,默认 2 分钟)

# 8. 网络报文 粘包、分包、半包,如何解决

TCP:粘包(因为 Nagle 算法合并的关系)

UDP:分包(小数据,多次的关系)

  1. 粘包:
    1. 用固定的符号作为结尾符。(推荐,常用)
      1. 其不足之处就是如果协议数据包内容部分需要使用包结束标志字符,就需要对这些字符做转码或者转义操作,以免被接收方错误地当成包结束标志而误解析。
    2. 固定包长的数据包(不建议,灵活性差)
    3. 包头 + 包体格式(推荐)
      1. 这种格式的包一般分为两部分,即包头和包体,包头是固定大小的,且包头中必须含有一个字段来说明接下来的包体有多大。
Last Updated: 6/3/2024, 1:08:34 AM