目录
快速开始
一、可靠传输
1、最开始的可靠传输实现方式:ARQ(Automatic Repeat-reQuest)协议
停止等待 + 超时重传
存在的问题:每发送一次数据,都要等待确认,时间过长。
比如分片数据发送后要等待1s收到确认再发送下一片,那么发送10个分片数据的时间就是10s
2、现在的解决方式:ARQ协议 + 滑动窗口协议
停止等待 + 超时重传 + 滑动窗口
一次发送多个分片数据,通过确认号来确认收到的数据
分片数据发送多少是由首部的窗口大小决定的,窗口大小是动态变化的,在发送过程中会互相告诉对方
3、选择确认
首部的选项部分可以存储收到了哪些数据,可以减少重传,提高传输效率
4、序号
两次分片数据的序列号之差算出的是数据部分的大小,不包括首部
每次连接都会有一个初始序列号
tcp链接有自己的一套随机算法,保证不同链接的序号不会重合
5、分片
大文件传输,在传输层已经大卸八块,不会轮到网络层再分片
为什么在传输层就进行分片?
6、看看本篇最后的几个思考
TCP的几个要点
可靠传输
流量控制
拥塞控制
连接管理:建立连接、释放连接
TCP可靠传输
一、停止等待ARQ协议
ARQ(Automatic Repeat-reQuest),自动重传请求
二、连续ARQ协议 + 滑动窗口协议
1、对比示意图
2、序号
现在假设每一组数据是100个字节,代表一个数据段 的数据
每一组给一个编号,这个编号就是首部的 Sequence Number字段
3、详细通讯示意图
三、选择性确认
1、
在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能
为改善上述情况,发展出了SACK(Selective Acknowledgment,选择性确认)技术
告诉发送方哪些数据丢失,哪些数据已经提前收到
使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)
2、
SACK信息会放在TCP首部的选项部分
Kind:占1字节。值为5代表这是SACK选项
Length:占1字节。表明SACK选项一共占用多少字节
Left Edge:占4字节,左边界
Right Edge:占4字节,右边界
一对边界信息需要占用8字节,由于TCP首部的选项部分最多40字节,所以
SACK选项最多携带4组边界信息
SACK选项的最大占用字节数= 4 * 8 + 2 = 34
3、使用了选择确认,确认号还有用吗?
如果你向服务器发送了1-100、101-200、201-300、301-400四个分片数据,但是101-200和301-400这两个分片数据丢失了,服务器在收到数据后可能会发送带有确认号和选择确认信息的TCP报文。
让我们假设你发送的数据序列号范围是:
第一个分片(1-100):序列号1到100。
第二个分片(101-200):序列号101到200。
第三个分片(201-300):序列号201到300。
第四个分片(301-400):序列号301到400。
如果服务器成功接收了1-100和201-300这两个分片,但是101-200和301-400这两个分片丢失了,服务器可能会发送一个TCP报文,确认号字段(acknowledgment number)表示期望接收的下一个字节的序列号。此时,确认号可能设置为101,表示期望接收序列号为101的字节。服务器可能还会在报文中使用SACK选项,指示成功接收的数据段范围。在这个例子中,SACK选项可能包含[1, 100]和[201, 300],表示成功接收的数据段的范围。
请注意,具体的TCP确认号和SACK信息可能受到TCP实现的影响,不同的实现可能会产生略微不同的结果。上述描述是一个常见的情况,但并不是唯一的可能性。
四、思考
1、重传次数
若有个包重传了N次还是失败,会一直持续重传到成功为止么?
这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接
2、同时建立的tcp链接的序号是否会重合?
ISN(初始序号)是通过一些随机化算法生成的,通常包括了一些与时间相关的信息,而且使用了足够大的序号空间。
这使得即使在短时间内建立的连接,其初始序号也是不同的,并且降低了序号重叠的可能性。
3、为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
因为可以提高重传的性能
需要明确的是:可靠传输是在传输层进行控制的
✓ 如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
✓ 如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可
这里补一张图片。。。
接收方在传输层无法拼接成一段完整的数据,无法发送ack给发送方,等待一段时间后发送之前的ack给发送方
4、TCP链接的唯一标识是如何确定的?
TCP连接的唯一标识通常由本地IP地址、本地端口号、远程IP地址和远程端口号这四个元素共同构成。这被称为四元组(quadruple)。
在网络协议栈中,这四个元素一起形成一个唯一的连接标识符,确保不同的连接具有不同的标识。
这是因为同一台计算机上的不同应用程序或服务可能会同时建立多个连接,而四元组提供了足够的信息来唯一标识这些连接。
5、不足接收方窗口大小时如何处理?
比如发送窗口大小是3000,接收窗口大小是4000,这是接收方会等待填满自己的接收窗口。
超时后就不在等待,然后发送自己的确认号给对方。
五、总结
可靠传输是通过,超时重传来实现的。
行者常至,为者常成!