计算机网络-DNS以及FastGitHub
前言
你是否观察到过这种现象,在访问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的更多相关文章
- 计算机网络-DNS和HTTPDNS了解
DNS 和 HTTPDNS DNS 域名解析的过程 传统 DNS 存在的问题 1.域名缓存问题 2.域名转发问题 3.出口 NAT 问题 4.DNS 域名更新问题 5.解析延迟问题 6.运营商劫持 H ...
- 计算机网络——DNS协议的学习与实现
1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...
- [计算机网络] DNS劫持和DNS污染
DNS劫持,指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为.范例就是收到各种推送广告等网站. DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户 ...
- [计算机网络] DNS何时使用TCP协议,何时使用UDP协议
DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...
- 计算机网络--DNS
1.域名系统DNS(domain name system)是因特网使用的命名系统,用来把便于人们时用的机器名字转换为IP地址.因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方 ...
- 从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备)
前言 在互联网高速发展的今天,我们通过手机,电脑等通讯设备可以很轻松达到未出茅庐便知天下事的境界.每天我们都要访问数不胜数的网站,通过打开浏览器,输入网址两步搞定.当然更为常规的做法是打开浏览器,设置 ...
- 基于YARP实现的FastGithub
前言 最近开源的两个项目,先是FastGithub,旨在解决访问github抽风的问题.然后开发HttpMouse项目,基于yarp的http公网反向代理到内网的服务端与客户端库,在开发HttpMou ...
- 用github搭建网站
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 让Github畅通无阻,FastGithub1.0.0发布
前言 我近半年来被github的抽风虐得没脾气了,虽然我有代理的方式来上网,但代理速度并不理想,而且有时代理服务一起跟着抽风.这时候,我会搜索"github访问不了"相关题材,其中 ...
- 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解
楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...
随机推荐
- .NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记
15 | 选项框架:服务组件集成配置的最佳实践 这一节讲解如何使用选项框架来处理服务和配置的关系 选项框架的特性: 1.支持单例模式读取配置 2.支持快照 3.支持配置变更通知 4.支持运行时动态修改 ...
- 程序员减少BUG的两个小妙招!
原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处. 点评: 我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量. 如果程序员写的 ...
- MAYSQL 2 DAY
目录 MySQL day02 1.关于查询结果集的去重? 2.连接查询 2.2.连接查询的分类? 2.4.怎么避免笛卡尔积现象?当然是加条件进行过滤. 2.5.内连接之等值连接:最大特点是:条件是等量 ...
- windows远程连接centos及闪退异常解决记录
平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的问题解决. 一. 安装Centos ...
- adb查看和修改settings值
初始化命令 对应USB连接的安卓设备 # 用help查看版本,位置和参数 >adb --help Android Debug Bridge version 1.0.41 Version 30.0 ...
- Maven多模块聚合工程实战
介绍 本文以SpringCloud微服务多模块聚合案例讲解,全程讲解中间涉及的核心知识点并配图加深理解. 更多maven知识点,建议去看<Maven实战>. 创建父工程 新建maven工程 ...
- 利用LiveReload插件实现vscode和谷歌浏览器实时刷新
说明 最近在研究CSS希望可以提升一个层次.在写DEMO练习的时候老是需要去谷歌浏览器手动刷新页面才能看到更改后的效果次数多了 我也受不了,这不我又请来了个帮手: LiveReload,名如其人,这家 ...
- win32 - DIB 与 DDB
设备相关位图(DDB): DDB不包含颜色值,因为每个设备可以具有自己的一组颜色,所以为一个设备创建的DDB可能无法在其他设备上很好地显示. DDB通常被称为兼容位图,并且它通常比DIB具有更好的GD ...
- MASM32 - PlaySound的实现
MASM安装教程: https://blog.csdn.net/u010486308/article/details/105495848 代码参考: .model flat, stdcall opti ...
- Vue3学习(十八) - TreeSelect 树选择
写在前面 本以为可以在家学习一天,结果家里来了客人拜年,就没学习上,有点小遗憾吧. 昨天完成从分类管理的前后端代码复制出文档管理的前后端代码,遗留问题是只能选择一级父分类.值得说的是,昨晚的遗留的问题 ...