关于TCP的那些事情(第1部分)TCP是一个非常复杂的协议,因为它必须解决许多问题,而这些问题带来了许多子问题和阴暗面。因此,学习TCP本身是一个痛苦的过程,但是学习过程可以使人们受益匪浅。关于TCP协议的详细信息,我仍然建议您阅读W. Richard Stevens'。 TCP / IP详细卷1:协议(当然,您也可以阅读RFC793和以下N个许多RFC)。另外,我将在本文中使用英语术语,以便您可以通过这些英语关键字找到相关的技术文档。我想写这篇文章是出于三个目的。一种是利用我的能力在一个简单的空间中描述这样一个复杂的TCP协议。另一个是当今许多程序员基本不认真阅读本书,喜欢快餐文化。因此,我希望这篇快餐文章能使您了解TCP的经典技术并体验软件设计。中国的困难。您可以从中获得一些软件设计收益。最重要的是,这些基础知识可以使您了解过去很多似曾相识的事物,并且您可以认识到基础知识的重要性。因此,本文将不会涵盖所有内容,而只是涵盖TCP协议,算法和原理的科学普及。我只想写很长的文章,但是TCP比C ++复杂。在过去的30年中,对各种优化变体进行了辩论和修改。因此,当我写书时,我发现我只把它切成两半。在上一篇文章中,我主要向您介绍了TCP协议的定义以及在丢包的情况下的重传机制。在下一篇文章中,重点介绍TCP流和拥塞处理。别胡说八道了首先,我们需要了解七层网络OSI模型中TCP的第四层-传输层,第三层IP-网络层和第二层ARP-在数据链路层中,第二层称为“帧”,第三层的数据称为“分组”,第四层的数据称为“段”。首先,我们需要知道我们程序的数据将首先发送到TCP段,然后将TCP段发送到IP数据包,然后发送到以太网帧,再发送到另一端,每个层分析您自己的协议,然后将数据移交给更高级别的协议进行处理。 TCP标头格式接下来,让我们看一下TCP标头格式。 TCP头格式(图片来源)您需要注意以下几点:TCP数据包没有IP地址,这是IP层上的问题。但是活动端口和目标端口。 TCP连接需要四个元组来表示相同的连接(src_ip,src_port,dst_ip,dst_port),确切地说,它是一个五元组,一个是协议。但是,因为我在这里只谈论TCP协议,所以我在这里只谈论四倍。请注意上图中的四个非常重要的内容:序列号是数据包的序列号,用于解决网络数据包重新排序的问题。确认号码是ACK& mdash;用于确认收货,解决无丢包的问题。窗口也称为AdverTIsed-Window,它是著名的滑动窗口(Sliding Window),用于解决流控制。 TCP Flag是分组的类型,主要用于操纵TCP状态机。对于其他事情,您可以参考下图TCP状态机实际上,网络上的传输没有连接,包括TCP都是相同的。所谓的“连接”指的是“连接”。实际上,TCP的“连接状态”只是维持“连接状态”。通讯双方之间的联系,使其看起来像是有联系。因此,TCP的状态转换非常重要。以下是:“ TCP协议状态机”。 (图片来源)和“ TCP链接建立”,“ TCP断开链接”,“数据传输”。比较图,我将两个图并排在一起,方便您彼此查看。此外,以下两张图片非常非常重要,您必须牢记它们。 (告诉我:当您看到如此复杂的状态机时,您会知道该协议有多么复杂。对于复杂的事物总是有很多作弊行为,因此TCP协议实际上是非常作弊的。)许多人会问,为什么您如此?需要建立一个链接? 3次握手,4次波浪打破了联系?对于三向握手建立链接,主要是初始化序列号的初始值。通信中的双方应相互告知其初始序列号(缩写为ISN:初始序列号)。所以叫做SYN