TCP 的那些事儿


TCP 协议

  TCP全称为 “传输控制协议(Transmission Control Protocol”),位于 TCP/IP 协议栈的第四层(从下往上)传输层,作用是要对数据的传输进行一个详细的控制。

注意:TCP 协议是一个相当复杂的协议,所以本文只是浅谈自己的理解

TCP 协议段格式

如图所示
在这里插入图片描述

我们需要注意以下几点

  • 源/目的端口号: TCP的包是没有IP地址的,那是网络层上的事。但是有源端口和目标端口,表示数据是从哪个进程来, 到哪个进程去。
  • 32位序号/32位确认号: 后面再详细说明。
  • 4位首部长度: 表示该TCP头部有多长(图中上下箭头表示),注意这里的单位是4字节。即4位最大表示15,所以最大长度就为 15*4 = 60 ,单位是字节(B)。
  • 保留位: 顾名思义,先占位置的,现在不用,后面可能会用。
  • 6位标志位: 每一位表示 0 或 1,相当重要,后面会详细解释。

  URG:紧急指针是否有效
  ACK :确认号是否有效
  PSH :提示接收端应用程序立刻从TCP缓冲区把数据读走
  RST :对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
  SYN:请求建立连接; 我们把携带SYN标识的称为同步报文段
  FIN:通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

  • 16位窗口大小: 后面再详细说明。
  • 16位校验和: 校验数据传输前后是否一致,校验和包括TCP首部和TCP数据部分。
  • 16位紧急指针: 标识哪部分数据是紧急数据;
  • 数据: 来自应用层的数据

TCP 的核心机制(重点)

确认应答(可靠性)

  确认应答机制是保证了 TCP 可靠性的核心机制。TCP传输数据的过程中,每次接收端收到数据后,都会对传输端进行确认应答,也就是会发送 ACK 报文。这个 ACK 报文中带有对应的确认序列号,告诉发送端,接收到了哪些数据,下一次的数据从哪里发。

如图所示
在这里插入图片描述

为了确定 TCP 传输过程中数据顺序不会乱,TCP将每个字节的数据都进行了编号,即为序号(这里的序号就对应了上面 TCP 报头32位序号和32位确认序号)。

编号规则如图
在这里插入图片描述

注意:接收端给发送端的 ACK 确认只会确认最后一个连续的包,比如这里第一次发送数据是(1~1000),接收端接收到了,返回 ACK 报文中带有对应的确认序列号1001。

注意:这里还有一个问题就是,关于 TCP 报头中,6位标志位的ACK,这个 ACK 为1 表示返回的确认序列号 1001 是有效的。

超时重传(可靠性)

  理解了确认应答,超时重传就很容易理解了。顾名思义,就是发送数据包出现问题了,然后选择重新再发送。

超时重传如图:第一种情况,发送数据包丢包
在这里插入图片描述

主机A发送数据给B之后,可能因为网络拥堵等原因, 数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;

第二种情况,主机A未收到B发来的确认应答,也可能是 ACK 报文丢失
在这里插入图片描述
因此主机B会收到很多重复数据, 那么 TCP 协议会利用前面提到的序列号能够识别出那些包是重复的包,并且把重复的丢弃掉。

补充:关于数据去重,TCP 有个“接收缓冲区”(一块内存),TCP 会根据数据包的序列号自动检测缓存区,然后实现去重。

再补充:关于超时重传,超时重传等待时间间隔不是固定的,而是逐渐变大的,比如在 Linux 当中超时以500ms为一个单位进行控制,发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传,仍然得不到应答,等待 4*500ms 进行重传,依次类推,以指数增长,累计到一定的重传次数,TCP认为网络或者对端主机出现异常,就强制关闭连接。

连接管理(可靠性)

  TCP 为了保证可靠性,还有一个重要的机制“连接管理”,即建立连接三次握手和断开连接四次挥手。

有关这里的内容在这篇文章中有详细讲到!TCP的三次握手和四次挥手

滑动窗口(提高性能)

  确认应答对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能较差,尤其是数据往返的时间较长的时候。那么我们可以一次发送多条数据,就可以大大的提高了效率,把一次发送的数据量称为窗口大小。
在这里插入图片描述
当主机 A 收到收到第一个返回的 ACK 之后就可以,窗口向后移动,继续发送第五段数据(4001~5000),以此类推,就形成了一个滑动的窗口

流量控制(可靠性)

  接收方处理数据的速度是有限的,如果发送方发送的太快,接收方就处理不过来,导致接收方的缓冲区满了,发送方再次发送,就会造成数据丢包,因此 TCP 根据接收端的处理能力,来决定发送端的发送速度,这种机制就被称为流量控制。
在这里插入图片描述
如图所示,发送端发送数据包,接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段,通过ACK端通知发送端。而接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端。发送端接受到这个窗口之后,就会减慢自己的发送速度。如果接收端缓冲区满了,就会将窗口置为0。这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段(一个字节),使接收端把窗口大小告诉发送端。这样的机制就大大提高了传输效率。

拥塞控制(可靠性)

  所谓拥塞控制也是为提高数据的可靠性,在不知道接收端的缓冲区大小的时候或者不了解当前网络状况是否良好的时候,如果一开始就发送大量的数据,就可能出现问题。TCP 就引入了慢机制,先发少量的数据,,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。在这里插入图片描述
如上图这种每次发送的窗口大小不断变化的被称为拥塞窗口,初始为1。这样的拥塞窗口增长速度,是指数级别的,“慢启动” 只是指初使时慢,但是增长速度非常快。为了不增长的那么快,因此不能使拥塞窗口单纯的加倍,引入一个叫做慢启动的阈值,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长。

延时应答(提高性能)

  如果接收数据的主机立刻返回 ACK 应答,这时候返回的窗口可能比较小,但是实际情况中接收端处理数据是非常快的,这就导致了返回 ACK 应答中的窗口大小是比实际窗口大小更小了。

举个例子:假设接收端缓冲区为1M,一次收到了500K的数据,如果立刻应答,返回的窗口就是500K。但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了。在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来。如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M。

所以窗口越大, 网络吞吐量就越大, 传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

捎带应答(提高性能)

  捎带应答也是为了提高传输效率的,虽然有延迟应答,但是客户端和服务器在应用层还是还是”一发一收”,此时就会导致数据传输效率低下,捎带应答就是接收端在给发送端发送数据的时候,捎带着向发送端发去确认应答,应答的内容是接收端已经收到发送端发送的数据。
在这里插入图片描述


提示:如果文章存在一些错误或者不清楚的地方,欢迎及时指出!!!

  

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值