前言

你是否观察到过这种现象,在访问Github时,有的时候能正常访问,有的时候再次刷新就访问不了,那么能不能有什么办法能一直访问。答案是有,就是在DNS层面能保证一直稳定获取可用并且快速的IP,这就是FastGithub的原理,笔者结合Github上的开源Code来讲下DNS的一些细节。

FastGithub - DnsServer

当然,也许FastGithub的原理有很多种,这只是其中一种。

首先,构造一个DnsServer,

var dnsServer = new DnsServer(githubRequestResolver, "114.114.114.114");
dnsServer.Listen();

DnsServer的构造函数,第一个参数request resolver可以自定义自己的dns resolve方式,第二个参数定义了上游的DnsServer, 114.114.114.114是国内公共的Dns服务器地址,也可以选择其他的公共Dns服务器。

拓展阅读,有没有好奇过Dns是如何查询的,用的什么协议:

总结来说:

UDP协议,53号端口:用于大部分的普通DNS查询。

TCP协议,53号端口:用于数据量较大的DNS查询或需要可靠性传输的情况。

FastGithub - Dns

我们看下GithubRequestResolver:

    public class GithubRequestResolver : IRequestResolver
{
public Task<IResponse> Resolve(IRequest request, CancellationToken cancellationToken = default)
{
var response = Response.FromRequest(request);
var question = request.Questions.FirstOrDefault(); if (question != null && question.Type == RecordType.A)
{
var domain = question.Name.ToString();
var fastAddress = domain.Contains("github", StringComparison.OrdinalIgnoreCase)
? this.results.FindFastAddress(domain)
: default; if (fastAddress != null)
{
var record = new IPAddressResourceRecord(question.Name, fastAddress);
response.AnswerRecords.Add(record);
this.logger.LogInformation(record.ToString());
}
} return Task.FromResult<IResponse>(response);
}
}

这段代码自定义了Dns的Resolve方式,当目前domain为github时,从库中找寻最开的IP地址,然后构造Dns Response返回,这就是这种FastGithub的核心。这个只是简单的示例代码,寻找最快的IP可以是先准备一批IP,然后查询哪个最快返回,也可以是先Lookup查找结果。

注意代码中需要判断Dns RecordType.A,只有A记录才需要重写Record,那么Dns都有什么类型,为什么只有A类型需要特殊处理?

Dns的类型

  • A: 记录的domain对应的IP,这也是为什么code里只需要A记录才需要重写IP的原因

  • AAAA: 记录的domain对应的IPv6, A记录对应的是IPv4

  • CNAME: domain的别名

  • TXT: domain的说明,举个例子

> nslookup -query=TXT baidu.com
> baidu.com text =
"_globalsign-domain-verification=qjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnE"
baidu.com text =
"google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
baidu.com text = "9279nznttl321bxp1j464rd9vpps246v"
baidu.com text = "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com mx ptr -all"
  • NS: NS记录用于告诉互联网查找域名信息要查询哪些服务器

  • MX: 返回domain的邮件服务器, 举个例子

> nslookup -query=MX microsoft.com
> microsoft.com MX preference = 10, mail exchanger = microsoft-com.mail.protection.outlook.com

上述例子说明microsoft.com对应的邮件服务器为outlook.com, 而这种记录有一个很典型的应用,可以判断一个microsoft 365 tenant是否属于gcc high。大家知道微软的microsoft 365有多种类型,常用的有commercial, usgov以及21v, 而对应的mail server分别是outlook.com和outlook.us, 那么通过MX记录就可以很快的判断出来是属于哪种类型。对应的c#代码如下:

var lookup = new LookupClient();
var result = await lookup.QueryAsync(domain, QueryType.MX).ConfigureAwait(false);
foreach (var item in result.Answers)
{
var mxRecord = item as MxRecord;
if (mxRecord != null)
{
var exchange = mxRecord.Exchange;
if (exchange.ToString().EndsWith("com"))
{
return AzureEnvironment.Worldwide;
}
else if (exchange.ToString().EndsWith("us"))
{
return AzureEnvironment.USGovGCCHigh;
}
else if (exchange.ToString().EndsWith("cn"))
{
return AzureEnvironment.China;
}
}
}

欢迎扫码关注我的公众号

计算机网络-DNS以及FastGitHub的更多相关文章

  1. 计算机网络-DNS和HTTPDNS了解

    DNS 和 HTTPDNS DNS 域名解析的过程 传统 DNS 存在的问题 1.域名缓存问题 2.域名转发问题 3.出口 NAT 问题 4.DNS 域名更新问题 5.解析延迟问题 6.运营商劫持 H ...

  2. 计算机网络——DNS协议的学习与实现

    1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...

  3. [计算机网络] DNS劫持和DNS污染

    DNS劫持,指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为.范例就是收到各种推送广告等网站. DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户 ...

  4. [计算机网络] DNS何时使用TCP协议,何时使用UDP协议

    DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...

  5. 计算机网络--DNS

    1.域名系统DNS(domain name system)是因特网使用的命名系统,用来把便于人们时用的机器名字转换为IP地址.因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方 ...

  6. 从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备)

    前言 在互联网高速发展的今天,我们通过手机,电脑等通讯设备可以很轻松达到未出茅庐便知天下事的境界.每天我们都要访问数不胜数的网站,通过打开浏览器,输入网址两步搞定.当然更为常规的做法是打开浏览器,设置 ...

  7. 基于YARP实现的FastGithub

    前言 最近开源的两个项目,先是FastGithub,旨在解决访问github抽风的问题.然后开发HttpMouse项目,基于yarp的http公网反向代理到内网的服务端与客户端库,在开发HttpMou ...

  8. 用github搭建网站

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  9. 让Github畅通无阻,FastGithub1.0.0发布

    前言 我近半年来被github的抽风虐得没脾气了,虽然我有代理的方式来上网,但代理速度并不理想,而且有时代理服务一起跟着抽风.这时候,我会搜索"github访问不了"相关题材,其中 ...

  10. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

随机推荐

  1. 如何在 Mac 上配置 VirtualBox Host-Only 网络适配器

    默认Mac 上安装 VirtualBox 后,没有自动配置Host-Only 网络适配器,需要我们手工添加.方法如下: 打开VirtualBox软件, 依次点击 "管理 -> 工具 - ...

  2. 2.4 资源管理器Restorator--《恶意代码分析实战》

    Lab01-04.exe 实验内容: 1.将文件上传到http://www.VirusTotal.com 进行分析并查看报告.文件匹配到了已有的反病毒软件特征吗? 2.是否有这个文件被加壳或混淆的任何 ...

  3. 2023牛客暑期多校训练营6 ABCEG

    比赛链接 A 题解 方法一 知识点:并查集,树形dp,背包dp. 因为需要路径中的最大值,因此考虑按边权从小到大加入图中,保证通过这条边产生贡献的点对已经全部出现. 在加边的同时进行树上背包,答案存在 ...

  4. CF383C Propagating tree

    题目链接 题目 见链接. 题解 知识点:DFS序,树状数组. 我们需要对子树的不同奇偶层加减,用dfn序可以解决子树问题,但是并不能直接分奇偶. 一种比较麻烦的思路是,将dfn序分成两个序列,一个是偶 ...

  5. NC19987 [HAOI2012]ROAD

    题目链接 题目 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同. ...

  6. 吴X凡绯闻女友小怡同学被骂到清空社交平台?各大平台连敏感词库都没有的吗?

    敏感词都没有的平台 最近某加拿大籍贯的 rapper 被曝私生活不检点,且极有可能涉及诱X未成年少女,成为一个 raper. 当然至于是否属实,其实一个人是否是海王,微信.QQ 聊天记录里面记得清清楚 ...

  7. 2022年3月核心库MySQL优化总结

    2021年9月底到新公司,公司核心数据库,以前无专业DBA维护,问题多,隐患大,到2022年2月持续后,优化至今: 优化大项: 1,从1主3从,扩容到1主5从,将部分读放都另外新加从库   2,最大表 ...

  8. OpenCV开发笔记(五十八):红胖子8分钟带你深入了解图像的矩(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. 正则函数及面向对象开发初识---day19

    1.正则函数 # ### 正则函数 import re #search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1+2 3*4" obj = ...

  10. day04---虚拟主机网络配置的三种模式介绍

    课程大纲 补充:安装系统过程中 分区的知识 1.虚拟软件使用方法 2.操作系统网络配置 3.虚拟主机网络设置 4.操作系统远程连接 5.远程连接排错思路 补充:安装系统过程中 分区的知识 1.企业常见 ...