文章目录
TCP
全称为"传输控制协议"(Transmission Control Protocol)。正如其名字一样,要对数据的传输进行一个详细的控制。
一、TCP 协议段格式
下图即为 TCP 的协议段格式(大概知道就行)。
- 源 | 目的端口号:表示数据是从哪个进程来,到哪个进程去。
- 序号 | 确认序号:用来保证数据的顺序。在确认应答中,会详细介绍。
- 首部长度:表示该
TCP
头部有多少个 32 位 bit (有多少个 4 字节)。4 位就是 4 个 bit 表示的数据范围 0~15,由于单位是 4 字节,所以最大长度为 60 字节。除去选项和数据,根据上图可知,TCP
的最短长度为 20 字节(16 位为 2 个字节)。TCP
报头自身不表示TCP
长度,TCP
载荷的长度需要结合IP
协议报头来计算。- 保留(6 位):未被使用的 bit 位。属于防范于未然,后续如果要扩展一些新功能,就可以使用保留位来表示。
UDP
就是吃了扩展性差的亏。- 6 位标志位:TCP 的灵魂。
URG:紧急指针是否有效。
ACK:确认序号是否有效。
PSH:提示接收端应用程序立刻从 TCP 缓冲区把数据读走。
RST:要求重新建立连接。我们把携带 RST 标识的称为复位报文段。
SYN:请求建立连接。我们把携带 SYN 标识的称为同步报文段。
FIN:通知对方,本端要关闭了。我们称携带 FIN 标识的为结束报文段。- 窗口大小:表示滑动窗口的剩余大小。在下面滑动窗口会涉及到。
- 校验和:发送端填充,CRC 校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含 TCP 首部,也包含 TCP 数据部分。
- 紧急指针:标识哪部分数据是紧急数据。
- 选项:翻译成“可选项”,可以选择加或者不加一些参数。TCP 头部最长长度和最短长度的差,即为选项的最大字节数为 40 字节。
- 数据:载荷部分。TCP 数据长度没有限制。
二、TCP 协议的核心机制
接下来要介绍TCP
10 个比较核心的机制。注意:TCP 不是只有 10 个机制!这里是根据面试和实际工作,挑了 10 个有代表性的来介绍。
10 个核心机制如下:
- 确认应答
- 超时重传
- 连接管理
- 滑动窗口
- 流量控制
- 拥塞控制
- 延时应答
- 捎带应答
- 面向字节流
- 异常情况
2.1 确认应答:
确认应答是TCP
保证可靠传输的核心机制。发送方向接收方发送数据后,接收方会向发送方回复收到(这样用于“应答”的报文称为“应答报文”,应答对应英文单词acknowledge
缩写即为ack
,就是 6 个标志位的其中一个,如果 ack 标志位为 1 说明这是一个应答报文)。
这样的做法还存在一个问题:如果在网络传输的过程中,发生后发先至的情况该怎么办,本来是要应答问题 2 的,给应答到问题 1 上了。
解决方案:后发先至是网络通信中客观存在的,改变不了。我们可以对传输的数据进行编号,并且让应答报文的编号和发送的数据编号能够对应起来。这样即使出现后发先至,也不会出现“牛头不对马嘴”的情况。
TCP
将每个字节的数据都进行了编号,即为序号。
TCP
报头通过存储载荷数据第一个字节的序号,来推算出后面字节的序号(一个TCP
报文载荷字节序号是连续递增的)。
注意:虽然 TCP 序号是连续递增的,但是不一定是从 0 或者 1 开始的。具体如何开始,为啥这么设定,下面“连接管理”再详细解释。
确认序号的设定也非常有特点:取值是要应答数据的最后一个字节的序号再 + 1。
这是一个非常好的设计,含义有两个:以上图为例,B 发送确认应答报文(确认序号为:1001)。含义一:对于 B 来说,小于 1001 的数据都已经确认收到。含义二:B 再向 A 索要从 1001 开始的数据。
2.2 超时重传:
超时重传用来解决丢包问题。
主机 A 发送数据给 B 之后,可能因为网络拥堵等原因,数据无法到达主机 B 。
如果主机 A 在一个特定时间间隔内没有收到 B 发来的确认应答,就会进行重发。
但是,主机 A 未收到