目录
4. 超时重传后如何判定接收到的确认报文是对原先报文的确认,还是对重传报文的确认?
1. TCP如何实现可靠传输?
(1)检验和:TCP首部加入了检验和字段,用于检测数据在传输过程中是否被修改。将发送的数据包二进制数据相加取反,若接收方通过接收到的检验和计算有误,则丢弃该数据包(确保无差错传输)。
(2)序列号和确认应答:TCP给每个发送的包进行递增编号,由于网络传输过程可能会导致晚发送包先到达接收方的情况,接收方需要将收到的包按序列号进行排序,对于重复的序列号包进行丢弃处理,再传给应用层(累积确认,保证有序性);接收方在收到数据包时要回复确认报文。
(3)超时重传:TCP在每个报文段发出后会启动一个计时器,当在规定时间内没有收到接收方发回的确认报文时,会重新发送该报文段,因此发送方需要在收到确认报文前保留之前发送报文段的副本,用于重传。
(4)流量控制:TCP连接的每一方都有一个缓冲空间,TCP的接收方只允许发送方发送接收方缓冲空间能够接纳的数据,当接收方无法及时处理发送方的数据时,会提醒发送方降低发送速率,从而防止接收方来不及接收包导致包丢失,流量控制协议是基于可变大小的滑动窗口协议。
(5)拥塞控制:当发生网络拥塞时,减少数据的发送,发送方将拥塞窗口与接收方发来的即时窗口进行比较,取较小值作为发送窗口的大小进行数据的发送,主要方法有:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
2. TCP提供可靠传输的两种协议
(1)滑动窗口协议
(2)连续ARQ协议(连续自动重传请求协议)
- 主要提供确认应答和重传两种机制
- 相较停止等待ARQ协议,提高了数据传输的效率和信道的利用率
3. TCP如何确定超时重传的时间
(1)超时重传时间RTO等于加权平均往返时间加上四倍的偏差加权平均值,即
(2)RTT(Round-Trip Time)为往返时延,包括了往返传输时延、路由器与交换机的排队时延以及应用程序处理的处理时延。RTTS为加权平均往返时间,第一次得到的RTT样本直接设置为RTTS,之后RTTS按以下公式求得,
(其中
,推荐设置为0.125)
(3)RTTD为往返时间的偏差加权平均值,初次设置为RTT样本的1/2,之后按以下公式求得,
(其中
,推荐设置为0.25)
4. 超时重传后如何判定接收到的确认报文是对原先报文的确认,还是对重传报文的确认?
(1)超时重传的确认主要会出现两种情况:
- 若将对原先报文的确认误认为对重传报文的确认,则会导致 RTO / RTTS 偏小;
- 若将对重传报文的确认误认为对原先报文的确认,则会导致 RTO / RTTS 偏大;
(2)利用Karn算法,当发生超时重传时,不采用其往返时延样本RTT,一般情况下让 。
5. 什么是滑动窗口?
这个不太好解释,文末附上一个参考链接,可以看看
(1)滑动窗口用于TCP的流量控制,其大小为发送方或接收方发送/接收报文段的数量,一般为缓冲区的剩余空间大小。
(2)接收方将接收窗口的大小发送,发送方根据接收窗口和拥塞窗口大小来确定发送窗口的大小,从而控制数据段的发送速率。
(3)发送窗口中的报文段包括已发送且确认的、已发送且未确认的以及未发送的;接收窗口包括已确认的和未确认的。
(4)发送方在停止等待前可以发送多个报文段,当靠前的报文段确认后将移动窗口。
(5)接收方在收到报文段后,回传确认报文以及已确认报文段的最大序列号,并判断接收窗口前沿指针开始的连续报文段是否都已确认并达到一定的数量,若是则将连续的报文段上传给应用程序,并移动窗口。
(6)正常情况下,后沿指针的移动量与前沿指针的移动量相同,若存在拥塞情况则视具体情况而定。
6. 固定窗口与滑动窗口的区别?
(1)首先简述一下两者
- 固定窗口:大小由TCP连接建立后数据包首部的窗口大小字段确定,在实际的传输传输过程中不会改变窗口的大小,其意义是一次可以传输的报文段数量。只有当所有的报文段都在接收方进行确认后才能继续发送新的报文段。由于网络拥塞导致的确认延迟会降低传输的速率和信道的利用率。
- 滑动窗口:分为发送窗口与接收窗口。发送窗口由接收窗口和拥塞窗口确定,当窗口的第一个报文段被确认后就可以对窗口进行移动;接收窗口采用的是累积确认的方式,当从窗口前沿指针算起,已确认的连续报文段达到了一定数量时就上传到应用程序,并移动窗口。
(2)区别:从固定窗口和滑动窗口的实现上看,滑动窗口更具灵活性,提高了数据的传输速率和信道的利用率。
(通俗上讲,固定窗口与滑动窗口就像小组排队与个人排队,例如,假设一个教室只能由一个班级使用,只有当一个班级的所有人都使用完了,才能换下一个班级使用,教室就是这个固定窗口;滑动窗口就像银行的柜台,当前面有人的业务办完后,再叫下一位到柜台进行办理业务。)
7. 流量控制中带来的死锁以及解决方法
(1)死锁发生场景:接收方向发送方发送零窗口报文后,接收方的缓冲区又有了一定的存储空间,接收窗口不为0,此时接收方等待发送方发送数据,而发送方收到了零窗口报文。
(2)解决方法:发送发设置了一个持续计时器,当隔一定时间没有收到报文时,则发送一个零窗口探测报文,获取接收窗口的大小。若接收大小为0,则复位计时器,否则就发送方会继续发送正常的数据报文段。
8. 什么是拥塞控制
当网络中某些资源供应不足,整个网络的吞吐量可能会随着输入负荷增加而减小,这种现象就是网络拥塞,在发生网络拥塞时,通过拥塞控制,减少发送的数据量。主要的实现方式有以下四种,
(1)慢开始
- 设置拥塞窗口cwnd为1,发送窗口rwnd = cwnd,每发送一个报文段,cwnd加1;
- 每经过一次传输轮次,cwnd成倍增长(指数级增长);
- 当cwnd大于门限阀值ssthresh,采用拥塞避免算法;
(2)拥塞避免
cwnd“加法增大”,即每经过一次传输轮次,cwnd增加一个固定值n(n一般取1),使得cwnd呈线性缓慢增长。
(3)快重传(网络吞吐量提高近20%)
- 接收方没接收到一个报文段就立即发出确认,而不是等待发送数据给发送方时才捎带发送;
- 当发送方收到三个连续的重复确认时,则直接重传相应的报文段,而无需等待超时重传计时器;
(4)快恢复
- 当发送方收到三个连续的重复确认时,将门限阀值cwnd设置为当前cwnd的一半;
- 接着执行拥塞避免算法,“加法增大”cwnd;
可以参考这篇博文:TCP的拥塞控制(详解)https://blog.csdn.net/qq_41431406/article/details/97926927
9.TCP如何处理粘包和拆包的情况
先解释一下,这两种情况以及发生的原因。
(1)粘包:接收方收到一个数据包,该数据包包含了两个数据包的信息。
- 发送方发送的数据包小于发送缓冲区的剩余空间,因此TCP将多次写入缓冲区的多个数据包一次性发送给接收方;
- 接收方没有及时从接收缓冲区中读取数据,导致缓冲区中存在多个数据包;
(2)拆包:接收方收到两个数据包,这两个数据包或是不完整,或是有多余的信息。
- 发送方发送的数据包大于发送缓冲区的剩余空间,因此对数据包进行拆包处理;
- 发送方要发送的数据包大小大于最大报文长度(MSS),因此对数据包进行拆包处理;
(3)解决方法:
- 在每个数据包的首部加入该包长度的字段,接收方收到数据包后读取首都包长度字段,获取每个数据包的实际长度;
- 发送方将每个数据包封装成固定长度的包,长度不足则进行零填充,接收方只用在接收缓冲区读取固定长度的数据;
- 在两两数据包之间填充特殊符号作为包与包之间的边界,接收方通过读取该边界划分数据包进行正确读取。
10. TCP如何提高网络利用率
(1)Nagle算法:一种延迟发送算法,当要发送的数据量很少时则等待一段时间再进行发送(若发送的报文段已经确认或是可以发送最大段长度的数据时则直接进行发送)。
(2)延迟确认应答:一般在收到的数据大小为段长度的两倍及以上时返回确认应答,当小于两倍的段长度时则等待(等待的时间一般不超过0.5s)。
(3)捎带确认:在发送数据的同时发送确认应答。
可参考博文:[面试时]我是如何讲清楚TCP/IP是如何实现可靠传输的 https://blog.csdn.net/shawjan/article/details/45117945
以上内容均是个人理解总结,若有错误欢迎指出!