IP和MAC层的传传及内存受限,用于发送数据包。输重因此,工作它们都会限制消息的原理长度。
这一限制要求TCP在提供给IP层之前,传传及将可变长度的输重字节打包成多个段。每个段的工作长度应该是合适的。
下面是原理一个简单的图示,展示了段是传传及如何通过互联网发送的。
1*IRdfZ4LKKpQ-KRz_Y3QR7g.png
客户端的输重HTTP层正在向目标服务器发送一个18字节的流。
当字节16-18尚未到达TCP层时,工作字节12-15通过了它。TCP将它们打包成一个段,并附加了一个TCP头,标记在黄色区域。
接下来,该段被IP层封装,通过互联网发送,然后到达服务器。
假设TCP段的长度超过了底层支持的长度。在这种情况下,IP层将负责将大段拆分成多个片段。这是一个昂贵的过程,因此我们希望避免这种情况。
但是TCP如何确定长度呢?这取决于最大段大小(MSS)。
理想情况下,我们希望选择一个最大化数据量、最小化头部比例并避免在IP层进一步拆分的MSS。
默认情况下,MSS为536字节。这个数字是从哪里来的呢?
因此,536 = 576 - 20 - 20。
你可以看出MSS仅表示数据体的大小,不包括头部。
1*creWLybyfKDBJgTzQP1kDg.png
MSS是在TCP三次握手期间进行协商的。以下是TCP段头的格式。MSS位于TCP选项中。
1*pQpFRUuyzaG4JOm93Wg5Zw.png
在SYN消息中,客户端建议MSS为1460字节。这被称为发送方最大段大小(SMSS)。
1*dG1cCAjKY0v8Xfx2SeBcFA.png
在服务器的响应中,它建议段的大小不超过1400字节。由于大小来自服务器,因此被称为接收方最大段大小(RMSS)。
为了确保传输的可靠性,TCP需要完成两个功能:
让我们从一个简单的模型开始。
1*bvkdWnFF55OCLfstaE_GEw.png
1.首先,发送方在发送消息后维护一个计时器。2.在时间过期之前收到第一个ACK。然后,计时器被重置以等待第二条消息,然后重复此过程。3.第二个计时器过期,没有收到ACK。重传开始。
这种简单的设计是直接的,但效率较低,因为每个消息都需要等待前一个ACK返回。
让我们改进一下。
1*suv0nuvpmgUWaTd6riMUsQ.png
通过为每条消息分配一个ID,我们可以迅速发送多条消息。相同的ID与相应的计时器和ACK消息相链接。
如果一条消息丢失,例如#3,发送方将重新传输它。
在TCP中,“消息ID”是什么?它是序列号。
1*EbU2NjtCGn8z4gVCJr2Tyg.png
这里是一个消息的示例:
序列号最多可以达到2³²。然后它会重新开始。
这带来了一个问题。
1*RLp9kmWuRzlgY-NQs2F4Hw.png
想象一下,我们只有4个序列号,每次发送1字节。
为了解决这个问题,TCP选项中引入了时间戳。
1*jSrwaU0L-2EHyyIxzb2w_A.png
时间戳可以消除具有相同序列号的段之间的歧义。
让我们将时间戳附加到每个段上。
接收方读取时间戳B并将其与先前的时间戳E进行比较,以确认这是一次重传。否则,时间戳应该大于E。
TCP具有快速重传功能 - 在计时器到期之前重新传输丢失的段。
为了允许快速重传,我们需要为发送方和接收方设置一些规则。
1*nbAE5D9yMkUxvxxR4PJ27g.png
上图显示了快速重传的示例:
接收方可以通过选择性确认(SACK)功能与发送方共享信息,以便促进重传过程。
1*GhT0tOhF3YGrgQOIY56Esw.png
SACK位于TCP选项中。
在SACK中,我们可以指定已经接收到的数据的范围,超过确认号。
1*LujjJhnNyITz1dyL-CFfbA.png
这是SACK的示例,表示已接收的数据范围从2872到3393。
有了它,发送方知道不需要重新传输这些边界之间的任何字节。
此外,发送方还可以找出其他丢失的段并尽快进行重传。
(责任编辑:休闲)
新矿资源(01231.HK)年度扭亏为盈至83.1万美元 每股基本及摊薄盈利0.02美分
迪马股份(600565.SH):拟为联营企业提供共计154亿元融资担保额度 三年内有效
圆美光电(08311.HK)预计年度亏损减少约50% 对应数额约3407.8万港元