TCP的工作机制详解

TCP的特点及其目的

为了通过IP数据报实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等,TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制等实现可靠性传输。

通过序列号与确认应答提高可靠性

在TCP中,当发送端的数据达到接收主机事,接收机主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK, Positive Acknowledgement)。
这里写图片描述

TCP通过肯定的确认应答(ACK)实现可靠的数据传输,当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功达到对端,反之,数据丢失的可能性比较大。

如下图所示,如果在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能保证数据能够达到对端,实现可靠传输。
这里写图片描述
未收到确认应答也不一定意味着数据一定丢失,也有可能好是对方已经收到数据,只是返回的确认应答在途中丢失,这种情况也会导致发送端没有收到确认应答,而认为数据没有达到目的地,从而进行重新发送。如下图,
这里写图片描述

此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据之后才到达的情况也屡见不鲜。此时,源发送主机只要按照机制重发数据即可。但对于目标主机而言,这简直是一场“灾难”,它会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。为此,引入一种机制,既能识别是否已经接收数据,又能判断是否需要接收。

上述这些确认应答处理、重发控制和重复控制等功能都可以通过序列号实现。序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。
这里写图片描述

TCP的连接管理(三次握手)

TCP提供面向有连接的通信传输。面向有连接是指在数据通信之前先做好通信两端之间的准备工作。

在数据通信通过之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。TCP中发送第一个SYN包的一方叫客户端,接收这个包的一方叫服务端。

可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成,建立一个TCP连接需要发送3个包,因此也称做“三次握手”。
这里写图片描述

TCP的窗口控制和重发控制

TCP以一个段为单位,每发一个段进行一次确认应答的处理,这样包往返时间越长,通信性能就越低。

因此引入窗口的概念,确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅度缩短。也就是说,发送端主机,在发送了一个段以后继续发送,而不用一直等待确认应答。
这里写图片描述

在使用窗口控制中,段丢失怎么办?首先,考虑确认应答未能返回的情况,在这种情况下,数据已经到达对端,无需重发。在此种情况下,某些确认应答即便丢失也无需重发。
这里写图片描述

其次,考虑某个报文丢失的情况的情况,接收主机如果收到一个自己应该接收的序号以外的数据时,会针对当前为止收到的数据返回确认应答。如下图
这里写图片描述

拥塞控制

当计算机网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪,为了防止该问题的出现,TCP在通信一开始就会通过一个叫慢启动的算法得出的数值,对发送数据量进行控制。
这里写图片描述

首先,为了在发送端调节所要发送数据的量,定义了一个叫“拥塞窗口”的概念,于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1个MSS)发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口和接收端通知的窗口大小做比较,然后取较小的值。

不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止,引入了慢启动阈值的概念,只要拥塞窗口的值超过阈值,每接收到一次确认应答,只允许以下面的比例放大拥塞窗口:
这里写图片描述

这里写图片描述

当TCP通信开始后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好象是在逐步占领网络带宽的感觉。

TCP首部格式

这里写图片描述
另外,TCP中没有表示包长度和数据长度的字段。可由IP层获知TCP的包长可知数据的长度。

  • 源端口号(Source Port):表示发送端端口号,字段长16位
  • 目标端口号(Destination Port):表示接收端端口号,字段长16位
  • 序列号(Sequence Number):字段长32位,序列号是指发送数据的位置,没发送一次数据,就累加一次该数据的大小。
    它不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据位置,此外,在建立连接和断开连接时发送的SYN包和FIN包虽然都不携带数据,但也会作为一个字节增加对应的序列号。
  • 确认应答号(Acknowledgement Number):字段长32位,指下一次应该收到的序列号,实际上,它是指已经收到确认应答号减一为止的数据。发送端收到这个确认应答后可以认为在这个序号以前的数据已经被正常接收。
  • 数据偏移(Data Offset):该字段表示TCP传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看做是TCP首部的长度。该字段长4位,单位为4字节(32位)。如上图的TCP首部为20字节(5*4),因此数据偏移字段可以设置为5。反之,偏移字段为5,则TCP从一开始到20字节处都是TCP首部。
  • 保留(Reserved):主要为了以后拓展用,4位,常设为0。
  • 控制位(Control Flag):字段长位8位,从左往右依次是:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫控制位。具体含义如下图:
    这里写图片描述
    这里写图片描述

  • 窗口大小(Window Size):字段长16位,用于通知从相同TCP首部的确认应答号所指位置开始能接收的数据大小(8位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。

  • 校验和(Checksum):TCP和UDP的校验和相似,但是TCP的校验和无法关闭。
    TCP和UDP一样在计算时使用TCP伪首部,伪首部如下图,
    这里写图片描述
    在数据最后补零以令其全长为16的整数倍,首先将TCP校验和字段设为0,然后以16位为单位进行1的补码和计算,再将它们总和的1的补码和放入校验和字段。
    接收端在接收到TCP数据后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和之后,得出的结果是“16位全部为1”说明所收到的数据是正确的。

  • 紧急指针(Urgent Pointer):16位,只有在URG位为1时有效。该字段的数值表示本报文中紧急数据的指针。正确来讲,从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数据的末尾在报文段中的数据。

  • 选项(Options):该字段用于提高TCP传输性能,因为根据数据偏移(首部长度)进行控制,所以其最大长度为40字节。

附:窗口大小和吞吐量

TCP通信的最大吞吐量由窗口大小和往返时间决定,假定最大吞吐量为 Tmax ,窗口大小为W,往返时间是RTT的话,那么最大吞吐量的公式如下:

Tmax=WRTT

假设窗口有65535字节,RTT为0.1秒,那么最大吞吐量 Tmax 为:
Tmax=65535()0.1()=655358()0.1()

表示一个TCP链接所能传输的最大吞吐量为5.2Mbps。如果想要更高的网络吞吐量,就需要建立更多的连接。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值