深入浅出TCP协议

TCP协议是网络传输层中最重要的通信协议之一,它是面向字节流、面向连接的、具有可靠性传输的网络传输协议。

TCP头部格式

在这里插入图片描述

  • 源端口和目的端口(各16bit):接收方在进行数据分用的时候,传输层的tcp协议通过端口,可以将数据提交给指定侦听的应用程序;传输层再通过目的端口来区分数据属于哪一个进程。
  • 序号(32bit):传输方向上字节流的字节编号。初始时序号会被设置一个随机的初始值(ISN),之后每次发送数据时,序号值 = ISN + 数据在整个字节流中的偏移。假设A -> B且 ISN = 1024,第一段数据有512已经到达B,则第二段数据发送时序号为1024 + 512,用于解决网络包乱序问题。
  • 确认号(32bit):接收方对发送方TCP报文段的响应,其值是收到的序号值 + 1。
  • 数据偏移 / 首部长度(4bit):决定了TCP头部的最大长度。该字段占4bit,取最大1111时,即十进制15,TCP头部的偏移单位为4byte,所以TCP头部长度最大为15*4=60字节。
  • 标志位(6bit):一共6个标志位,各占1bit。
    1. URG:标记紧急指针是否有效。
    2. ACK:标志确认号有否有效(确认报文段)。用于解决丢包问题。
    3. PSH:提示接收端立即从缓冲区读走数据。
    4. RST:表示要求对方重新建立连接(复位报文段)。
    5. SYN:表示请求建立一个连接(连接报文段)。
    6. FIN:表示关闭连接(断开报文段)。
  • 窗口(16bit):接收窗口。用于告知对方(发送方)本方的缓冲区还能接收多少字节数据。用于解决流量控制。
  • 校验和(16bit):接收端用CRC校验整个报文段有无损坏。

常见的TCP连接状态

  • CLOSED:初始状态。
  • LISTEN:服务器处于监听状态。
  • SYN_SEND:客户端 socket 执行 connect 连接,发送 SYN 包,进入此状态。
  • SYN_RECV:服务端收到客户端发送的 SYN 包并发送服务端自己的 SYN 包,进入此状态。
  • ESTABLISHED:表示连接已经建立。客户端收到服务端回复的 ACK + SYN后,向服务端发送了最后一个 ACK 包后进入此状态,服务端收到这个 ACK 包后进入此状态。
  • FIN_WAIT_1:主动断开连接的一方(通常是客户端)发送了 FIN 报文后进入此状态。等待对方的 FIN。
  • CLOSED_WAIT:被动断开连接方(假设是服务端)接收到主动断开连接方(假设是客户端)发送的 FIN 报文之后等待关闭的阶段。服务端在接收到客户端的 FIN 包之后自然是要立即回复 ACK 包的,表示已经收到断开请求。但是是否立即断开连接(向客户端发送 FIN 包)取决于是否还有数据需要发送给客户端,若有,则在发送 FIN 包之前均处于此状态。
  • FIN_WAIT_2:此时是半连接状态,即有一方要求关闭连接,等待另一方关闭。客户端接收到服务端的 ACK 包但没有立即收到服务端的 FIN 包,此时就处于FIN_WAIT_2状态。
  • LAST_ACK:服务端发送最后的 FIN 包,等待客户端最后的 ACK 响应,进入此状态。
  • TIME_WAIT:客户端收到服务端的 FIN ,并并立即发送 ACK 包做最后的确认,在此之后的2MSL 时间称为 TIME_WAIT状态。

TCP如何保证可靠传输

TCP提供了几大机制用来保证数据传输的可靠性,如下:

确认应答机制

当发送方发送一个报文的时候,需要带上一个序号。当接收方收到这个报文时,需要对该报文进行确认。并且也回复一个确认号,要求发送方下一次发送数据的时候,发送数据的序号必须从这个确认号开始。

超时重传机制

当发送方发送一条数据之后,就会开启一个重传计时器,用来计算数据发出去的时间,当数据发出去的时间大于RTO的时候,还没有收到确认报文,则重传报文。不论是数据丢失,还是接收方发送的确认报文丢失,对于发送方而言,都没有收到确认报文,所以发送方会在 RTO 时间之后进行数据的重新发送。

  • RTO:超时重传时间。动态计算出来的。
  • RTO = 2 * RTT (RTO是公式固定计算的,真正动态浮动的其实是RTT,根据具体的网络波动有关)。
  • RTT:报文往返时间。从发送报文开始计算,直到收到确认应答,所经历的时间。
滑动窗口机制

相对于之前的确认应答机制而言,滑动窗口机制的引入,不必让发送方等待一个报文的确认到达之后再发送下一个报文,而是允许发送方一次发送多个分组的报文到网络上。这样的话,就会提高双方发送数据的效率。

注意:滑动窗口是为了提高双方发送数据的效率,并不是发送方不需要接收方回复确认应答。

这里有个概念

  • 窗口:窗口大小指的是无需等待确认应答就可以继续发送数据的最大值。如下图的窗口大小就是4000个字节。

在这里插入图片描述
首先发送前四个段的时候,不需要等待任何ACK,直接发送;收到第一个段ACK确认应答后,窗口向后移动一个单位,继续发送下一个段的数据。以此类推,每收到一个段的 ACK ,窗口就向后滑动一次,但必须是收到最早发送的那个段的 ACK 。因为这个窗口不断向后滑动,所以叫做滑动窗口。如下图:
在这里插入图片描述
滑动窗口机制中有两种丢包情况,分别是数据丢失和应答丢失。

  1. 数据丢失
    在这里插入图片描述

针对于消息接收方而言,如果没有收到消息发送方发送的数据,即使接收到了更大序号的数据,也不可以进行确认回复,需要一直回复丢失的报文的起始序号。如图所示,当 1001~2000 报文丢失之后,发送端会一直收到 1001 这样的ACK,如果发送端主机连续三次收到了同样一个 ACK = 1001 这样的应答, 就会将对应的数据 1001 - 2000 重新发送(快重传),这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了。因为2001 - 7000接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中。
2. 应答丢失
在这里插入图片描述
如果发送方接受到比未确认序号更加大的确认序号的时候,就会认为没有收到的小的确认序号所对应的TCP报文已经被对端收到了。原因是:如果消息发送方没有收到小序号的tcp报文的确认数据包但是能收到大的确认数据包,说明对端一定收到了小的序号的tcp报文,否则消息接收方不会发送大的确认数据包。所以说,这种应答丢失的情况不会对数据的传输产生影响。

拥塞控制机制

4大算法:慢启动、拥塞避免、快重传、快恢复。

  • 慢启动 :1.当拥塞窗口小于慢开始门限的时候,执行慢开始算法,拥塞窗口的大小随着传输轮次,进行指数增长。核心思想就是:当双方建立连接之后,一开始不要发送大量的数据,而是先发送少量的数据,探测网络拥塞程度,当网络情况比较好的情况下,逐渐增大发送的数据量。

慢开始门限:是一个阈值:ssthresh,当拥塞窗口大小小于慢开始门限的时候,执行慢开始算法;超过慢开始门限,则执行拥塞避免算法。

  • 拥塞避免:当拥塞窗口大于慢开始门限的时候,执行拥塞避免算法,拥塞窗口的大小,随着传输轮次进行线性增长。当拥塞窗口大小cwnd大于等于慢启动阈值的时候,就进入拥塞避免算法。
    在这里插入图片描述
  • 快重传:当发送方发送的数据其中有一个丢失的时候,接收方就发出上一条已接收到的数据的重复确认ACK,意味着想让数据发送方提早的知道有一个数据段没有到达接收方。
  • 快恢复:如果网络拥塞导致发送方某一个TCP报文丢失,接收方会按照快重传,连续给发送方发送3个确认包。对于发送方而言,如果能连续收到3个重复的确认包,发送方会认为当前网络拥塞并不是很严重,安全没有必要从慢开始进行传输,而是设置新的慢开始门限(新的慢开始门限 = 发生网络拥塞时的拥塞窗口 / 2),将拥塞窗口等于新的慢开始门限,从而执行拥塞避免算法。
    在这里插入图片描述
捎带应答机制

为了减少网络中的数据量。当接收方接收到一个数据之后,发出确认的时候,是随着接收方发送给发送方的数据一起(ACK + PSH ),发送给发送方的。

延时应答机制

同样也是为了减少网络当中数据包的数据量的,防止网络拥塞。
在这里插入图片描述

  1. 当接收方接收到数据之后,等待200ms,等待应用层程序将接收缓冲区中的数据读走,从而扩大接收缓冲区的能力,在回复的时候,尽量告诉发送方自己的接收能力比较大。
  2. 延时应答并不是不应答,而是不立即确认,等待一段时间再返回。
TCP保活计时器:

保活计时器的目的是保证TCP连接是正常的。

  1. 产生的背景:当前这个连接已经两个小时没有产生数据了,则发送保活探测包;
  2. 每隔75s发送一个保活探测包,连续发送10次,如果10次都没有收到确认,则认为该连接异常;需要断开该连接。
  3. 保活计时器,只要收到一次数据,就会重置,从零开始。

参考:https://blog.csdn.net/sinat_36629696/article/details/80740678?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值