赞
踩
目录
TCP是面向连接的、可靠的、基于字节流的传输协议。
确认应答机制是发送端发送数据给接收端,接收端收到数据后给发送端发送一个应答报文,此时发送端便知道接收端已经接收哪些序号的数据,下一次便知道从哪些数据开始发。
每一个确认应答ACK都带有对应的确认序列号,意思是告诉发送端,我已经收到了哪些数据,下一次你从哪里开始发
网络发送数据时,总是会出现各种错综复杂的情况,不一定都会出现确认应答机制那样传输数据,总会出现数据包丢失的情况,因此便有了超时重传机制。
超时重传机制使用在以下场景:
(1)数据包丢失
(2)确认应答ACK丢失
讨论:当确认应答ACK丢失后,过了一段时间,TCP进行超时重传,此时主机B已经收到了两段重复数据包,TCP会根据序列号对重复数据进行去重,只会保留一个相同的数据包。
超时时间的间隔是由 TCP为了保证在任何环境下都能进行高效通信传输,会动态的计算超时间隔时间。
如果一次超时重传失败,仍然得不到确认应答,此时会进行第二次重传,依次类推,以指数级递增,累计到一定次数重传失败,TCP认为网络或者对端主机出现严重问题,会强制断开连接。
答案:TCP的可靠性传输是由确认应答机制和超时重传机制来实现的
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接。因此TCP在传输数据前必须要先进行三次握手连接,结束传输后进行四次挥手断开连接。
三次握手和四次挥手的经典面试题见文章【计算机网络之TCP/UDP篇】TCP的三次握手四次挥手
正常情况下,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送 下一个数据段。这样做有一个比较大的缺点,就是性能较差,尤其是数据往返的时间较长的时候。
因此就可以使用滑动窗口机制,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)。
下图就是使用滑动窗口进行传输数据,同时将四个段的数据进行发送。
接收端接收处理的数据是有限的,当发送端发送的数据超过接收端处理数据的极限时,就会造成丢包,继而引起丢包重传等等一系列连锁反应。
因此TCP协议就根据接收端处理数据的能力来决定发送端发送数据的速度,这就是TCP的流量控制机制。
1、接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK端通知发送端;2、窗口大小字段越大,说明网络的吞吐量越高;3、接收端一旦发现自己的缓冲区快满了,就将窗口大小设置成一个更小的值通知给发送端;4、发送端接受到这个窗口之后,就会减慢自己的发送速度;5、如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
此处引入一个概念程为拥塞窗口 ,发送开始的时候,定义拥塞窗口大小为1; 每次收到一个ACK应答,拥塞窗口加1;每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;
- 当TCP开始启动的时候,慢启动阈值等于窗口最大值;
- 在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1;
- 少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络拥塞;
- 当TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;
- 拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。
如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小
- 假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K; 实际上可能处理端处理的速度很快,10ms内就把500K数据从缓冲区消费了;
- 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
- 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;
TCP是面向连接的、可靠性的和基于字节流的,因此TCP协议不仅为了保证数据的可靠性传输,还要提高数据传输的效率性,于是在传输数据时是十分复杂的。
TCP的可靠性机制
校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制
TCP提高性能
滑动窗口快速重传延迟应答捎带应答
UDP协议是无连接的、不可靠的、面向数据报的传输协议
无连接
知道对端的IP和端口号就直接进行传输,不需要建立连接;
不可靠的
没有任何安全机制,即使UDP发送的数据报在网络阻塞中丢失了,也不会给应用层发送任何信息,因此应用层也无法接收到任何消息
面向数据报
应用层交给 UDP 多长的报文, UDP 原样发送,既不会拆分,也不会合并;举例:用 UDP 传输 100 个字节的数据:如果发送端发送100个字节,那接收端也必须接收100个字节,而不能循环接收10次
两个问题答案类似,都可以参考 TCP 的可靠性机制在 应用层 实现类似的逻辑:(1)引入序列号,保证数据顺序;(2)引入确认应答,确保对端收到了数据;(3)引入超时重传,如果隔一段时间没有应答,就重发数据
TCP是面向连接的、可靠性的、基于字节流的传输控制协议
UDP是无连接的、不可靠的、数据报传输的传输协议
1、TCP协议多用于可靠性传输,要求精度高的场景,例如:文件传输、重要状态更新等场景
2、UDP协议相对于来说就很简单,简单到只负责发送数据包,不保证数据包能够准确的发送到对方接收端的手中;
但UDP的实时性相对更好,传输效率也更高。应用场景:用于对高速传输和实时性要求较高的通信领域,例如,早期的QQ,视频传输等。另外UDP可以用于广播;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。