聊一聊 tcp/ip 在.NET故障分析的重要性

这篇具有很好参考价值的文章主要介绍了聊一聊 tcp/ip 在.NET故障分析的重要性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:背景

1. 讲故事

这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到 tcp 层面的握手和psh通讯。

这篇我们通过两个小例子来理解一下 tcp 协议在故障分析中的作用。

二:tcp协议的两个小例子

1. 程序突然大量超时

这个故事起源于一位朋友遇到的问题:

起初程序跑的一直都是好好的,但会有偶发性突然无法访问,奇怪的是在故障时手工访问域名时又是正常的,后面又莫名奇怪的好了,请问这是怎么回事?

这种问题朋友虽然抓了dump,但在dump中寻找问题很难,因为大概率是在 http 通讯中出了问题,需要用类似 wireshark 去做流量监控,最后发现的原因是代理服务器偶发的抽风,导致 C# 的 HttpClient 无法访问。

为了方便演示,这里用一段简单的测试代码。

  1. WebAPI 代码

创建一个 WebApi 骨架代码,然后部署 Windows 虚拟机上。



        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

并且在 appsetttings.json 中配置对外端口为 80。


{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://0.0.0.0:80"
      }
    }
  }
}

  1. Client 的 HttpClient

这里面我用 hosts 做了虚拟机 192.168.25.133 myproxy.com 的映射,然后通过域名的方式访问。


    internal class Program
    {
        public static HttpClient client = new HttpClient(new HttpClientHandler()
        {
            Proxy = new WebProxy("http://myproxy.com")
        });

        static async Task Main(string[] args)
        {
            for (int i = 0; i < 100000; i++)
            {
                try
                {
                    // 发送 GET 请求
                    HttpResponseMessage response = await client.GetAsync("http://youtube.com/WeatherForecast");

                    // 检查响应状态码
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容
                    string responseBody = await response.Content.ReadAsStringAsync();

                    // 输出响应内容
                    Console.WriteLine(responseBody);

                    await Task.Delay(1000);
                }
                catch (HttpRequestException e)
                {
                    Console.WriteLine($"{DateTime.Now} HTTP 请求异常:{e.Message} {e.GetType().Name}");
                }
            }

        }
    }

打开 wireshark 进行流量监听,将程序运行起来,发现一切都是那么太平,截图如下:

聊一聊 tcp/ip 在.NET故障分析的重要性

由于某些原因,代理服务器出了问题,这里用 关闭的方式来模拟,再次观察 wireshark 可以发现,没有收到服务器对154号包的响应,client 这边根据 RTO=1s 进行重试。

聊一聊 tcp/ip 在.NET故障分析的重要性

2. DNS解析到的IP无法访问

有些朋友程序出现了卡死,原因在于设置了很长的 Timeout,这种 Timeout 挺有意思,域名能够通过 DNS 解析到 IP,但 IP 无法被访问到,导致 client 这边在不断的重试,直到 timeout 的时限到时抛出异常。

接下来还是用 HttpClient 做一个小例子,直接访问 youtube.com ,参考如下代码:


static async Task Main(string[] args)
        {
            HttpClient client = new HttpClient();

            for (int i = 0; i < 100000; i++)
            {
                try
                {
                    // 发送 GET 请求
                    HttpResponseMessage response = await client.GetAsync("http://youtube.com");

                    // 检查响应状态码
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容
                    string responseBody = await response.Content.ReadAsStringAsync();

                    // 输出响应内容
                    Console.WriteLine(responseBody);

                    await Task.Delay(1000);
                }
                catch (HttpRequestException e)
                {
                    Console.WriteLine($"{DateTime.Now} HTTP 请求异常:{e.Message} {e.GetType().Name}");
                }
            }
        }

打开 wireshark 启动监控,然后将程序运行起来,截图如下:

聊一聊 tcp/ip 在.NET故障分析的重要性

从卦中可以看到 client 发起了一个 DNS 查询,DNS服务器查询到 youtube.com 所对应的 IP 是 104.244.46.85,接下来应该就是 client 对这个 ip 发起 握手请求,截图如下:

聊一聊 tcp/ip 在.NET故障分析的重要性

从图中信息看,真的很尬尴,有如下两点信息:

  • client 发起了 SYN 请求,结果没人鸟它,没人鸟主要是因为路径上的防火墙把这个 SYN ACK 给没收了。

  • client 端按照 1s,2s,4s,8s 的RTO计时器超时进行重试,直到 HttpClient 等不及抛 TimeoutException 异常。

三:总结

人是活在错综复杂的关系网里,同样程序也是,要想解决更多的.NET程序故障,对 tcp/ip 体系知识的了解也同样必不可少。文章来源地址https://www.toymoban.com/news/detail-745945.html

聊一聊 tcp/ip 在.NET故障分析的重要性

到了这里,关于聊一聊 tcp/ip 在.NET故障分析的重要性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代理IP对企业网络安全的重要性

    随着科技的快速发展,网络已经成为企业运营的重要工具,然而与发展相伴的网络安全问题也日趋复杂,为了降低数据和隐私泄露的风险,企业必须给予足够的重视,采取全面的网络安全应对措施来降低风险,维护企业形象。 什么是代理服务器? 代理服务器(Proxy Server)是

    2024年02月07日
    浏览(29)
  • 数据分析 | 特征重要性分析 | 树模型、SHAP值法

            在分析特征重要性的时候,相关性分析和主成分分析往往是比较简单的方法,相关性分析是通过计算特征与目标变量之间的相关系数来评估特征的重要性。它可以告诉我们特征和目标变量之间的线性关系程度,但对于非线性关系就无能为力了;主成分分析是一种降

    2024年02月10日
    浏览(20)
  • 物理与IP环境的重要性:打造稳定可靠的亚马逊测评环境

    在亚马逊平台上进行测评补单、撸卡和撸货等活动,首要问题是确保环境的安全性和稳定性。一个稳定的环境是进行测评和撸卡的基础,如果无法解决安全性问题,那么从事这些项目就不值得。在环境技术研发领域已经有六七年的经验,在早期测试了许多方案,如手机系统、

    2024年02月13日
    浏览(25)
  • Python中进行特征重要性分析的9个常用方法

    特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。 如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但

    2024年02月07日
    浏览(24)
  • Python数据分析 — 数据分析概念、重要性、流程和常用工具

    前言: Hello大家好,我是小哥谈。 Python数据分析是利用Python编程语言进行数据处理、转换、清洗、可视化和建模的过程。Python在数据科学领域非常流行,有许多强大的库和工具可供使用,例如NumPy、Pandas、Matplotlib和Scikit-learn等。这些库提供了丰富的功能和方法,使得处理和分

    2024年02月09日
    浏览(27)
  • 三维模型3DTile格式轻量化在数据存储的重要性分析

    三维模型3DTile格式轻量化在数据存储中占有重要地位。随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长。然而,这类数据通常具有大尺度、高精度等特点,因此数据量巨大,给数据存储带来了巨大的挑战。 以下是进行3DTile格式轻

    2024年02月07日
    浏览(34)
  • 数据分析在程序员职业中的重要性及实践应用

    在当今信息化社会的快速发展中,数据分析已经成为一项重要的职业技能。不论是从事哪个行业,都需要具备一定的数据分析能力。对于程序员而言,掌握数据分析技能不仅能够提升自身在职场中的竞争力,更能够在职业生涯中获得更多的发展机会。本文将围绕数据分析在程

    2024年02月07日
    浏览(27)
  • 【Python | 机器学习】Python中进行特征重要性分析的9个常用方法(含源代码)

    特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。 特征重要性分析在数据科学和机器学习中扮演着重要的角色,具有以下重要性: 理解数据:特征重要性分析

    2024年02月03日
    浏览(34)
  • 【概率方法】重要性采样

    假设我们有一个关于随机变量 X X X 的函数 f ( X ) f(X) f ( X ) ,满足如下分布 p ( X ) p(X) p ( X ) 0.9 0.1 f ( X ) f(X) f ( X ) 0.1 0.9 如果我们要对 f ( X ) f(X) f ( X ) 的期望 E p [ f ( X ) ] mathbb{E}_p[f(X)] E p ​ [ f ( X ) ] 进行估计,并且我们有一些从 p p p 中采样的样本,那么朴素的想法是,直接

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包