TCP数据的传输过程

												TCP数据的传输过程

建立连接后,两台主机就可以相互传输数据了。如下图所示:

在这里插入图片描述

上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程。首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。

为了保证数据准确到达,目标机器在收到数据包(包括SYN包、FIN包、普通数据包等)包后必须立即回传ACK包,这样发送方才能确认数据传输成功。

此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认 Ack 号:

Ack号 = Seq号 + 传递的字节数 + 1

与三次握手协议相同,最后加 1 是为了告诉对方要传递的 Seq 号。

下面分析传输过程中数据包丢失的情况,如下图所示:

在这里插入图片描述
上图表示通过 Seq 1301 数据包向主机B传递100字节的数据,但中间发生了错误,主机B未收到。经过一段时间后,主机A仍未收到对于 Seq 1301 的ACK确认,因此尝试重传数据。

为了完成数据包的重传,TCP套接字每次发送数据包时都会启动定时器,如果在一定时间内没有收到目标机器传回的 ACK 包,那么定时器超时,数据包会重传。

上图演示的是数据包丢失的情况,也会有 ACK 包丢失的情况,一样会重传。

  1. 重传超时时间(RTO, Retransmission Time Out)

这个值太大了会导致不必要的等待,太小会导致不必要的重传,理论上最好是网络 RTT 时间,但又受制于网络距离与瞬态时延变化,所以实际上使用自适应的动态算法(例如 Jacobson 算法和 Karn 算法等)来确定超时时间。

往返时间(RTT,Round-Trip Time)表示从发送端发送数据开始,到发送端收到来自接收端的 ACK 确认包(接收端收到数据后便立即确认),总共经历的时延。

  1. 重传次数

TCP数据包重传次数根据系统设置的不同而有所区别。有些系统,一个数据包只会被重传3次,如果重传3次后还未收到该数据包的 ACK 确认,就不再尝试重传。但有些要求很高的业务系统,会不断地重传丢失的数据包,以尽最大可能保证业务数据的正常交互。

最后需要说明的是,发送端只有在收到对方的 ACK 确认包后,才会清空输出缓冲区中的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP传输控制协议(Transmission Control Protocol)的缩写,它是一种常用的网络传输协议。在数据传输中,TCP使用拼接的方式来传输数据。 首先,当发送方要向接收方传输数据时,它将数据分割成较小的块,称为TCP段或报文段。这样做的目的是为了将数据进行拆分,以便在网络上传输。 然后,TCP将每个TCP段打上标记,以确保接收方可以按照顺序将它们拼接在一起。这意味着即使TCP段在传输过程中可能经过不同的路径、以不同的顺序到达接收方,接收方仍然能够将它们正确地重新组装起来。 接收方接收到TCP段后,会按照序列号进行排序。接收方会根据TCP段头部中的序列号信息,将接收到的TCP段按照正确的顺序进行拼接。如果接收方发现某个TCP段的序列号缺失或者乱序,它会向发送方发送一个相应的请求,要求重传或者重新排序。 拼接数据过程是通过在接收方维护一个缓冲区来完成的。接收方将接收到的TCP段存储在缓冲区中,直到所有的TCP段都到达,并且按照正确的顺序进行拼接。一旦所有的TCP段都被拼接完成,数据就可以被传递给上层应用程序进行处理。 总之,TCP数据传输中使用拼接的方式来传输数据。它将数据分割成较小的TCP段,并通过序列号信息,保证接收方能够按照正确的顺序将它们拼接在一起。这种机制确保了数据的可靠传输和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值