传输层重点协议----TCP and UDP

传输层重点协议----TCP and UDP

  • 一、TCP 协议
    • 1、TCP 协议格式
    • 2、TCP 协议特点
    • 3、TCP 协议特性
      • (1)确认应答机制(安全机制)
      • (2)超时重传机制(安全机制)
      • (3)连接管理机制(安全机制)---(三次握手、四次挥手)
      • (4)流量控制(安全机制)
      • (5)拥塞控制(安全机制)
      • (6)滑动窗口(效率机制)
      • (7)延迟应答(效率机制)
      • (8)捎带应答(效率机制)
      • (9)粘包问题
  • 二、UDP 协议
    • 1、UDP 协议格式
    • 2、UDP 协议特点
  • 三、TCP 与 UDP 对比

一、TCP 协议

TCP协议(Transmission Control Protocol),传输控制协议;
是一种面向连接的、可靠的、基于字节流的通信协议;

1、TCP 协议格式

传输层重点协议----TCP and UDP_第1张图片

图中,6boolean标志位:

  • URG:紧急指针是否有效
  • ACK:确认号是否有效
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:复位报文段
  • SYN:同步报文段
  • FIN:结束报文段

2、TCP 协议特点

TCP 协议具有以下特点

  • 有连接
  • 可靠传输:网络数据传输的方式是一跳一跳经过所有路途中的设备,就可能发生数据丢失问题;
  • 面向字节流:可以多次收发数据(连接没有关闭时);
  • 有接收缓冲区与发送缓冲区
  • 大小不限:可以多次收发,且每次收发都可以很大;

3、TCP 协议特性

(1)确认应答机制(安全机制)

确认应答机制:发送的数据报,对方要返回一个确认应答的数据报;

实现方式

传输层重点协议----TCP and UDP_第2张图片

TCP将每个字节的数据都进行了编号,即为序列号;
如图中返回下一个是1001,表示1001之前的所有数据报,都已经接收到;

确认应答是可靠传输的最核心机制,接收方返回一个应答报文ACK,表示已经接收到发送方的数据报;

(2)超时重传机制(安全机制)

确认应答机制是比较理想的情况,但实际上数据在传输的过程中,会伴随着丢包情况,该情况就需要使用超时重传机制
具体如下:

  • 情况1:主机A向主机B发送数据,网络拥堵造成丢包,需要重传;
    传输层重点协议----TCP and UDP_第3张图片
  • 情况2:主机A向主机B发送数据,应答报文ACK丢失了,需要重传;

传输层重点协议----TCP and UDP_第4张图片
那么,具体超时多长时间,就要进行重传呢?

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间;

  • 假设,超时以初始值为一个单位进行控制,每次判定超时重发的超时时间都是初始值的整数倍;即:超时初始值*2^n
  • n累计到一定的阈值,TCP就会强制关闭连接;

(3)连接管理机制(安全机制)—(三次握手、四次挥手)

在真正发送数据之前,会先建立连接,建立连接也是为了保证可靠性;

如何建立连接

即 :三次握手
传输层重点协议----TCP and UDP_第5张图片

三次握手

  • 第一次握手:客户端发送 SYN 到服务端,申请建立客户端到服务端的连接;
  • 第二次握手:服务端接收到客户端数据报后,服务端返回 SYN+ACK 给客户端以确认连接服务端到客户端的请求(这里的ACK是第一次的SYN应答);
  • 第三次握手:客户端接收到服务端返回的数据报,状态置为established,并返回 ACK 给服务端(第二次SYN的应答),服务端接收到这个ACK,就将状态置为established,建立了服务端到客户端的连接;

三次握手保证了客户端与接收端同时具备发送、接收数据的能力;

当不需要在进行数据传输时,就需要关闭连接;即:四次挥手

四次挥手

传输层重点协议----TCP and UDP_第6张图片
注意关闭连接时,客户端、服务端都可以申请;

此处为客户端发起关闭连接;

  • 第一次挥手:客户端发送FIN到服务,申请关闭客户端到服务端的连接;
  • 第二次挥手:服务端接收到 FIN,将状态置为close_wait,并返回一个ACK应答给客户端;(该动作是系统实现TCP协议栈默认执行的,不需要程序调用代码);
  • 第三次挥手:服务端发送一个FIN到客户端,申请关闭服务端到客户端的连接,并执行关闭连接前的一些操作;
  • 第四次挥手:客户端返回ACK到服务端,并将状态置为time_wait,需要等待一段时间(防止丢包需要重传FIN),客户端再将状态置为closed,等服务端接收到这个数据报时,状态置为closed关闭连接;

(4)流量控制(安全机制)

接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应;
因此,TCP 支持根据接收端的处理能力,来决定发送端的发送速度,将该机制就叫做流量控制(Flow Control);

(5)拥塞控制(安全机制)

发送端网络情况不明时,贸然发送大量数据,就可能导致丢包;
解决方案TCP 引入慢启动机制,先发送少量的数据去探路,摸清楚当前的网络状况,再决定按照多大的速度发送数据;

(6)滑动窗口(效率机制)

在收发数据时,如果没有滑动窗口,就是 一收一发,一收一发 的方式,缺点:效率底;

传输层重点协议----TCP and UDP_第7张图片

引入滑动窗口后,就可以一次性发送多个数据报;

传输层重点协议----TCP and UDP_第8张图片

  • 窗口大小:一次性发送多个数据报总的大小,上图中,窗口大小就是4000
  • 具体设置多大窗口:min(流量窗口大小,拥塞窗口大小)
  • 窗口如何滑动?

接收到的ACK下一个是N,就可以滑动到N-1位置;

(7)延迟应答(效率机制)

当接收到数据时,不要立刻ACK应答,而是等待一定时间(延时),让程序处理一部分接收的数据,这样就可以将流量窗口设置的较大一些,这样发送的窗口就可以更大一些(网络吞吐量更大);

(8)捎带应答(效率机制)

服务端接收到客户端发送的消息,要返回一个ACK及响应的消息,可以不用两次数据发送,而是将其合并为一个数据进行发送;

(9)粘包问题

粘包问题中的 "包" ,指的是应用层的数据包; 由于TCP是面向字节流的,可以多次接收和发送数据,因此,对应用层来说:

  • 到底发送多少次,算一次发送的应用层完整格式数据是不清楚的;
  • 到底接收多少次,算一次接收的应用层完整格式数据也是不清楚的;

产生原因:包与包之间的边界没有确定好;
解决方案:确定包的边界
(1)对于定长的包,保证每次都按固定大小读取即可;
(2)对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
(3)对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定的,只要保证分隔符不和正文冲突即可);


二、UDP 协议

1、UDP 协议格式

传输层重点协议----TCP and UDP_第9张图片

2、UDP 协议特点

UDP 协议具有以下特点

  • 无连接:没有任何连接可靠机制;
  • 不可靠
  • 面向数据报:一次发送的数据报,也只能一次接收;
  • 只有接收缓冲区,没有发送缓冲区
  • 大小受限:一个数据报最多64k

UDP 协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部);


三、TCP 与 UDP 对比

TCP 与 UDP 有什么区别?

(1)从特点上来看

  • TCP 协议是有连接的,可靠的,面向字节流的,有发送缓冲区及接收缓冲区,大小不限;
  • UDP 协议是无连接的,不可靠的,面向数据报,只有接收缓冲区,没有发送缓冲区,大小受限;

(2)从使用场景上来看

  • TCP 协议适用于高可靠性的业务,如(文件传输);
  • UDP 协议适用于实时性要求高,允许一定程度的丢包,如(语音聊天);

同时,TCP 协议提供了一系列可靠传输及提高效率的机制;

对于可靠传输,TCP协议提供了:

  • 校验和
  • 序列号
  • 确认应答
  • 超时重发
  • 连接管理
  • 流量控制
  • 拥塞控制

对于高效率传输,TCP协议提供了:

  • 滑动窗口
  • 延时应答
  • 捎带应答

扩展问题

  1. UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传输,应该如何设计?
  2. UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?

解决方案:在程序应用层加入类似TCP的可靠传输机制,即可实现(包括确认应答,超时重传,连接管理…)

你可能感兴趣的:(TCP,协议,UDP协议,对比)