这里是Themberfue
在讲完了UDP协议后,我们进入更为重要也是更为复杂的TCP协议,探究其是如何让数据可靠传输的。
TCP协议报文格式
- 关于TCP协议的一些特点我也不过多赘述了,详情请见:TCP
- ✨TCP:有连接、可靠传输、面向字节流、全双工
- 我们依然从协议报文格式开始
- 第一眼看着这个报文格式,不禁感叹这些都是什么玩意儿?不急,我们一个一个看。首先,源端口和目的端口与UDP报文格式的含义一样,因为端口本身就是传输层所管理的,不管是哪个传输层协议的报文格式,都必须有源端口和目的端口。
- 我们看到 首部长度(4位),由于这个字段以及选项字段的存在,所以TCP的报头长度是可变的,首部长度这里最高4位,那么可表示的范围就是 0-15,这里的单位是4字节,所以TCP报头的最大长度为60字节(15 * 4),其中,20字节为固定部分,那么剩下的部分就放在选项字段。选项字段是否存在,取决于报头的大小是否超过20。例如:报头的大小为32字节,20字节为固定长度,那么12字节就在选项字段中。
- 保留(6位),由于UDP协议的长度最长为64kb,如果要传输更大的数据就需要拆包组包等操作,十分麻烦。为了避免出现UDP类似的问题,该字段的设计初衷是用于未来扩展,以便在需要时新增功能而无需重新定义协议,一般情况下都填充为0,先占个位置~
- 16为校验和,与UDP协议一样,都是用来校验传输过程中数据是否发生错误的。
- 剩下几个字段我们放到后面讲,我们先讲解一下TCP协议的一些核心机制。在保留字段的右边,有六个字母简写,这六个非常重要,是TCP协议最核心的六个标志位。
TCP的核心机制
- ✨我们知道,TCP有一个特点就是其可靠性。因为数据在传输过程中会经历各种路由器设备的转发,所以,数据在传输过程不可能百分之百到达对端。保证数据的可靠传输一直都是开发人员的研究方向。
确认应答
- ✨确认应答是网络通信中保证数据传输可靠的重要机制之一,保证可靠传输的一个关键前提就是发送方知道我的数据发送到了接收方那里。
- 确认应答(Acknowledgment, ACK)是指数据接收方在成功接收到数据后,向发送方发送的反馈信号,表示该数据已正确接收。
- 发送方在收到 ACK 之前,会保留已发送的数据副本,以便在超时或丢包情况下重新发送。
- 确认应答就是六个标志位的ACK标志位,通常将ACK位置置为1表示其为一个确认报文。
- 但是,简单的发送确认报文并不能解决可靠性,因为发送方一次性向接收方发送的数据一般不止一条,可能存在多条,而数据在传输过程中通常要经过许多节点,这就导致了,先发送的数据可能会比后发送的数据后到,也就是后发先至。比如你向你的好友先发送 “在吗?” 后发送 “你好”,但是对方可能先收到 “你好” 后收到 “在吗?”,这就感觉很奇怪。
- 此时,TCP协议报文格式中的序号字段和确认序号字段就发挥作用了,对每个数据都进行编号,但是TCP协议是面向字节流的,所以是按照 “字节” 进行编号的,一个字节一个编号,为了编号的有序性,序号通常是从1开始逐渐递增的。
- 由上图可知,将整个TCP数据报以1000字节为分,假设总共有5000字节,那么就会发五次,就可能有五个确认应答报文。而确认序号就是将接受的载荷部分的最后一个字节序号+1,填写到确认序号字段中。比如,发送方发送 1-1000 的载荷部分,接收方则发送1001的确认应答报文。