0 前言

github网站访问慢或访问不了,相信很多人都会遇到过,解决方式大概有两种:一种是使用代理访问;另一种是使用ipaddress.com等域名解析网站查询域名的ip,然后在host文件增加ip与域名的映射。

1 代理访问

代理访问是在一台能上github的服务器开通代理服务,然后你所在机器在访问github时,流量由代理服务器转发,稳定的代理服务,一般都是收费用。

2 域名解析网站

例如使用ipaddress.com查询域名的ip,但你的网络可能还是无法正常的访问这个ip,或者无法连接此ip的443端口。所以如果你在网上搜索"github慢",得到别人贴出的"最新github ip"数据,粘贴到你的host文件,你可能还是无法访问github。

3 FastGithub

github定制版的dns服务,解析访问github最快的ip

3.1 加速原理

  • 使用github公开的ip范围,扫描所有可用的ip;

  • 间隔指定时间(5min)检测与记录扫描到的ip的访问耗时;

  • 拦截dns,访问github时,返回最快的ip;

3.2 获取github的ip

访问https://api.github.com/meta,我们就可以拿到github公开其使用的ip,为了能够在所有环境获取到这个meta数据,我们需要把这个meta转存到gitee或本机,因为这份数据更新不频繁。FastGithub依赖这份数据,目前从gitee获取到缓存副本。

3.3 443端口扫描

github使用了https,所以对应的tcp端口是443,尝试连接到github各ip下的443端口,如果在指定时间内(默认1s)能连接成功,证明这个ip是有用的,反之就要丢弃这个ip了。在.net下,我们可以使用Socket来进行tcp连接:

[Service(ServiceLifetime.Singleton)]
sealed class PortScanMiddleware : IMiddleware<GithubContext>
{private const int PORT = 443;private readonly IOptionsMonitor<GithubOptions> options;private readonly ILogger<PortScanMiddleware> logger;public PortScanMiddleware(IOptionsMonitor<GithubOptions> options,ILogger<PortScanMiddleware> logger){this.options = options;this.logger = logger;}public async Task InvokeAsync(GithubContext context, Func<Task> next){try{using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);using var cancellationTokenSource = new CancellationTokenSource(this.options.CurrentValue.PortScanTimeout);await socket.ConnectAsync(context.Address, PORT, cancellationTokenSource.Token);await next();}catch (Exception){this.logger.LogTrace($"{context.Domain} {context.Address}的{PORT}端口未开放");}}
}

3.4 Https检测

443端口开放,不意味这个ip就能正常的使用github,有可能在建立ssl时会失败,或者在https请求时,服务返回的内容并不是github官网的内容,所以我们需要进一步的侦测是否有http响应,响应内容是不是github的内容。据我观察,正常的github响应Server头,都有GitHub.com值。

[Service(ServiceLifetime.Singleton)]
sealed class HttpsScanMiddleware : IMiddleware<GithubContext>
{private readonly IOptionsMonitor<GithubOptions> options;private readonly ILogger<HttpsScanMiddleware> logger;public HttpsScanMiddleware(IOptionsMonitor<GithubOptions> options,ILogger<HttpsScanMiddleware> logger){this.options = options;this.logger = logger;}public async Task InvokeAsync(GithubContext context, Func<Task> next){try{var request = new HttpRequestMessage{Method = HttpMethod.Get,RequestUri = new Uri($"https://{context.Address}"),};request.Headers.Host = context.Domain;using var httpClient = new HttpClient(new HttpClientHandler{Proxy = null,UseProxy = false,});var startTime = DateTime.Now;using var cancellationTokenSource = new CancellationTokenSource(this.options.CurrentValue.HttpsScanTimeout);var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationTokenSource.Token);var server = response.EnsureSuccessStatusCode().Headers.Server;if (server.Any(s => string.Equals("GitHub.com", s.Product?.Name, StringComparison.OrdinalIgnoreCase))){context.HttpElapsed = DateTime.Now.Subtract(startTime);await next();}}catch (TaskCanceledException){this.logger.LogTrace($"{context.Domain} {context.Address}连接超时");}catch (Exception ex){this.logger.LogTrace($"{context.Domain} {context.Address} {ex.Message}");}}
}

3.5 Dns服务

我们可以建设一个本机或局域网的dns服务,访问github时,就返回检测到的最快的一条ip,访问其它域名时,转发给8.8.8.8这样稳定的上游dns服务来解析。这样既不影响其它域名的解析速度与稳定性,同时又能正常的使用github所有服务。

4 源代码和软件

4.1 源代码

github:https://github.com/xljiulang/fastgithub

4.2 软件下载

gitee:https://gitee.com/jiulang/fast-github/releases/

开源FastGithub相关推荐

  1. 统计 Github 2021 贡献过的开源项目

    统计一下 2021 贡献过的开源项目 Intro 新的一年的开始了,有很多总结和回顾还没有做,今天就盘点一下贡献过的开源项目吧~ 起初想着手动地通过 Github Dashboard 来统计 但是感觉 ...

  2. FastGithub让Github畅通无阻

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

  3. GitHub访问慢-FastGithub下载及使用

    很多需要用到的脚本及软件会先发布在GitHub上,所以经常需要访问GitHub,但是每次都会卡在跳转到GitHub的步骤,就是还没开始就可以结束了. 之前尝试过手动修改host文件来解决网站的访问问题 ...

  4. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  5. 开源自动化机器学习框架

    20211101 在 Airbnb 使用机器学习预测房源的价格 https://blog.csdn.net/weixin_33735077/article/details/87976278?spm=1 ...

  6. 北京大学开源分词工具pkuseg 初试与使用感受

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/meiqi0538/article/de ...

  7. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...

    先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...

  8. 开源软硬一体OpenCV AI Kit(OAK)

    开源软硬一体OpenCV AI Kit(OAK) OpenCV 涵盖图像处理和计算机视觉方面的很多通用算法,是非常有力的研究工具之一,且稳居开发者最喜爱的 AI 工具/框架榜首. 1.会不会被USA禁 ...

  9. GitHub上YOLOv5开源代码的训练数据定义

    GitHub上YOLOv5开源代码的训练数据定义 代码地址:https://github.com/ultralytics/YOLOv5 训练数据定义地址:https://github.com/ultr ...

最新文章

  1. leetcode位运算的题
  2. NOIP 2018 普及组 解题报告
  3. 线程wait和notify方法的demo详解
  4. Unity3d Network 局域网多人对战之游戏大厅
  5. 800元以内创建的双路CPU主机
  6. macOS 安装postman 中文语言包
  7. DDOS攻击器常见的三种方式
  8. 淘宝数据可视化大屏案例(Hadoop实验)
  9. 3.卡券、直充订单详情(post 表单提交)
  10. 计算机调整亮度是哪个好,电脑屏幕亮度怎么调 电脑屏幕亮度怎么调对眼睛最好...
  11. 点云 3D 目标检测 - PointPillars(CVPR 2019)
  12. 用4K屏幕的笔记本跑虚拟机vmware如何放大字体?
  13. Java获取本月第一天是本周第几天
  14. 微信小程序操作教程(个人用户注册)
  15. 计算机考研专业课课件,【考研计算机专业课】武汉大学计算机网络PPT课件 习题课.ppt...
  16. 结合Vue实现344分割手机号码
  17. tomcat管理界面登录无法进入
  18. 对标华为Mate 9 保时捷版,金立M2017凭什么?
  19. MySql学习(七)排序和分页(order by limit),及存在的坑
  20. 如何成为一名产品经理?

热门文章

  1. 开始→运行→命令 总结大全
  2. python oa系统_用python把C#操作OA的例子重写了一下
  3. c++直角坐标系与极坐标系的转换_一篇阅读量高达2百6十多万的关于坐标系和投影的相关知识探讨...
  4. Java发送邮件(带附件)
  5. Integer源码解析
  6. (译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分
  7. jQuery入门[2]-选择器[转]
  8. CRM学习笔记(一)
  9. Concurrent connection limit
  10. dvd刻录软件_如何在Windows 7中刻录照片和视频DVD(无需额外的软件)