TCP内部的十大核心机制

1、确认应答机制

TCP是可靠传输,那么TCP协议能够实现可靠传输的核心机制就是确认应答机制
A给B发了一条信息,B收到后会返回一个应答报文(ACK),此时,A收到应答之后,就知道刚才的数据顺利到达B了
在这里插入图片描述
但是如果A给B发了两条信息,B再次做出应答,就无法分辨B应答的是哪个信息,因为在网络上存在 “后发先到” 的情况,即后发出的信息比先发出的信息更早到目的地
在这里插入图片描述
如上图所示,我们无法分辨B应答的是哪一条信息
针对上述的问题,我们直接给报文加上编号就行了

任何一个数据包括应答报文都是有序号的。但是确认序号,一般只有应答报文有,普通报文的确认序号无意义。

如何辨别普通报文和应答报文呢?看下图:
在这里插入图片描述


实际上,TCP的序号并不是一条一条来编号的,因为TCP是面向字节流的,所以TCP的序号也是按照字节来编号的 假设一条数据是1000个字节,那么假设他从1开始编号,此时第一个字节序号就是1,第二个字节序号就是2......以此类推,最后一个字节序号就是1000。

但是由于这1000个字节都属于同一个TCP报文,所以TCP报头里就只记录当前的第一个字节序号,当A发送的第一条数据到达B之后,B会返回一个应答报文,该应答报文的序号是1001,表示前1000个字节的数据我已经收到了,现在A现在要发送第1001个字节的数据了(B向A索要1001的数据);


2、超时重传机制

在确认应答机制中,只是做出了数据传输顺利的情况,但是如果数据传输不顺利呢?A发送完后却数据迟迟收不到应答报文即 “丢包” 情况;丢包主要有两种:1、A发送的数据丢了 ; 2、B返回的应答报文(ack)丢了;
当出现丢包情况时,TCP就会启动超时重传机制,即重新发送一遍相同的数据
在这里,TCP引入了一个时间阈值,当发送方发送数据时,就会开始计时,如果到达时间阈值后也没有收到接收方返回的ack,此时不管是ack还在路上还是丢包了,都统一认为是丢包,发送方会重新发送数据;

超时重传机制:超过一定时间,还未响应,就重新发送数据;

但是这个时间阈值具体时间多少,就要根据系统来决定,没有一个绝对值;


问题一:如果出现了重复传输的数据怎么办?
TCP存在一个接收缓存区(接收饭是钢操作系统内部的一段内存),每个TCP都有一个socket对象,都有一个接收缓存区;主机B收到A发送的数据后,就把数据放到对应的接收缓存区中,根据数据的序号,很容易就分辨出两端数据是不是重复数据,如果是重复数据,就直接将后进来的数据丢弃;
TCP的这个接收缓冲区,是用来给接收到的数据进行排序的,保证应用程序读到的数据是有序的(和发送的数据一致)


可靠传输是TCP最核心的部分,而可靠传输就是通过确认应答机制+超时重传机制来体现的! 确认应答机制是在数据传输顺利的情况下应用的; 超时重传机制是在数据传输不顺利的情况下应用的;

3、连接管理机制

连接管理机制即客户端与服务端建立连接与断开连接的过程,这里就涉及到一个非常重要的知识点三次握手与四次挥手
建立连接:三次握手;
断开连接:四次挥手;


1、三次握手

建立连接(三次挥手) 过程:建立连接就是一个彼此之间记录对方的信息,并且相互认同的过程;
在这里插入图片描述

三次握手本质上就是确定双方的接收和发送能力;

三次握手的意义:

  1. 让通信双方各自建立对对方的认同
  2. 验证通信双方的发送和接受能力
  3. 双方协商一些重要参数

在这里插入图片描述

在这里插入图片描述


2、四次挥手

四次挥手:就是断开连接的过程
大致可以用下图来表示:
在这里插入图片描述
更准确的可以根据下图来表示:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里客户端保持TIME_WAIT的状态就是TCP超时重传机制的体现;那么客户端具体等多久呢?大概是2msl左右,一旦超过2msl客户端还没有收到服务端发来的FIN,就默认ACK已经到达,客户端就关闭了


4、滑动窗口机制

上面三个机制确认应答机制、超时重传机制、连接管理机制都是TCP为可靠连接提供的机制,那么因为TCP可靠连接的性能较高,相应的传输效率就会下降,因此== TCP就有了滑动窗口机制来提高传输效率!(但是再怎么提高也不会超过UDP的传输效率)==


滑动窗口的本质是降低了确认应答,等待ACK报文的时间;即批量发送批量等待,把多个报文同时发送,多份等待时间合成一份了;
看下图了解二者的区别:
在这里插入图片描述
在这里插入图片描述
问题一:发送完一个窗口的数据之后什么时候继续往下发送数据呢?
在这里,发送完数据之后就进入了等待ACK的时间,但是并不是等所有ACK都返回,才发送数据,而是返回一个ACK就发送一条数据!所以窗口的大小始终不变,称为“滑动窗口”;


在这里插入图片描述
问题二:如果在上述进程中出现了丢包怎么办?
1、ACK丢包了:不需要做任何处理在这里插入图片描述

2、数据丢了:
在这里插入图片描述


5、流量控制机制

这是一个干预滑动窗口机制中窗口大小的机制;
滑动窗口机制中,窗口越大,效率越高,相同时间等待的ACK也就越多;但是窗口也不能无限,如果窗口大大小超过了接收方的接受能力,发送的数据接收方处理不完,发送也是白发送;

而流量控制机制就是根据接收方的处理能力来控制窗口大小,即发送方的发送效率;
接收方的接收能力可以根据接收方的接收缓存区的剩余空间来判断

在这里插入图片描述

当滑动窗口的大小是0时,客户端就会停止发送,在这个停止等待的时间里,客户端会定时给服务端发送一个窗口探测报文,这个报文没有任何业务数据,他的作用仅仅是为了触发服务端的ACK,来获取窗口大小的值;


6、拥塞控制

拥塞控制和流量控制共同决定了滑动窗口的大小!
流量控制:考虑的是接收方的处理能力;
拥塞控制:考虑的是传输过程中,中间节点处理能力;

在这里插入图片描述

拥塞控制的本质就是通过实验的方法来找到适合的窗口大小


在这里插入图片描述


7、延时应答机制

延时应答机制也是TCP用来提高效率的一种机制,他是在接收方处理能力之内将窗口大小放大一点的机制;

延时机制:在接收方收到数据后,稍微等待一会在发送ACK报文,在这个等待的过程中,接收方的应用程序就会把缓存区的数据先消费一波,此时缓存区的剩余空间就多了一点,返回的值也就大了,发送方的窗口大小也就大了一点;
在这里插入图片描述


8、捎带应答机制

这是在延时应答的基础上进行捎带应答
在这里插入图片描述
捎带应答是说能不能合并,而延时应答是提高了合并的概率;


9、面向字节流

因为TCP是面向字节流的,此时就有了"粘包问题";
接收方把数据放到接收缓存区后,当应用程序read读取缓存区数据时,就分不清哪里是应用层数据报结尾,此时read的数据可能是半个应用层数据报,可能是完整的数据报,这是不得而知的;
此时就需要我们自己去定义区分方法:1、约定好分隔符 ;2、约定好每个包的大小
在这里插入图片描述


10、特殊情况

特殊情况一般是出现不可抗力:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值