【概述】
TCP 协议,是 TCP/IP 协议体系中一个十分重要且复杂的协议,是在不可靠的 IP 层之上实现的可靠的数据传输协议,其主要解决传输的可靠、有序、无丢失、不重复的问题
TPC 协议主要具有如下特点:
1)面向连接的传输层协议
TCP 协议是面向连接的协议,每一条 TCP 连接只能有两个端点,且每一条 TPC 连接只能是点对点的
同时,TCP 连接是一条虚连接,而非一条真正的物理连接
2.提供可靠的交付服务
与 UDP 的不可靠的交付服务不同,TCP 提供可靠的交付服务,以保证双方传送的数据无差错、不丢失、不重复、有序
3.面向字节流
虽然应用程序与 TCP 的交互是一次一个大小不等的数据块,但 TCP 将应用程序交付下来的数据看作一连串的无结构数据流
正是因为面向字节流的特性,TCP 在与在应用程序交互时,可以将太长的数据块划分短一些后再传送,也可等待积累有足够多的字节后再构成报文段发送出去
具体来说,TCP 发送方会根据接收方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)
4)提供全双工通信
TCP 两端都设有发送缓存、接收缓存,用来临时存放双向通信的数据,同时,而 TCP 对应用进程一次将多长的报文发送到 TCP 的缓存中是不关心的
对于 TCP 两端的发送缓存、接收缓存来说,他们存放如下数据:
发送缓存 | 接收缓存 |
---|---|
准备发送的数据 | 按序到达但尚未接收的数据 |
已发送但尚未收到确认的数据 | 不按序到达的数据 |
【TCP 报文】
TCP 传送的数据单元被称为 TCP 报文段,整个 TCP 报文段会作为 IP 数据报的数据部分封装在 IP 数据报中
一个 TCP 报文段分为 TCP 首部和 TCP 数据两个部分,其中 TCP 首部前 $20B$ 是固定的,后面有长度为 $4B$ 整数倍的可变部分
同时,TCP 首部的最大长度为 $60B$
TCP 报文格式如下图所示
其中,各字段含义如下:
1)源端口与目的端口
各占 $2B$,端口是传输层与应用层的服务接口,传输层复用与分用功能通过端口实现
2)序号
占 $4B$,TCP 是面向字节流的,因此 TCP 连接中传送的数据流的每一字节都会有一个序号,序号的值是本报文段所发送的数据的第一个字节的序号
例如,一 TCP 报文段的序号字段值为 $301$,携带的数据共有 $100B$,这就表明本报文段的数据的最后一字节的序号为 $400$,下一报文段的数据序号应从 $401$ 开始
3)确认号
占 $4B$,是期望收到对方的下一报文段的数据的第一个字节的序号
若确认号为 $N$,则表明到序号 $N-1$ 为止的所有数据都已被正确接收
例如,B
正确收到了 A
发送的一个报文段,其序号字段为 $501$,数据长度为 $200B$,这表明 B
正确收到了 A
发送的到序号 $700$ 为止的数据,因此,B
期望收到 A
的下一数据序号为 $701$,于是 B
发送给 A
的确认号会置为 $701$
4)数据偏移
数据偏移即首部长度,占 $4B$,其指出了 TCP 报文段的数据起始处距离 TCP 报文段的起始有多远
该字段的单位是 $32bit=4B$,因此当该字段的值为 $15$ 时,表明达到了 TCP 首部的最大长度 $60B$
5)保留
占 $6B$,保留为以后使用,目前全部置为 $0$,该字段可忽略不计
6)紧急位 URG
该位与紧急指针配套使用,当 URG=1
时,表明紧急指针字段有效,其告诉系统,此 TCP 报文中有紧急数据,需要尽快传送;当 URG=0
时,紧急指针字段无效
紧急数据,是指从第一个字节到紧急指针所指的字节
7)确认位 ACK
该位与确认号配套使用,当 ACK=1
时,确认号有效;当 ACK=0
时,确认号无效
TCP 规定,在连接建立后,所有传送的报文段都要将确认位 ACK 置为 $1$
8)推送位 PSH
当接收方收到了 PSH=1
的 TCP 报文时,就要尽快交付给上层,不再等到缓存填满后再向上交付
9)复位位 RST
当接收方收到了 RST=1
的 TCP 报文时,说明 TCP 连接出现严重差错,例如主机崩溃等,此时必须释放连接,然后再重新建立 TCP 连接
10)同步位 SYN
该位 TCP 连接有关,与确认位 ACK
组合使用
当 SYN=1
时,说明是一个连接请求或连接接收请求,此时根据确认位 ACK
的值,有:
SYN=1, ACK=0
:是一个连接请求报文,对方若同意建立连接,就在响应报文中使用SYN=1, ACK=1
SYN=1, ACK=1
:是一个连接接收请求报文,当同意建立连接时,在响应报文中使用该配置
11)终止位 FIN
该位用来释放 TCP 连接,FIN=1
表明该 TCP 报文段的发送方的数据已发送完毕,并要求释放 TCP 连接
12)窗口
占 $2B$,用来作为接收方让发送方设置其发送窗口的依据,指出现在允许对方发送的数据量,单位为 $1B$,用于 TCP 流量控制中
例如,某 TCP 报文段的确认号是 $701$,窗口字段是 $1000$,这表明,从 $701$ 号开始算起,发送此报文段的一方还有接收 $1000B$ 数据的接收缓存空间,即可以接收 $701$ 号到 $1700$ 号的数据
13)检验和
占 $2B$,检验和检验的范围包括 TCP 首部与 TCP 数据两部分
在计算检验和时,与 UDP 一样,要在 TCP 首部前加上 $12B$ 的伪首部,只需要将 UDP 伪首部中的协议字段的 $17$ 改为 $6$ 即可
TCP 伪首部格式如下
14)紧急指针
占 $2B$,仅当紧急位 URG=1
时有效,指出了本报文段中紧急数据共有多少字节
紧急数据会放置在本报文段的数据部分的最前面,当 URG=1
时,会将第一个字节到紧急指针所指的字节的紧急数据尽快交付
15)选项
长度可变,规定了最大报文段长度、移位数、时间戳、时间戳回显应答等选项
16)填充
为了使整个首部长度为 $4B$ 的整数倍而设立,当上述的所有字段的长度和不为 $4B$ 的整数倍时,将填充 $0$
【TCP 连接管理】
TCP 是面向连接的协议,因此,每一个 TCP 连接都有三个阶段:连接建立、数据传送、连接释放
TCP 连接管理,就是使 TCP 连接的建立与释放能够顺利进行
TCP 将连接作为最基本的抽象,每一条 TCP 连接都有两个端点,端点使用套接字(Socket)作为接口,也就是说,每一条 TCP 连接被通信两端的两个套接字唯一确定
TCP 连接的建立方式采用客户/服务器式,主动发起连接的应用进程被称为客户机,被动等待连接建立的应用进程被称为服务器
【TCP 可靠传输】
TCP 是在 IP 的不可靠服务的基础上建立的一种可靠数据传输服务
其提供的可靠传输服务,就是要保证接收方进程从缓冲区读出的字节流与发送方发出的字节流是完全一致的
与链路层的可靠性传输机制相似,TCP 中的可靠传输使用了校验、序号、确认、重传等机制来完成这个目的
由于 TCP 的校验与 UDP 的校验几乎一致,只是将伪首部的协议字段由 $6$ 改为了 $17$,这里不再赘述
【TCP 流量控制】
TCP 提供了流量控制服务,以消除发送方使接收方缓冲区溢出的可能性,其本质上是一个速度匹配服务,使发送方的发送速率与接收方的接收速率相匹配
TCP 提供了一种基于滑动窗口协议的流量控制机制,与链路层的流量控制机制十分相似
两者的区别在于:传输层定义了端到端用户间的流量控制,链路层定义了两个中间相邻结点的流量控制
此外,链路层的滑动窗口协议的窗口大小不能动态变化,传输层的窗口可以动态变化
【TCP 拥塞控制】
拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不至于出现过载
当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为时延的增加
比较来说,拥塞控制是让网络能够承受现有网络负荷,是一个全局性的过程,涉及到所有的主机、路由器、与降低网络传输性能有关的因素;流量控制,是端到端的通信量控制,通过抑制发送端发送速率,来使接收端来得及接收
为对传输层进行拥塞控制,TCP 定义了四个算法:慢开始、拥塞避免、快重传、快恢复