掌握这28张图,面试再也不怕被问TCP知识了

      最后更新:2022-06-28 07:03:55 手机定位技术交流文章

      与资讯科技有关的工作,当然不能被排除在网络之外,网络中最重要的协议是TCP。 不管是真正的工作还是书面面试,你认为在哪里可以获得较少的TCP?

      我在RFC中看到了与TCP有关的文档,我在Linux中看到了与TCP有关的源代码,我在许多框架中看到了与TCP有关的代码,我对TCP有一点感觉。

      事实上,当你通过TCP时也是一样。

      考虑最简单的例子:两个主机之间的通信。 目前,只有一个电线连接两个并设置硬件接口,例如USB、电压10V、频率2.4GHz等,这层是物理层,这些规则是物理层协议。

      当然,我们不能满足两台计算机的连接,所以我们可以使用开关连接多个计算机,如图所示:

      把他们连接起来的网络,称为局域网,它也可以称为Ethernet网络(Ethernet是一种本地网络)。在这个网络中,我们需要识别每个机器,这允许您指定您想与哪个机器进行通信的.这个标识符是硬件地址 MAC.硬件地址由机器生产确定,永久性唯一。在局域网中,当我们需要与其他机器沟通时,你只需要知道他的硬件地址,交换机将发送我们的信息给相应的机器.

      这里我们可以删除物理层并创建一个新的层,即数据链层,不管底层的线接口如何发送。

      我们仍然对网络的大小不满意,我们需要连接所有网络,在这个点我们需要使用路由器连接两个网络:

      但是如果我们仍然使用硬件地址作为通信对象的唯一标识符,因此随着网络的大小的增长,需要记住所有机器的硬件地址是不现实的;同时,网络对象可能经常更换设备,此时,硬件地址表的维护更加复杂。这里使用一个新的地址标记网络对象:IP地址。

      要理解IP地址,使用一个简单的邮件例子。

      我住在北京,朋友A住在上海,我想写信给朋友A:

      1. 写信后,我会把朋友A的地址写在信上,放在北京邮政局(将目标IP地址添加到信中并发送给路由器)
      2. 邮政局将帮助我把信送到上海的当地邮政局(信息将转到目标IP域网络路由器)
      3. 上海的本地路由器将帮助我把信寄给朋友A

      因此,这里IP地址是网络访问地址(朋友A的家地址),我只需要知道目标IP地址,路由器可以把消息传给我.在局域网中,MAC地址与IP地址之间的映射关系可以动态地维持.根据目标IP地址,您可以找到发送的机器的MAC地址。

      所以我们不需要管理底线如何选择机器,我们只需要知道IP地址,我们能与目标沟通。这一层就是网络层。网络层的核心功能是提供主机之间的逻辑通信.这样,网络中的所有主机,逻辑上彼此相连,顶层只提供目标IP地址和数据,网络层可以向相应的主机发送消息。

      一个主机有多个进程,过程之间存在不同的网络通信,就像对黑人的 side 和朋友和女朋友聊天的 Weibo.我的手机与两个不同的机器同时通信.所以当我在手机上获取数据时,如何区分是WeChat的数据,还是王者的数据?然后,您必须在网络层的顶部添加另一个层:

      通过插座的运输层,进一步分离网络信息,不同的应用程序程序可以独立地提出网络请求,互不干扰。这是运输层的最内在特征: 提供过程之间的逻辑通信.这里的过程可以是宿主之间,也可以是同个主机,在Android中,接口通信也是进程通信的一种方式.

      现在,在不同机器上的应用程序进程可以独立通信,我们可以在计算机网络上开发变形的应用程序:例如网页的http,文件传输ftp等。

      应用程序层也可以进一步与表示层和对话层分开,但它们的内在特性仍然不变:满足特定业务需要。

      最后, 总结了测量网络层:

      1. 最低的物理层负责两台机器间通过硬件的直接通信;
      2. 数据链层使用硬件地址定位本地网络并实现本地网络通信;
      3. 网络层通过抽象IP地址实现主机之间的逻辑通信;
      4. 基于网络层,传输层分隔数据,实现应用过程的独立网络通信;
      5. 在运输层的基础上,应用层根据具体要求开发形式的功能。

      这里应该指出,层不是物理层,而是逻辑层。 通过capsulating下层逻辑,上层开发可以直接依赖下层函数,不需要实现具体,从而简化开发。

      这种层级思维,是责任链设计模型,通过层级封装,将不同的责任分开,使开发、维护等工作更容易。 okHttp的拦截器设计模式与责任链模式相同。

      运输层

      本文主要解释了TCP, 在此需要增加一些运输层知识.

      本质:提供进程通信

      传输层下面的网络层,不知道该包属于哪个进程,他只负责接收和发送数据包。传输层负责接收不同进程的数据到网络层,同时, 网络层数据被分成不同的进程.从上到下集到网络层,称为多路复用,从下往上拆分,称为多路拆分。

      运输层的表现,受网络层的限制。这很好理解,网络层是传输层的基础支持.因此,传输层无法决定其自身带宽、时间延迟等限制。但基于网络层的更多功能可以开发: 例如可靠的传输.网络层仅负责尝试从一个端到另一个端发送数据包,不确保数据是可达和完整的。

      基本实现:插座

      前面讲到,最简单的运输层协议,是为过程提供独立的沟通,但底层的实现,它是一个独立的接口之间的通信.在网络层中,IP地址是一个主机逻辑地址,而在运输层中,索克是进程的逻辑地址,当然,一个过程可以有多个插座.应用过程可以通过插座监控,从这个插座获取接收到的消息。

      插座不是真正的东西。它是从传输层中抽象出来的对象.运输层增加了终端的概念,用来区分不同的插座。端口可以被理解为一个主机上的许多网络接口,每个港口都有一个港口号码,港口的数量由运输层协议确定。

      不同的传输层协议对接口有不同的定义。在UDP协议中,一个接口由目标IP+目标端口编号定义;一个接口由目标IP+目标端口编号定义;一个接口由TCP中的源IP+源端口编号定义。我们只需要把这些信息附上运输层报告的头部,目标主机会知道我们要发送哪个插座,可以获得关于应对接口进行监视的进程的信息。

      运输层协议

      传输层协议是著名的TCP和UDP协议。UDP是最复杂的传输层协议,只实现进程间通信;而基于UDP的TCP则实现可靠的传输、交通控制、拥堵控制、连接导向等,并且更复杂。

      当然,有更多的更好的传输层协议,但最广泛使用的是TCP和UDP。

      TCP协议首部

      在数据传输到应用程序层之前,在消息中表达的TCP协议是添加一个TCP字节的,这个字节添加了TCP信息,让我们看这个字节的整体结构:

      这个图片是来自大学教师的课,非常有用的,所以永远去学习。 下部代表报告之间的关系,而TCP数据部分是从应用程序层传输的数据。

      TCP的第一个固定长度是20字节,下面还有四个选择。内容很多,但其中一些是我们熟悉的:源码头,目标端口。嗯?是否需要插座通过IP定位?IP地址被添加到网络层中。其余内容将缓慢地解释,作为一篇总结文章,这里放出查阅表,方便复习:

      选项栏包含下列其他选项:

      当我告诉你以下的话之后, 你会再次熟悉这些短语.

      TCP指向特性

      TCP不直接将数据的第一个部分添加到应用程序层,然后发送到目标层,而是将数据视为单个字节流,然后通过指定序列发送到目标层。

      • TCP从应用程序层中以流的形式读取数据,并将其存储在自己的发送缓冲区,同时序列这些字节
      • TCP消息由发送者缓冲区选定的合适的字节组成,并通过网络层发送到目标
      • 目标读取部门并将其存储在接收器缓冲器中,并及时将它们送到应用程序层

      使用缓冲导向的方法的优点是,不需要一次储存太多的数据,因为太多的内存。坏消息是,你不知道这些角色是什么意思。例如,应用程序层发送一个音频文件和一个文本文件,对于TCP来说,它是一个串的节点,没有意义可言,这就导致了粘贴和拆卸问题,后面讲。

      可靠传输原理

      如上所述,TCP是一个可靠的传输协议,即它所提供的数据,可以完全无误地发送到目标地址,除非网络爆炸。 他所实现的网络模型如下:

      对于应用层来说,他是一个可靠的运输基础支持服务; 基础运输层使用网络层不可靠的运输.虽然网络层甚至数据链路层都可以使用协议来保证数据传输的可靠性,但网络的设计将更加复杂,效率将降低。为确保传输层的数据传输的可靠性,会更加合适。

      可靠传输原理的主要点是: 滑窗 、 超时再传输 、 累积确认 、 选择性确认 、 连续 ARQ.

      停止等待协议

      为了实现可靠的传输,最简单的方法是:我发送给你一个数据包,然后你回答我并接收,然后我继续发送下一个数据包。

      为了确保可靠的传输,这个“一对一”的办法是“停 wait ” 。 我不知道,我记不起。

      然后考虑另一个情况:行李丢失。网络环境不可靠,每次发送时都会丢失数据包,如果机器A发送丢失的包,那么机器B永远不会收到数据,机器A永远在等待。解决这一问题是: 超时转播.当机器A发送一个包时,它开始计时,现在还没有收到确认的答复,我们可以假设有行李丢失,便再次发送,也就是重传。

      但是重新传输会导致另一个问题:如果原来的包没有丢失,只是在网络里等待更长,此时,机器B将收到两个数据包,那么,如果它们属于相同的数据或不同的数据,那么机器B如何区分这两个数据包?这需要我前面所说的方法: 编码数据字节.因此接收器可以根据数据的字节数,结果如下:还是重传的数据。

      TCP的第一部分有两个字段:序列号码和确认号码,它们表示发送者数据的第一行的数目,和接收机预期的下一个数据的第一字母的数目。如上所述,TCP专为字节流,但是他并没有逐个发信,这是整个段落的一节。切片的长度受各种因素的影响,例如,缓冲区的数据大小,数据链层限制的帧大小等等。

      连续ARQ协议

      停止等待协议可以满足可靠的传输,但有一个致命的缺点:效率太低。 发送者发送一个包,然后进入等待,在此期间没有做任何事情,资源被浪费。

      停止等待的最大区别是,它会不断地发送源源,而接收者在接收数据后会不断地接收源源,一个接一个确认答复,这大大提高了效率。 但是还有一些额外的问题:

      发送是无限的,直到缓冲器中的所有数据被发送 吗?不可以。由于需要考虑接收器缓冲区和数据可读性。如果发送太快使接收者无法接受,只是有很多重复,浪费了网络资源。所以发送者发送数据的范围,需要考虑接收器缓冲区。这是TCP的流量控制.解决办法是: 把窗子滑动.基本模型如下:

      • 发送者需要设置自己的发送窗口大小,取决于接收器的缓冲大小,窗口内的数据表明它可以发送,外部的数据则不能发送。
      • 当窗口中的数据收到确认答复时,整个窗口向前移动,直到所有数据被发送

      在TCP的顶部,有一个窗口大小字段,表示接收者剩余缓冲大小,允许发送者调整自己的发送窗口的大小。 通过滑动窗口,TCP流量控制可以实现而不发送太快,造成太多的数据损失。

      连续的ARQ引起的第二个问题是,网络被填满了与发送数据包相同的数量的确认响应消息,因为每个数据包都是发送的,必须有确认的答复。提高网络效率的方法是: 累积确认.收件人不需要逐一答复,相反,在积累一定数量的数据包之后,告诉发送方,在收到这个包之前的所有数据。例如,收到 1234,接收者只是告诉发送者我收到了4,之后,发件人知道1234年已经收到。

      第三个问题是:如何处理数据包丢失。停止等待协议很简单,这是一个直接的超时继电器。但,在连续的ARQ中,情况并不完全相同。例如,收件人收到了123,567份,六个字节,4号节点丢失。根据思维的累积证实,只发送3个确认的答复,567都必须丢掉,因为发送者将重新发送。这是GBN(go-back-n)概念。

      但是我们会发现,只需要重传4即可,这不是浪费资源。那么,这就是:选择确认SACK。在TCP消息的选项栏中,您可以设置已收到的邮件的段落,报告 的 每一 段 需要 确定 两 个 界限 。这样发送方,您只能根据这个选项栏重新传输丢失的数据。

      可靠传输小结

      这里已经介绍了TCP的可靠传输原则,最后有一个小结论:

      • 确保每个数据包通过连续的ARQ协议和发送确认响应模式到达接收机
      • 将每个数据标记为重新传输的或新的数据,并给它一个记号
      • 通过超时再传输解决网络中丢失包的问题
      • 通过滑动窗口实现流量控制
      • 通过累积确认+选择性确认方法提高确认响应和再传输效率

      当然,它只是冰山的顶部,可以可靠地运送,而且研究它更有趣(几乎就像和面试官说话一样)。

      拥塞控制

      拥塞控制还考虑了另一个问题:避免过度的网络拥塞,导致严重的数据包丢失和减少网络效率。

      以实际交通为例:

      能够同时穿过公路的汽车数量是确定的.当节假日时,会有严重的交通堵塞.在TCP中,数据包超时,会进行重传,也就是说,更多的汽车会进来。这时候更堵,最终的结果是: 失败-重复-失败-重复.最后,整个网络都瘫痪了。

      这里的交通堵塞控制和前面的流量控制并不是什么东西,流量控制是交通堵塞控制的一种手段:为了避免交通堵塞,流必须控制.拥塞控制的目的是限制每个主机发送的数据量,避免减少网络拥塞效率.就像广州等地,限制旅行许可证的数目是有道理的.否则,每个人都会陷入困境,谁都别想走。

      交通堵塞控制的解决方案是流量控制,流程控制的实现是 sliding window,因此,拥挤控制最终也限制了通过限制发送人的 sliding window 的大小的交通。当然,交通堵塞控制的手段不仅仅是流量控制,造成拥塞的因素包括路由器缓存、带宽、处理器处理速度等等。增加硬件能力(从4条车道到8条车道)是其中一种方法。但毕竟,硬件升级有瓶颈,没办法不断提升,或者你需要从tcp本身添加算法,解决拥塞。

      交通堵塞控制有四个关键:慢启动、快速恢复、快速转播和避免交通堵塞。

      Y轴代表发送窗口的大小,而X轴代表消息的旋转(而不是字符号)。

      • 一开始,窗口设置一个较小的值,然后每轮都翻倍。
      • 当窗口值达到ssthresh值时,这个值是需要通过实时网络情况设置的窗口限值,并且开始进入减少拥挤,每次提高窗口值1,慢慢测试网络的底线。
      • 如果有数据超时,则表示会发生交通拥堵的可能性很高,然后返回慢启动,重复上面的步骤。
      • 如果收到三个相同的确认答复,表明网络现在不正常,则将 ssthresh值设置为原值的一半,并继续避免拥堵。
      • 如果你收到丢失的包信息,你应该尽快重新传输丢失的包,这是快速的重新传输。
      • 当然,窗口的最终上限不能是无限的,也不能超过接收器的缓存的大小。

      通过这个算法, 可以大大避免网络拥塞.

      此外,可以让路由器告诉发送者缓存即将耗尽时,不要等到过时发生后再处理它,这是主动队列管理AQM。

      面向连接

      这个节讨论了未知的TCP三个握手和四个波浪这些,在前面的节的内容之后,这个节实际上很了解。

      TCP是面向连接的,那连接是什么?这里没有真正的联系,相反,他们互相交流记录。TCP是一个完全双重通信,也就是说,你可以互相发送数据,因此双方都需要记录彼此的信息。根据上述可靠传输原则,双方的TCP通信需要为对方准备一个接收缓冲来接收对方的数据,记住对方的接口来知道如何发送数据,记住对方的缓冲来调整其窗口大小等等。这些记录,就是一个连接。

      如运输部分所述,传输层之间的通信地址由插座定义,TCP也不例外。每个TCP连接只有两个对象,那是两个插座,而不能有三个。因此,索克的定义需要四个关键因素:源IP、源端口号码、目标IP和目标端口号码。才不会发生混乱。

      如果TCP和UDP只使用目标IP+目标端口号码来定义一个接口,那么多个发送者同时发送到相同的目标接口。

      由于它是连接,有两个关键点:建立连接和切断连接。

      建立连接

      建立联系的目的是互相交换信息,然后记住对方的信息。 因此,双方需要互相发送信息:

      但上述可靠传输原则告诉我们,网络中的数据传输是不可靠的,要求对方给予我们确认的答复,以确保消息正确到达。

      对机器B的收据和机器B的信息的确认可以结合来减少频率;发送机器B到机器A本身代表机器B已经收到消息,所以最后的例子图是:

      步骤如下:

      1. 机器A向机器B发送一个同步包,请求建立一个TCP连接,并添加自己的接收缓冲区信息等,机器A输入SYN_SEND状态,表明请求已经发送并等待响应;
      2. 接收请求后,机器B根据机器A的信息记录请求,并创建自己的接收缓存,向机器A发送syn+ack合成器包,并输入SYN_RECV状态,表明它已经准备好,并且在等待机器A的答复时可以向机器A发送数据;
      3. 机器 A 记录 机器 B 收到 答复 后 的 信息, 发送 答复 的 信息, 输入 预备 状态 本身, 并 表明 它 已 完全 准备好, 可以 发送 和 接收 ;
      4. 机器B在接收ACK数据后进入STABLISHED状态.

      发送三个消息被称为三手握手。

      断开连接

      切断的连接与这三个手类似,直接在图上:

      1. 机器 A 发送 数据 后, 要求 机器 B 切断 连接, 并 进入 FIN_WAIT_1 状态, 表明 数据 已 发送, 并 已 发送 Fin 包 ( FIN 标记 位置 为 1 ) ;

      2.当机B接收Fin包时,答复Ack包表示已收到,但此时机B仍可能没有发送数据完成,进入CLOSE_WAIT状态,表明对方已发送数据完成,请求关闭连接,并在发送完成后可以关闭连接;

      3. 数据 发送 到 B 机 后, Fin 包 发送 到 B 机 并 输入 LAST_ACK 状态, 这意味着 在 等待 ACK 包 时 可以 关闭 连接 。

      4.当机器A接收Fin包时,知道机器B已发送它,返回ACK包并输入Time_WAIT状态

      当机器A接收机器B的 FIN包时,在理想的条件下,可以直接关闭连接;但是:

      1. 我们知道网络不稳定,而且机器B可能尚未发送数据(在Fi包下);
      2. 同时,返回的ACK包可能会丢失,机器B将重新传输 FIN包;

      如果A机此时立即关闭连接,数据将不完整,而B机则无法释放连接。 因此,A机需要等待最大两个消息的持续时间才能生存,以确保没有 messages left in the network,然后关闭连接

      5.最后,机器A等待存储两个消息的最长时间,机器B在收到ACK消息后关闭连接并进入 CLASED状态

      通过四次互相发送信息来打破双方之间的联系是四波的过程。

      现在,所有关于为什么握手三次、振手四次、你必须握手三/四次、为什么停止2msl和关闭连接等问题都得到了解决。

      UDP协议

      除了TCP之外,传输层协议也被称为UDP。 如果TCP由其稳定的功能独特的树完成,那么UDP是一个简洁的摔跤死亡大师。

      UDP实现最小传输层的功能:进程间通信。 对于向应用程序层传输的数据,UDP简单地直接将第一个部分添加到网络层。 UDP的头部非常简单,由三个部分组成:

      • 源端口,目标端口:端口数用于区分主机的不同进程
      • 验证代码:用于验证数据包在传输过程中没有错误,例如1变为0
      • 长度:报文的长度

      因此UDP只有两个功能:验证数据报告中的错误,并区分不同的过程通信。

      然而,虽然TCP具有许多功能,但它也必须支付相应的价格。 例如,面向连接的特性在创建和切断连接时会产生成本;拥挤控制的特性限制传输上限等。

      UDP的缺点

      • 无法保证消息的完整和正确到达,UDP是一个不可靠的传输协议;
      • 缺乏交通堵塞控制导致网络系统由于竞争资源的能力瘫痪

      UDP的优点

      • 效率更快;无需连接和堵塞控制
      • 连接更多的客户端;没有连接状态,不需要为每个客户端创建缓存,等等。
      • 单元头目小,支出小;TCP头目固定;UDP头目只有8个;小头目意味着数据的比例更大
      • 对于现场场景,不需要确保每个数据包都完全交付,允许一定的损失率,此时TCP的可靠性就成为负担;更高效的流畅UDP是更合适的选择
      • 可以广播;UDP没有连接,因此它可以同时发送消息到多个进程

      UDP适用场景

      UDP适用于需要高度自定义应用层的传输模型,允许损失发生,需要高效率的场景,以及需要广播;例如

      • 视屏直播
      • DNS
      • RIP路由选择协议

      其他补充

      分块传输

      我们可以发现,当传输层传输数据时,它不会直接发送整个数据包,而是将数据分割成多个开发报告;他这样做的原因是什么?

      一些读者可能认为数据链层限制数据长度为1460。为什么数据链层如此有限?原因在于网络不稳定。如果报文太长,那么,在总体上,很有可能传染突然中断,此时,所有数据将重新传输,效率就降低了。将数据分成多个数据报告,所以当数据报告丢失时,你只需要重新发送数据消息。

      越小越好,难道不是更好吗?报告中的数据字段的长度太低,它将使第一部分的份额太大,这样, 第一部分将成为网络传输的最大负担.例如1000字节,每个报告的第一个部分是40字节,如果分成10份报告,所以你只是把400字节的第一个部分转移到100字节,如果把它分解成100字节,所以你需要传输40,00字节的第一个部分,效率大大降低。

      路由转换

      先看下图:

      • 通常,主机A包可以通过1-3-6-7路径传输
      • 如果3号公路坏了,可以从1-4-6-7号车站传送
      • 如果4也故障,则只能从 2-5-6-7发送
      • 如果5折断,则线被中断

      可以看出来,使用路由传输的优点是:提高网络容忍性,其根本原因仍然是网络不稳定。即使有一些路由器坏了,网络依旧畅通。但是如果路由器6失败,它将直接阻止A和B主机通信。因此,避免存在这样一个核心路由器。

      使用一条路线的优点还有:分离。 如果一条线路太拥挤,可以从另一条线路转移,以提高效率。

      粘包与拆包

      TCP不能理解这些数据流的含义,他只是知道如何从应用程序层获取数据流,将数据切入报告,并发送到目标对象。 如果应用程序层发送两个数据包,这很有可能发生:

      • 应用程序层需要向目标进程发送两个数据,一个音频和一个文本
      • TCP只知道一个接收的流线,并把流线分成四个发送的分段
      • 在第二份报告中,这两个文件的数据被混合在一起,这就是数据包
      • 在目标进程应用程序层接收数据后,需要将数据分割为正确的两个文件,即调试

      插入和卸载是需要由应用程序层解决的问题;您可以在每个文件的末端添加一些特殊字符,例如替换行;或您可以控制每个消息只包含一个数据文件,没有足够的0补充,等等。

      恶意攻击

      TCP的连接指向特性可能被恶意的人用来攻击服务器。

      前面我们知道,当我们向一个主机发送asynpack请求创建连接时,服务器将为我们创建缓冲器,等等,然后向我们返回 syn+ack消息;如果我们伪造IP和端口,向服务器请求一个数量主机,这导致服务器创建大量创建一半的TCP连接,使它无法正常地响应用户的要求,导致服务器瘫痪。

      解决办法可能包括限制由IP创建的连接数目,允许一半的tcp连接在较短的时间内关闭,延迟接收的缓存内存的分配等等。

      长连接

      我们向服务器提出的每一个请求都需要创建一个TCP连接,服务器在返回数据后关闭连接;如果短时间内有大量请求,如此频繁地创建TCP连接,关闭TCP连接是浪费资源。所以我们可以使TCP连接不关闭,在 这 一 期间, 提出 要求,提高效率。

      记住长时间的连接维护时间、创建条件等,以避免使用恶意的方式创建大量长连接,消耗大部分服务器资源。

      最后

      我以前以为这些东西在我的研究中没什么用处。 它们似乎是用来考试的。 事实上,当它们不应用时,很难更深入地了解这些知识,比如现在我看上面的总结,其中许多只是表面的,并不知道背后的真正意义是什么。

      但当我更广泛地深入地学习,我将更深入地了解这些知识。 有的时候,我曾想,"哦,这就是它如何运作,这就是它如何运作,这就是它如何运作。

      现在,学习后你可能不会感到什么,但当你使用或学习有关应用时,你就会有意识,并在一瞬间获得很多。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/28681.html

          热门文章

          文章分类