当前位置: 首页 > 网络应用技术

如何处理TCP混乱序列的鳍套装?

时间:2023-03-08 17:39:13 网络应用技术

  在收到读者的问题之后,他在采访中被惊呆了,因为面试官问他这样的网络问题:

  但是,这个网络问题可能是读者表达式的问题,因为如果Fin消息首先到达客户端,而不是数据包,此时FIN消息实际上是一条混乱的消息。从FIN_WAIT_2状态到time_wait的时间内传达。

  因此,我们需要注意看到“如何以Fin_Wait_2的形式处理混乱的序列到FIN消息,以及TCP连接何时输入time_wait状态?”。

  让我在这里谈论结论:

  当fin_wait_2状态时,如果收到混乱的鳍数据包,它将被添加到“混乱队列”中,并且不会输入time_wait状态。

  当您再次收到网络延迟的数据包时,您将确定是否存在混乱女王中的数据,然后检查是否存在混乱订单队列中的可用数据。如果存在,则保留在订单中的数据包是完成徽标。如果发现找到鳍徽标,它将输入time_wait状态。

  我还画了一张图片,每个人都可以理解图片。

  接下来,我将带您查看源代码。当我听到源代码的来源时,可能会为一些学生提供咨询。

  实际上,我们今天需要分析这个问题。只要我知道是否其他,我也会使用中文来表达代码的逻辑,因此也可以简单地阅读文本。

  这次,我们专注于如何处理FIN_WAIT_2状态。

  在Linux内核中,当处理IP层时,通过调用TCP_V4_RCV函数将消息传输到TCP层,因此此功能是通过TCP层接收消息的入口。

  在Fin_Wait_2状态的客户端中,在接收到服务器的消息后,最终调用了TCP_V4_DO_RCV函数。

  接下来,TCP_V4_DO_RCV方法将调用TCP_RCV_STATE_PROCESS。在这里,我们将根据TCP状态进行相应的处理。在这里,我们只注意Fin_Wait_2的状态。

  在上面的代码中,您可以看到,如果关闭关闭,则另一方的数据包将回复第一个消息。

  在我们的主题中,关闭仅关闭写作方向,因此我们将继续调用tcp_data_queue函数(因为如果tcp_fin_wait2代码块,则没有中断语句,因此它将转到该函数)。

  在上面的tcp_data_queue函数中,如果收到的数据包的序列号是我们期望的,也就是说,有序:

  当收到的数据包的序列号不是我们期望的时,也就是说,如果序列是混乱的,则调用tcp_data_queue_ofo函数,并将消息添加到混沌队列中。该队列的数据结构是红树和黑色树。

  在我们的主题中,客户收到的鳍数据包实际上是一条混乱的消息。因此,目前,TCP_FIN函数将不被要求进行状态转换。

  然后,当客户端收到网络延迟的数据包时,此时由于预期数据包的序列号,然后将其添加到混乱队列中,因为上次收到的混乱鳍消息,表明混乱序列是混乱的顺序。队列是数据,因此调用了TCP_OFO_QUEUE函数。

  让我们看一下tcp_ofo_queue函数。

  在上面的TCP_OFO_QUEQUEUE功能中,在找到可以在混乱女王中当前消息的序列编号中维护的消息后,您将阅读该数据包是否具有FIN徽标。如果是这样,您将调用TCP_FIN()函数。

  最后,让我们看一下TCP_FIN函数的处理。

  许多学生以前问我,我如何看待TCP源代码?

  实际上,我查看TCP源代码。它不是直接打开Linux源代码,因为Linux源代码太大。如果我不知道TCP输入功能在哪里,那就是大海。

  因此,当您查看TCP源代码时,我们可以在线搜索他人的源代码分析。互联网上的许多老年人都帮助我们分析了TCP源代码,并且每个功能的呼叫链接都编写了它们。

  例如,如果您想知道TCP三 - 时间握手/四波的源代码的实现,则可以使用关键字进行搜索,例如“ TCP三握手/四个摇摆源分析”。一开始,我就学会了TCP源代码以这种方式。

  互联网上的文章通常仅放置关键部分,并且没有发布许多代码详细信息。如果您想以完整的方式查看函数的所有代码,则取决于内核代码。

  在这里,我推荐一个在线网站,该网站阅读Linux内核代码:

  elixir.bootlin.com/linux/lated/source

  我认为这很容易使用。左侧的代码可用,右上角也可以搜索功能。

  因此,我看到TCP源代码的经验是首先在Internet上找到TCP源代码,然后在了解整个函数的调用链接后,如果您想了解函数的特定实现,则可以查看我说的一个。在Linux内核代码的在线网站上进行搜索以查看完整函数的实现。如果您遇到中途无法理解的代码,也可以将此代码复制到Baidu或Google搜索,您通常可以找到他人分析的过程。

  学习查看TCP源代码实际上有助于我们分析一些异常问题。例如,今天的互联网主题实际上无法在互联网上搜索答案,我们很难模拟实验。

  因此,如果您想知道答案,则只能看到源代码。