资讯详情

TCP 协议

文章目录

    • 1. 报文段
      • 1.1 TCP 头部
      • 1.2 TCP 数据
    • 2. TCP 连接
      • 2.1 三次握手
      • 2.2 四次挥手
      • 2.3 如何实现可靠性?
    • 3. 滑动窗口
      • 3.1 发送窗口
      • 3.2 接收窗口
    • 4. 请求自动重传 ARQ
    • 5. 拥塞控制
      • 5.1 拥塞控制算法
      • 5.2 慢启动
      • 5.3 拥塞避免
      • 5.4 快重传
    • 6. 失序
      • 6.1 失序的2种情况
      • 6.2 TCP 数据传输过程

TCP 协议是一种面向连接的、可靠的、基于传输层通信协议。TCP 在不可靠的互联网上提供可靠专门设计的字节流传输协议。

应用层向TCP用发送用于网络传输的数据流,用8位字节表示,然后TCP将数据流分成适当长度的报文段)。TCP把报文段传给IP层,通过网络将包传输给接收端实体TCP层。

1. 报文段

TCP 协议传输数据的单元称为报文段。TCP报文段 = TCP首部 TCP数据。

IP 协议传输数据的单元是IP数据报,IP 数据报 = IP 首部 IP 数据部分(整个 TCP 报文段)。

TCP 报文段格式如下:

img

(图片来自网络)

1.1 TCP 头部

TCP 头部为20字节(不包括选项,选项长度不确定)。TCP 如果头部有选项,可以有60字节的长度。

  • 头部的源端口号和目的端口号:指连接双方的端口号。IP 数据报头部包含的源IP地址和目的IP地址。两个IP地址和端口号之间只有一个连接。IP地址和端口号有时被称为端点(endpoint)或套接字(Socket)。所以,每个TCP连接由一对套接字或端点(四元组)唯一标记。

  • 序列号:32位无符号,从0 ? \longrightarrow ? 2 32 ? 1 2^{32}-1 232?1 ? \longrightarrow ? 0。TCP 序列号可以识别数据的第一个字节。TCP 给每个字节一个序列号。初始序列号是随机选择的,会随时间而变化。

  • ACK:确认号,其值为接收方(也是发送)ACK一方)希望接收的下一个序列号。因此,除初始和末报文段外,还可用于其他报文段。发送一个 ACK 和发送一个 TCP 报文段是一样的,费用相同。

  • 选项:选项长度可达40字节。常见的选项有最大尺寸、时间戳、窗户缩放、选择性ACK等。

1.2 TCP 数据

TCP 数据携带要传输的数据。TCP 数据部分的长度计算如下: I P 数 据 报 长 度 ? I P 数 据 包 首 部 ( 20 字 节 或 40 字 节 ) ? T C P 报 文 段 首 部 ( 20 字 节 ) IP 数据报长度 - IP 数据包首部(20字节或40字节) - TCP报文段首部(20字节) IP数据报长度?IP数据包首部(20字节或40字节)−TCP报文段首部(20字节) 在 IP 数据报中有一个字段是总长度,表示数据报的总长度是多少(以字节位单位),它是一个16位的字段。所以IP数据报的最大长度是 2 16 − 1 = 65535 2^{16}-1=65535 216−1=65535 字节。然后可以计算出 TCP 数据部分的最大长度。所以,

如果是Ipv4 协议,IP数据包首部是20字节,那么 TCP 数据部分的最大长度是 65535-20-20=65495 (字节);

如果是Ipv6 协议,IP数据包首部是40字节,那么 TCP 数据部分的最大长度是 65535-40-20=65475 (字节);

IP 数据报16位为什么是 2 16 − 1 2^{16}-1 216−1 ??

因为16位的二进制表示的最大数是16个1,也就是 1 + 2 1 + 2 2 + . . . + 2 15 = 2 16 − 1 1 + 2^{1} + 2^{2} + ... + 2^{15} = 2^{16} - 1 1+21+22+...+215=216−1 。

2. TCP 连接

一个TCP 连接分为3个阶段:启动、数据传输、关闭。

TCP 协议使用三次握手建立连接,也就是启动阶段。

TCP 建立连接之后,这个连接就存在了。连接的双方可以通过连接来传输数据。这个。每个TCP连接的唯一标识是一对套接字(源IP,目的IP,源端口号,目的端口号)。通过套接字区分是不是同一个连接。一个套接字(Socket)是一个IP地址和端口号 。

TCP 协议使用四次挥手建立连接,也就是关闭阶段。

2.1 三次握手

通过三次握手建立可靠的连接(通信双方的发送/接收均没有问题)。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。

(图片来源于网络)

因为三次才能保证双方具有接收和发送的能力。TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

2.2 四次挥手

通过四次挥手断开连接。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

(图片来源于网络)

断开一个 TCP 连接则需要“四次挥手”:

  • 客户端:发送一个 FIN,用来关闭客户端到服务器的数据传送
  • 服务器:收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
  • 服务器:关闭与客户端的连接,发送一个FIN给客户端,并包含一个 ACK ,用于确认上一个 FIN。
  • 客户端:发回 ACK 报文确认,并将确认序号设置为收到序号加1

2.3 如何实现可靠性的??

  1. 传输数据之:三次握手建立可靠连接。

  2. 传输数据之:通过四次挥手断开连接。

  3. 传输数据之

    分块;编号;校验和(传输过程中是否有变化);重复数据(丢弃);

    停止等待 ARQ 协议(确认收到,超时重传);

    滑动窗口:控制发送速率;拥塞控制:网络拥塞时的解决方案;

传输过程中如何保证可靠性??

3. 滑动窗口

在接收方的发送方的速度时,会强迫发送方慢下来,这称为流量控制。

流量控制有两种方式。一是基于的流量控制,给发送方指定一个速率,不能超过这个速率,最适合,可以被用于广播和组播发现。二时基于的流量控制,使用滑动窗口实现,接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。

TCP 采用滑动窗口来实现流量控制。每个 TCP 头部中的窗口字段,其大小表示接收端可用缓存空间的大小,单位是字节。窗口字段的长度是16位。

每个 TCP 连接的双方都有一个的结构。发送端维护了一个发送窗口的结构,接收端维护了一个接收窗口的结构。

3.1 发送窗口

发送窗口的整个结构,记录了哪些序列号已确认,哪些正在传,哪些未传。

(图片来源于网络)

以上图为例,发送方的窗口大小为20个字节,窗口中包含已发送还未确认的序列号或分组,和还未发送的部分序列号。当接收方确认数据,发送方接收到一个 ACK ,窗口也会右移,并将相应的分组副本释放,窗口也增大或缩小(根据报文段中的窗口信息调节)。

3.2 接收窗口

接收端维护的接收窗口,记录了已接收并确认的数据,和它能接收的最大序列号。只有在窗口左右边界值内的序列号才能被接收并确认,窗口才会前移。这个窗口可以保证接收端接收数据的正确性,避免接收到重复的确认过的数据,或者接收不能接收的数据(超出窗口边界的数据不能接收)。

(图片来源于书籍 TCP/IP详解 卷1:协议)

怎么判断是重复数据?

当到达的序列号小于窗口左边界,会被认为是重复数据,从而丢弃。

此外,如果到达的序列号大于窗口右边界,接收端没有能力接收,也会被丢弃。

4. 自动重传请求 ARQ

ARQ 协议是 OSI 模型中之一。通过这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,通常会重新发送。ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。相比较来说,连续 ARQ 协议可提高信道利用率。

  1. 停止等待 ARQ 协议

每发完一个分组就(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到

在数据传输过程中会发生的出错情况:

  • 超时:发送方等了一定的时间后还没有收到接收方的确认消息(ACK

  • 确认丢失:接收方没有发送确认消息(ACK)或者在途中丢失了,发送方没有收到

  • 确认迟到:接收方发送了确认消息(ACK),但是发送方在超时重发数据之后收到了确认消息(ACK)。

发送方收到重复的消息和确认,处理方式是丢弃。

  1. 连续 ARQ 协议

连续 ARQ 协议,发送方维持一个,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用,对,表明到这个分组位置之前的所有分组都已经正确收到了。

缺点:比如发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

5. 拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。

拥塞控制是一个的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。

TCP 发送方要维持一个 的状态变量。拥塞控制窗口的,并且。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。 发 送 窗 口 大 小 = m i n ( 拥 塞 窗 口 , 接 收 窗 口 ) 发送窗口大小 = min (拥塞窗口, 接收窗口) 发送窗口大小=min(拥塞窗口,接收窗口)

5.1 拥塞控制算法

TCP 的拥塞控制采用了四种算法,即 (从小到大) 、 (缓慢增加) 、

5.2 慢启动

TCP 连接建立时或者重传超时导致的丢包时,会执行慢启动。因为在传输的初始阶段,并不知道网络的传输能力,防止大量数据注入网络而导致拥塞。慢启动是指数级的增长。

5.3 拥塞避免

在慢启动之后,达到一个阈值,说明有更多可以用的传输资源。为了避免 TCP 占用太多的传输资源而影响其他的连接,TCP 会进入拥塞避免的阶段,缓慢增加拥塞窗口的值。拥塞避免是线性级的增长。

5.4 快重传

快重传时根据收到 来判断丢包并启动重传,而不必等待重传计时器超时。

快重传和快恢复,没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求。在暂停的这段时间内,没有新的或复制的数据包被发送。如果接收方接收到一个,它会立即给发送方发送一个重复确认。如果发送方接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段,不会因为重传时要求的暂停被耽误。当有时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

6. 失序

6.1 失序的2种情况

在 IP 网络中出现包失序的原因在于 IP 层不能保证包传输是有序进行的。失序问题可能存在于 TCP 连接的正向或反向链路中。数据段的失序和 ACK 包的失序,对于 TCP 的影响是不同的。

如果失序发生在,就会使得TCP 发送窗口快速前移,接着可能又收到一些重复的而应该被丢弃的 ACK 。由于拥塞控制行为,这种情况会导致发送端出现不必要的流量突发,影响可用网络带宽。

如果失序发生在,TCP 可能无法正确识别失序和丢包。数据的失序和丢包丢回导致接受端收到无序的包,从而造成数据的空缺。当失序程度不是很大,比如两个相邻的包交换顺序,这种情况是可以迅速得到处理。当失序严重时,TCP 会误认为数据已经丢失,会导致伪重传,这主要来自快重传算法。

快重传时根据收到 来判断丢包并启动重传,而不必等待重传计时器超时。

6.2 TCP 数据传输的过程

  • 发送方通过三次连接和接收方建立连接。在建立连接之后会进行数据传输。
  • TCP 会将数据切分成多个数据块,每个数据块都有一个序列号可以标识数据块。
  • 发送方传输发送窗口中的数据,接收方收到数据,如果在接收窗口之内就接收数据,并发回确认。
  • 如果数据不是按顺序到达接收端,若是失序,在较小范围内可以调整,触发快重传机制,不用等待计时器超时再重传数据。如果失序范围比较大,发送端接收到3个重复的 ACK ,就会认为数据段丢失,从而重传该数据段。
  • 发送方接收到 ACK 确认后,发送窗口右移,继续传输数据。
  • 数据传输完,TCP 通过四次挥手断开连接。

参考资料:

  • 书籍:TCP/IP 协议 卷1:协议 第2版

标签: 流量变送器工作源

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台