文章目录
- 1、确认应答机制
- 2、超时重传机制
- 3、连接管理机制
- 1、三次握手
- 2、四次挥手
- 4、滑动窗口机制
- 5、流量控制机制
- 6、拥塞控制
- 7、延时应答机制
- 8、捎带应答机制
- 9、面向字节流
- 10、特殊情况
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、三次握手
建立连接(三次挥手) 过程:建立连接就是一个彼此之间记录对方的信息,并且相互认同的过程;
三次握手的意义:
- 让通信双方各自建立对对方的认同
- 验证通信双方的发送和接受能力
- 双方协商一些重要参数
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、特殊情况
特殊情况一般是出现不可抗力: