当前位置: 首页 > news >正文

聊一聊 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 进行流量监听,将程序运行起来,发现一切都是那么太平,截图如下:

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

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 启动监控,然后将程序运行起来,截图如下:

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

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

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

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

三:总结

人是活在错综复杂的关系网里,同样程序也是,要想解决更多的.NET程序故障,对 tcp/ip 体系知识的了解也同样必不可少。

文章转载自:一线码农

原文链接:https://www.cnblogs.com/huangxincheng/p/17815469.html

相关文章:

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

一&#xff1a;背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后&#xff0c;真的越来越体会到计算机基础课的重要&#xff0c;比如 计算机网络 课&#xff0c;如果没有对 tcpip协议 的深刻理解&#xff0c;解决这些问题真的很难&#xff0c;因为你只能在高层做…...

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二&#xff08;推荐&#xff09; 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术&#xff0c;用于理解卷积神经网络&#xff08;CNN&#xff09;中的卷积核是如何对…...

python+playwright 学习-85 启动参数 proxy 设置代理几种方式

前言 在使用playwright执行代码的时候,如需设置代理,可以在启动的时候加proxy 参数设置代理。 本篇总结下可以加proxy代理的几种方式。 launch 启动全局代理 launch 启动的时候设置全局代理,以下是示例 from playwright.sync_api import Playwright, sync_playwrightwit…...

Clion 搭建Qt projects

Qt projects Qt is a cross-platform C framework for creating GUI applications. Qt uses its own build system, qmake, and also supports building with CMake starting from the version Qt4. Qt是一款创建桌面程序的跨平台的C框架。qmake是Qt自有的构建系统&#xff0…...

合肥工业大学数据库实验报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…...

设计模式-装饰器模式(Decorator)

设计模式-装饰器模式&#xff08;Decorator&#xff09; 一、装饰器模式概述1.1 什么是装饰器模式1.2 简单实现装饰器模式1.3 使用装饰器模式的注意事项 二、装饰器模式的用途三、装饰器模式的实现方式3.1 通过接口和抽象类实现3.2 通过Java反射实现3.3 通过使用第三方库实现 一…...

Java 数据结构篇-实现双链表的核心API

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 双链表的说明 1.1 双链表 - 创建 1.2 双链表 - 根据索引查找节点 1.3 双链表 - 根据索引插入节点 1.4 双链表 - 头插节点 1.5 双链表 - 尾插 1.6 双链表 - 根据索引来…...

电脑如何截屏?一起来揭晓答案!

在数字时代&#xff0c;截屏已经成为我们日常生活和工作中的必备技能。无论是为了捕捉有趣的网络瞬间&#xff0c;保存重要信息&#xff0c;还是为了协作和教育&#xff0c;电脑截屏都是一个强大而方便的工具。本文将介绍三种电脑如何截屏的方法&#xff0c;以满足各种需求&…...

【实战-08】flink 消费kafka自定义序列化

目的 让从kafka消费出来的数据&#xff0c;直接就转换成我们的对象 mvn pom <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information …...

深入浅出 Django 异步编程

随着 Web 应用对性能的要求日益提高&#xff0c;异步编程成为了提升响应速度、提高系统吞吐量的重要手段。Django 作为一个成熟的 Python Web 框架&#xff0c;自 3.1 版本开始支持了异步编程。在本文中&#xff0c;我们将探讨 Django 异步编程的关键概念&#xff0c;并提供实际…...

力扣 138. 随机链表的复制

文章目录 1.解题思路2.代码实现 1.解题思路 在原先链表的每一个元素后面插入一个与前一个相同val的值的结点,然后由于是在原链表进行的操作&#xff0c;因此找每个random就变得很方便直接访问即可&#xff0c;此题目的精髓是cur1->randomp->random->next,看懂这串代码…...

STM32外部中断大问题

问题&#xff1a;一直进入中断&#xff0c;没有触发信号&#xff0c;也一直进入。 描述&#xff1a;开PA0为外部中断&#xff0c;刚刚很好&#xff0c;一个触发信号一个中断&#xff0c;中断函数没有丢&#xff0c;也没有抢跑&#xff0c;开PA1为外部中断也是&#xff0c;都很好…...

FPGA配置采集AR0135工业相机,提供2套工程源码和技术支持

目录 1、前言免责声明 2、AR0135工业相机简介3、我这里已有的 FPGA 图像处理解决方案4、设计思路框架AR0135配置和采集图像缓存视频输出 5、vivado工程1–>Kintex7开发板工程6、vivado工程1–>Zynq7100开发板工程7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前…...

KubeSphere v3.4.0 部署K8S Docker + Prometheus + grafana

KubeSphere v3.4.0 部署K8S 1、整体思路2、修改linux主机名3、 离线安装3.1 问题列表3.2 执行命令成功列表 1、整体思路 将KubeSphere v3.4.0 安装包传输到其中一台机器修改Linux主机名&#xff08;选取3台&#xff0c;修改为master01、master02、master03&#xff09;安装官方…...

Codeforces Round 908 (Div. 2)题解

目录 A. Secret Sport 题目分析: B. Two Out of Three 题目分析: C. Anonymous Informant 题目分析: A. Secret Sport 题目分析: A,B一共打n场比赛&#xff0c;输入一个字符串由A和‘B’组成代表A赢或者B赢&#xff08;无平局&#xff09;&#xff0c;因为题目说明这个人…...

Redis笔记 Redis主从同步

文章目录 Redis主从搭建主从架构主从数据同步原理全量同步增量同步repl_backlog原理 主从同步优化小结 Redis主从 搭建主从架构 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从数据…...

数据结构-Prim算法构造无向图的最小生成树

引子&#xff1a; 无向图如果是一个网&#xff0c;那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的&#xff0c;我们称 这颗权值和最小的树为&#xff1a;“最小生成树”&#xff08;MST&#xff09;。 其中&#xff0c;一棵树的代价就是树中所有权值之和。 而…...

MFC串口通信(SerialPort)

目录 1、SerialPort类的介绍和使用&#xff1a; &#xff08;1&#xff09;、SerialPort类的功能介绍 &#xff08;2&#xff09;、SerialPort类提供接口函数的介绍 1&#xff09;、InitPort函数 2&#xff09;、控制串口监视线程函数 3&#xff09;、获取事件&#xff0c…...

Vim基本使用操作

前言&#xff1a;作者也是初学Linux&#xff0c;可能总结的还不是很到位 Linux修炼功法&#xff1a;初阶功法 ♈️今日夜电波&#xff1a;美人鱼—林俊杰 0:21━━━━━━️&#x1f49f;──────── 4:14 …...

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--作业

0. 题目 1. T1 逆深度参数化时的特征匀速模型的重投影误差 参考常鑫助教的答案&#xff1a;思路是将i时刻的观测投到world系&#xff0c;再用j时刻pose和外参投到j时刻camera坐标系下&#xff0c;归一化得到预测的二维坐标&#xff08;这里忽略了camera的内参&#xff0c;逆深…...

Python的__init_subclass__协作定制

Python的__init_subclass__协作定制&#xff1a;解锁类继承的灵活控制 在Python的面向对象编程中&#xff0c;类的继承机制是构建复杂系统的核心。而__init_subclass__这一特殊方法&#xff0c;自Python 3.6引入以来&#xff0c;为开发者提供了更精细的类定制能力。它允许父类…...

别再只用滑动平均了!三种滤波算法(卡尔曼/滑动/异常剔除)在Arduino数据采集中的性能对比与选型指南

Arduino数据采集实战&#xff1a;三种滤波算法性能对比与选型指南 当你在Arduino项目中采集传感器数据时&#xff0c;是否经常遇到数值跳变的问题&#xff1f;光照强度突然飙升、土壤湿度读数异常波动、PM2.5数值毫无规律地跳动——这些噪声不仅影响数据质量&#xff0c;更可能…...

从零开始打造OS性能监控:基于os-tutorial的计时器与中断完全指南

从零开始打造OS性能监控&#xff1a;基于os-tutorial的计时器与中断完全指南 【免费下载链接】os-tutorial How to create an OS from scratch 项目地址: https://gitcode.com/gh_mirrors/os/os-tutorial os-tutorial是一个从零开始构建操作系统的开源项目&#xff0c;它…...

PIDtoolbox终极指南:免费开源的黑盒日志分析神器,快速提升控制系统性能

PIDtoolbox终极指南&#xff1a;免费开源的黑盒日志分析神器&#xff0c;快速提升控制系统性能 【免费下载链接】PIDtoolbox PIDtoolbox is a set of graphical tools for analyzing blackbox log data 项目地址: https://gitcode.com/gh_mirrors/pi/PIDtoolbox 你是否曾…...

3步解决Windows和Office激活难题:KMS_VL_ALL_AIO智能脚本完全指南

3步解决Windows和Office激活难题&#xff1a;KMS_VL_ALL_AIO智能脚本完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;每次重装系统后都要面对…...

Source Han Serif CN:企业级字体架构设计与技术决策框架

Source Han Serif CN&#xff1a;企业级字体架构设计与技术决策框架 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 中文字体技术栈的现代化挑战与架构演进 在数字化转型浪潮中&#…...

ZYNQ SPI接口选型指南:MIO、EMIO还是AXI Quad SPI?看完这篇不再纠结

ZYNQ SPI接口选型指南&#xff1a;MIO、EMIO还是AXI Quad SPI&#xff1f;看完这篇不再纠结 在ZYNQ系列SoC的开发过程中&#xff0c;SPI接口的选择往往让工程师陷入纠结。面对PS端的MIO、EMIO和PL端的AXI Quad SPI三种实现方案&#xff0c;如何根据项目需求做出最优决策&#x…...

终极指南:如何快速将网站转换为可编辑的Figma设计

终极指南&#xff1a;如何快速将网站转换为可编辑的Figma设计 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 在当今快节奏的数字化时代&#xff0c;设计师和开发者之间的协作效率…...

告别‘砖头’:手把手教你用UDS诊断协议安全刷写车载ECU(含BootLoader启动时序详解)

深度解析UDS协议下的ECU安全刷写&#xff1a;从BootLoader时序到实战避坑指南 在汽车电子领域&#xff0c;ECU软件更新如同给车辆做"心脏手术"&#xff0c;稍有不慎就会导致控制器变"砖"。不同于消费电子产品的OTA升级&#xff0c;车载ECU刷写需要严格遵循…...

【第5篇】LobeChat 本地一键部署:你的私人AI工作站,插件生态比肩Notion

系列导航:前四篇搞定了桌面客户端和网页部署,这一篇说 LobeChat——它的插件系统是本文最大的亮点,适合想用 AI 做知识管理、文档处理、网页搜索的人。 一、LobeChat 是什么? 如果说 Cherry Studio 是 AI 客户端里的"快捷酒店"(干净、够用、不折腾),NextChat…...