共计 4738 个字符,预计需要花费 12 分钟才能阅读完成。
TCP 协定是一种面向连贯的、牢靠的、基于 字节流 的传输层通信协议。TCP 是为了在不牢靠的互联网络上提供牢靠的 端到端 字节流而专门设计的一个传输协定。
应用层向 TCP 层发送用于网间传输的、用 8 位字节示意的数据流,而后 TCP 把数据流分区成适当长度的报文段)。而后 TCP 把报文段传给 IP 层,由它来通过网络将包传送给接收端实体的 TCP 层。
报文段
TCP 协定传输数据的单元称为报文段。一个 TCP 报文段 = TCP 首部 + TCP 数据。
IP 协定传输数据的单元是 IP 数据报,IP 数据报 = IP 首部 + IP 数据局部(整个 TCP 报文段)。
TCP 报文段格局如下:
(图片来源于网络)
TCP 头部
TCP 头部是 20 字节(不包含选项,选项的长度不定)。TCP 头部带选项的话,能够有 60 字节的长度。
- 头部中的源端口号和目标端口号:指明的是连贯的单方的端口号。IP 数据报头部中蕴含的源 IP 地址和目标 IP 地址。两个 IP 地址和端口号惟一标识了一个连贯。一个 IP 地址和端口号有时被称为一个端点(
endpoint
)或套接字(Socket
)。所以,每个 TCP 连贯由一对套接字或端点(四元组)惟一标识。 - 序列号:是一个 32 位的无符号数,从 0 -> (2^32-1) -> 0。TCP 传输过程中报文段携带的数据,序列号能够标识该数据的第一个字节。TCP 会给每个字节一个序列号。初始序列号是随机抉择的,会随工夫而扭转。
- ACK:确认号,它的值是接管方(也是发送 ACK 的一方)心愿接管的下一个序列号。所以,能够用于除了初始和开端报文段的其余报文段。发送一个 ACK 和发送一个 TCP 报文段是一样的,所用的开销也一样。
- 选项:选项长度能够达到 40 字节。常见的选项有最大段的大小,工夫戳,窗口缩放,选择性 ACK 等。
TCP 数据
TCP 数据是携带要传输的数据。TCP 数据局部的长度计算如下:
$$
IP 数据报长度 – IP 数据包首部(20 字节或 40 字节)– TCP 报文段首部(20 字节)
$$
在 IP 数据报中有一个字段是总长度,示意数据报的总长度是多少(以字节位单位),它是一个 16 位的字段。所以 IP 数据报的最大长度是 $z^{16}-1=65535$ 字节。而后能够计算出 TCP 数据局部的最大长度。
TCP 连贯
一个 TCP 连贯分为 3 个阶段:启动、数据传输、敞开。TCP 协定应用三次握手协定建设连贯,也就是启动阶段。
TCP 建设连贯之后,这个连贯就存在了。这个连贯的惟一标识就是一对套接字。
每个 TCP 连贯的惟一标识是一对套接字(源 IP,目标 IP,源端口号,目标端口号)。通过套接字辨别是不是同一个连贯。一个套接字(Socket
)是一个 IP 地址和端口号。
三次握手
通过三次握手建设牢靠的连贯(通信单方的发送 / 接管均没有问题)。当被动方收回 SYN 连贯申请后,期待对方答复 SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建设连贯的办法能够避免产生谬误的连贯。
(图片来源于网络)
因为三次能力保障单方具备接管和发送的能力。TCP 建设连贯时,通过三次握手能避免历史连贯的建设,能缩小单方不必要的资源开销,能帮忙单方同步初始化序列号。序列号可能保障数据包不反复、不抛弃和按序传输。
四次挥手
通过四次挥手断开连接。任何一方都能够在数据传送完结后收回连贯开释的告诉,待对方确认后进入半敞开状态。当另一方也没有数据再发送的时候,则收回连贯开释告诉,对方确认后就齐全敞开了 TCP 连贯。
(图片来源于网络)
断开一个 TCP 连贯则须要“四次挥手”:
- 客户端:发送一个 FIN,用来敞开客户端到服务器的数据传送
- 服务器:收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号
- 服务器:敞开与客户端的连贯,发送一个 FIN 给客户端,并蕴含一个 ACK,用于确认上一个 FIN。
- 客户端:发回 ACK 报文确认,并将确认序号设置为收到序号加 1
如何实现可靠性的??
- 传输数据之 前:三次握手建设牢靠连贯。
- 传输数据之 后:通过四次挥手断开连接。
传输数据之 中
分块;编号;校验和(传输过程中是否有变动);反复数据(抛弃);
进行期待 ARQ 协定(确认收到,超时重传);
滑动窗口:管制发送速率;拥塞管制:网络拥塞时的解决方案;
传输过程中如何保障可靠性??
- 利用数据被宰割成 TCP 认为最适宜发送的数据块。
- TCP 给发送的每一个包进行 编号,接管方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将放弃它首部和数据的测验和。这是一个 端到端 的测验和,目标是检测数据在传输过程中的任何变动。如果收到段的测验和有过错,TCP 将抛弃这个报文段和不确认收到此报文段。
- TCP 的接收端会抛弃反复的数据。
- 流量管制: TCP 连贯的每一方都有固定大小的缓冲空间,TCP 的接收端只容许发送端发送接收端 缓冲区(在内核中)能接收的数据。当接管方来不及解决发送方的数据,能提醒发送方升高发送的速率,避免包失落。TCP 应用的流量控制协议是可变大小的滑动窗口协定。(TCP 利用滑动窗口实现流量管制)
- 拥塞管制: 当网络拥塞时,缩小数据的发送。
- ARQ 协定: 也是为了实现牢靠传输的,它的基本原理就是每发完一个分组就进行发送,期待对方确认。在收到确认后再发下一个分组。
- 超时重传: 当 TCP 收回一个段后,它启动一个定时器,期待目标端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
滑动窗口
在接管方的 速度跟不上 发送方的速度时,会强制发送方慢下来,这成为流量管制。
流量管制有两种形式。一是基于 速率 的流量管制,给发送方指定一个速率,不能超过这个速率,最适宜 流应用程序 ,能够被用于播送和组播发现。二时基于 窗口 的流量管制,应用滑动窗口实现,接管方发送的确认报文中的窗口字段能够用来管制发送方窗口大小,从而影响发送方的发送速率。
TCP 采纳滑动窗口来实现流量管制。每个 TCP 头部中的窗口字段,其大小示意接收端可用缓存空间的大小,单位是字节。窗口字段的长度是 16 位。
每个 TCP 连贯的单方都有一个发送窗口和接管窗口的构造。发送端保护了一个发送窗口的构造,接收端保护了一个接管窗口的构造。
发送窗口
发送窗口的整个构造,记录了哪些序列号已确认,哪些正在传,哪些未传。
(图片来源于网络)
以上图为例,发送方的窗口大小为 20 个字节,窗口中蕴含已发送还未确认的序列号或分组,和还未发送的局部序列号。当接管方确认数据,发送方接管到一个 ACK,窗口也会右移,并将相应的分组正本开释,窗口也增大或放大(依据报文段中的窗口信息调节)。
接管窗口
接收端保护的接管窗口,记录了已接管并确认的数据,和它能接管的最大序列号。只有在窗口左右边界值内的序列号能力被接管并确认,窗口才会前移。这个窗口能够保障接收端接收数据的正确性,防止接管到反复的确认过的数据,或者接管不能接管的数据(超出窗口边界的数据不能接管)。
(图片来源于书籍 TCP/IP 详解 卷 1:协定)
怎么判断是反复数据?
当达到的序列号小于窗口左边界,会被认为是反复数据,从而抛弃。
此外,如果达到的序列号大于窗口右边界,接收端没有能力接管,也会被抛弃。
主动重传申请 ARQ
ARQ 协定是 OSI 模型中 数据链路层和传输层 的谬误纠正协定 之一。通过 确认 和超时 这两个机制,在不牢靠服务的根底上实现牢靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,通常会从新发送。ARQ 包含进行期待 ARQ 协定和间断 ARQ 协定。相比拟来说,间断 ARQ 协定可进步信道利用率。
- 进行期待 ARQ 协定
每发完一个分组就 进行发送 , 期待对方确认 (回复 ACK)。如果过了一段时间(超时工夫后),还是没有收到 ACK 确认,阐明没有发送胜利,须要从新发送,直到 收到确认后再发下一个分组。
出错状况:
- 呈现过错状况:超时重传;
- 确认失落
- 确认早退
反复的音讯和确认会抛弃。
- 间断 ARQ 协定
发送维持一个 发送窗口 ,凡位于发送窗口内的分组可间断发送进来,而不须要期待对方确认。接管方个别采纳 累积确认 ,对 按序达到的最初一个分组发送确认,表明到这个分组地位的所有分组都曾经正确收到了。
毛病:发送方发送了 5 条 音讯,两头第三条失落(3 号),这时接管方只能对前两个发送确认。发送方无奈晓得后三个分组的着落,而只好把后三个全副重传一次。这也叫 Go-Back-N(回退 N),示意须要退回来重传曾经发送过的 N 个音讯。
拥塞管制
在某段时间,若对网络中某一资源的需要超过了该资源所能提供的可用局部,网络的性能就要变坏。这种状况就叫拥塞。拥塞管制就是为了避免过多的数据注入到网络中,这样就能够使网络中的路由器或链路不致过载。
拥塞管制是一个 全局性 的过程,波及到所有的主机,所有的路由器,以及与升高网络传输性能无关的所有因素。
TCP 发送方要维持一个 拥塞窗口 (cwnd) 的状态变量。拥塞管制窗口的 大小取决于网络的拥塞水平 ,并且 动态变化。发送方让本人的发送窗口取为拥塞窗口和接管方的承受窗口中较小的一个。
$$
发送窗口大小 = min (拥塞窗口, 接管窗口)
$$
拥塞控制算法
TCP 的拥塞管制采纳了四种算法,即 慢开始 (从小到大)、 拥塞防止 (迟缓减少)、 快重传 和 快复原。
慢启动
TCP 连贯建设时或者重传超时导致的丢包时,会执行慢启动。因为在传输的初始阶段,并不知道网络的传输能力,避免大量数据注入网络而导致拥塞。慢启动是指数级的增长。
拥塞防止
在慢启动之后,达到一个阈值,阐明有更多能够用的传输资源。为了防止 TCP 占用太多的传输资源而影响其余的连贯,TCP 会进入拥塞防止的阶段,迟缓减少拥塞窗口的值。拥塞防止是线性级的增长。
快重传
快重传时依据收到 反复的 ACK 来判断丢包并启动重传,而不用期待重传计时器超时。
快重传和快复原,没有 FRR,如果数据包失落了,TCP 将会应用定时器来要求 传输暂停 。在暂停的这段时间内,没有新的或复制的数据包被发送。如果接管方接管到一个 不按程序的数据段 ,它会立刻给发送方发送一个反复确认。如果发送方接管到三个反复确认,它会假设确认件指出的数据段失落了,并立刻重传这些失落的数据段,不会因为重传时要求的暂停被耽搁。当有 独自的数据包失落 时,疾速重传和复原(FRR)能最无效地工作。当有多个数据信息包在某一段很短的工夫内失落时,它则不能很无效地工作。
失序
失序的 2 种状况
在 IP 网络中呈现包失序的起因在于 IP 层不能保障包传输是有序进行的。失序问题可能存在于 TCP 连贯的正向或反向链路中。数据段的失序和 ACK 包的失序,对于 TCP 的影响是不同的。
如果失序产生在 反向(ACK)链路,就会使得 TCP 发送窗口疾速前移,接着可能又收到一些反复的而应该被抛弃的 ACK。因为拥塞管制行为,这种状况会导致发送端呈现不必要的流量突发,影响可用网络带宽。
如果失序产生在 正向链路,TCP 可能无奈正确辨认失序和丢包。数据的失序和丢包丢回导致承受端收到无序的包,从而造成数据的空缺。当失序水平不是很大,比方两个相邻的包交换程序,这种状况是能够迅速失去解决。当失序重大时,TCP 会误认为数据曾经失落,会导致伪重传,这次要来自快重传算法。
快重传时依据收到 反复的 ACK 来判断丢包并启动重传,而不用期待重传计时器超时。
TCP 数据传输的过程
- 发送方通过三次连贯和接管方建设连贯。在建设连贯之后会进行数据传输。
- TCP 会将数据切分成多个数据块,每个数据块都有一个序列号能够标识数据块。
- 发送方传输发送窗口中的数据,接管方收到数据,如果在接管窗口之内就接收数据,并发回确认。
- 如果数据不是按程序达到接收端,若是失序,在较小范畴内能够调整,触发快重传机制,不必期待计时器超时再重传数据。如果失序范畴比拟大,发送端接管到 3 个反复的 ACK,就会认为数据段失落,从而重传该数据段。
- 发送方接管到 ACK 确认后,发送窗口右移,持续传输数据。
- 数据传输完,TCP 通过四次挥手断开连接。
参考资料:
- 书籍:TCP/IP 协定 卷 1:协定 第 2 版