Normal view

There are new articles available, click to refresh the page.
Before yesterdayMain stream

【CDT报告汇】开放技术基金会:七年间中国新增173万个互联网审核员(外二篇)

16 March 2025 at 14:24

编者按:《CDT报告汇》栏目收录和中国言论自由及其他人权问题相关的报告资讯。这些报告的来源多种多样,包括机构调查、学术研究、媒体报道和网民汇集等等。也欢迎读者向我们推荐值得关注的报告。

CDT 档案卡
标题:【CDT报告汇】开放技术基金会:七年间中国新增173万个互联网审核员(外二篇)
作者:中国数字时代
发表日期:2025.3.15
主题归类:中国数字极权
CDS收藏:公民馆
版权说明:该作品版权归原作者所有。中国数字时代仅对原作进行存档,以对抗中国的网络审查。详细版权说明

中国数字时代本周推荐媒体:

The Wire China:一本英语数字新闻杂志,致力于了解和解释当代最重要的新闻之一——中国的经济崛起及其对全球商业、金融、贸易、劳工和环境的影响。

一、开放技术基金会:七年间中国新增173万个互联网审核员

3月16日,开放技术基金会(Open Technology Fund, OTF)发布了一份报告,揭示了中国审查产业的庞大规模与复杂性。报告显示,从2015年至2022年,中国各行业企业发布了超过173万个与审查相关的招聘广告,其中社交媒体和视频平台的兴起显著推动了对审查劳动的需求。报告指出:“审查工作已从最初的兼职职责迅速转变为全职专业岗位。”

img

报告封面

报告认为,这一现象源于2014年中央网信办成立后,政府对互联网监管的日益严格,企业被要求对平台内容负起更大责任。这种压力促使企业在信息控制方面的投入大幅增加。报告中,作者列举了多起因审查失误导致企业陷入危机的案例。例如,2016年,无界新闻网因刊登要求习近平下台的文章,导致10余名员工被捕,公司被迫停业。

研究将中国审查市场的参与者分为四类。首先,传统内容企业,如新闻和社交媒体公司,仍是审查劳动的主要需求方。其次是非传统审查需求者,例如电商和商场营销团队,其审查任务通常属于兼职职责。第三类是规模庞大的外包人力资源公司。研究发现,超过3000家人力资源公司参与其中,占审查雇主总数的4.2%。最后是国有媒体机构,主要提供审查培训服务等业务。

据悉,该研究采用了多源数据分析方法,包括对2015年至2022年间主要招聘网站上56万个审查相关职位广告的分析。研究团队开发了一种基于AI的分类器,并通过多轮人工核查,识别出涉及审查职责的职位。

报告认为,中国的审查并非单纯由政府主导,而是私营部门推动的一种市场化实践。企业为规避政治风险而建立的审查能力,增强了国家对信息的控制力度。此外,研究指出,尽管技术进步显著,人工审查仍是主导方式,短期内难以被AI完全取代。

然而,报告也指出,随着生成式AI的兴起,审查产业可能面临新挑战。一方面,AI有望提升审查效率;另一方面,用户生成内容及AI模型本身的监管难度也将随之增加。

最后,该基金会呼吁学术界和实践者关注中国审查体系带来的社会经济影响。报告强调:“深入理解中国审查运作的复杂性,有助于推动互联网自由的实现。”

二、CHRD:中国当局五年间对数千人实施任意拘留,或涉反人类罪

3月16日,中国人权捍卫者网络(CHRD)发布了《2024年度人权捍卫者状况报告》。报告显示,2019年至2024年间,中国当局对数千人实施了任意拘留,其中1545名良心犯因和平倡导人权被定罪并监禁。CHRD警告,这种广泛且系统的拘留模式可能构成反人类罪,并称这与联合国任意拘留问题工作小组自2017年以来的关切相呼应。报告还指出,在习近平领导下,中国对人权捍卫者的打压规模和强度显著扩大,威胁到国内外的人权法律体系。

img

报告封面

报告调查发现,2019年至2024年间,中国大陆有1422名良心犯被判刑,香港则有123人因类似原因被定罪。作者表示,这些人因和平行使言论自由、宗教自由或倡导法治等权利而被剥夺自由,平均刑期达6年,国家安全相关罪名的平均刑期则增至7年。报告特别提到,三名良心犯——塔什波拉特·提伊普(Tashpolat Tiyip)、萨塔尔·萨乌特(Sattar Sawut)和杨恒均(Yang Hengjun)被判处死刑,另外热依拉·达吾提(Rahile Dawut)和阿布都拉扎克·萨伊姆(Abdurazaq Sayim)被判终身监禁。此外,还有48人被判10年以上徒刑。

CHRD分析显示,当局频繁使用三类罪名对付良心犯:“寻衅滋事”、“组织和利用邪教组织破坏法律实施”以及“危害国家安全”罪。其中,“寻衅滋事”被用于对付121人,该罪名因其模糊性和广泛性被国内活动人士及联合国人权高专办批评为“口袋罪”。报告还发现,超过700名60岁以上的老年良心犯中,三分之二是女性,显示女性活动家及藏族、维吾尔族等边缘化群体在被拘者中占比极高。

在香港,2020年《国家安全法》实施后,平均刑期为5.15年,“煽动颠覆国家政权罪”等罪名的定罪人数超过大陆,凸显北京将法律体系作为政治压迫工具的趋势。

此外,报告指出,即便服刑结束后,大陆的良心犯仍面临任意剥夺自由的情况,显示这种做法具有系统性。

报告还列举了多起案例,凸显任意拘留的严酷性。例如,维吾尔族电影制作者伊克拉姆·努尔梅赫梅特(Ikram Nurmehmet)因在土耳其马尔马拉大学学习电影,2024年被控“组织、领导或参与恐怖组织”罪名,遭受酷刑并被判6.5年监禁。藏族僧侣兼博客作者仁青次仁(Rinchen Tsultrim)2019年因在微信上与印度姐姐通话被判4.5年。基督教牧师王怡(Wang Yi)因领导早雨圣约教会,2019年被控“煽动颠覆国家政权”和“非法经营”罪判刑9年。人权律师李昱函(Li Yuhan)为捍卫人权者提供法律援助,经历6年审前拘押后于2023年被判6.5年。

报告中的案例研究还指出,“寻衅滋事”罪被滥用以压制网络言论。互联网评论员季晓龙(Ji Xiaolong)因在X平台向3.1万粉丝发布关于上海新冠封锁的信息,2023年被上海法院判处4.5年。电影制作者陈品霖(Chen Pinlin)因拍摄2022年白纸抗议并制作纪录片,2025年被判3.5年。报告引用检察机关指控二人“散布虚假信息”,尽管他们的帖子基于事实报道和视频证据。

CHRD认为,中国任意拘留不仅是政府行为,而是广泛系统性压迫的一部分,旨在扼杀人权倡导。报告指出:“北京扼杀行使和促进人权的努力,对国内外均有影响。人权捍卫者是挑战国家滥权政策、推动改革和分享关键信息的少数群体。当他们因工作被监禁并沉默,全球对国内发展的信息和改革盟友随之丧失。”报告警告,中国官员在国内的免责进一步助长其海外滥权行为。

报告援引联合国人权高专办2022年关于新疆穆斯林群体的评估,以及联合国任意拘留工作小组的意见,认为中国政策可能构成反人类罪。CHRD强调,这种趋势若不遏制,将对国际人权法造成严重后果。

最后,CHRD表示支持2020年50名联合国人权专家的倡议,敦促人权理事会召开特别会议并设立专门机制关注中国政府的人权侵犯。他们建议国际社会开展独立调查,确认中国任意拘留是否构成反人类罪,并在高级别会议上公开呼吁释放具体个人。

三、维权网:二月中国新增47名良心犯

公民维权志愿者联网组织维权网于2月28日发布了《二月中国大陆在押政治犯、良心犯月度报告》。根据该报告,维权网上期名录中的28人已刑满释放或取保获释,并获悉1名被羁押者被判刑,8人狱中有新动态。同时,本期新增被刑事拘留2人以及47人被判刑,共计49人。被捕的主要原因包括从事宗教活动、维权上访以及参与民主人权活动等。

1、本月获悉上期名录中刑满释放及取保获释的28人名单:

蔡伟华、蔡予华、陈治坤、董怡然、郭永凤、
李凤芝、刘琼华、卢巧丽、罗巧萍、吕春钰、
彭敬军、彭乐宽、苏玉财、孙茜、王淑波、
夏东梅、夏泽红、杨春林、杨兰英、臧中美、
张晓华、张有红、赵清香、张宏、张礼江、
綦瑞英、胡艳、曹稳梅

2、羁押人员1人被判刑:

4年:危文元

3、被刑事拘留2人:

吴永强、尹登珍

4、本期新增被判刑的47人名单:

19年:吕桂玲
12年:唐高峰
9年:尹福英
8年:林洪杰、王威
6年6个月:陈志全
6年:周丹
5年2个月:林景楠
5年1个月:杨岳桥
5年:谢庆财
4年11个月:梁晃维
4年6个月:高颖
4年5个月:胡志伟、朱凯迪
4年3个月:袁嘉蔚
4年2个月:郭家麒
4年:吴芳名、李文华、穆华、杨淑珍、张晓华、田志斌、张友光、张思锋
3年6个月:尹秋阳、张爱泉、张启平、刘玉芬、苏艳霞
3年:赵颜华、姜常仙、吕淑珍、姜瑞华、赵会军、方瑞琴、朱德艳、于萍、于立秋、代露
2年8个月:朱桂清
2年6个月:陈久文、肇淑芝
2年3个月:杨励军
2年:朱颖、闫志秋
1年3个月:洪英
1年2个月:杨将威

报告称,截至发稿,中国共有1700名在押政治犯、良心犯。其中,死缓11人,无期徒刑18人,有期徒刑1435人,刑期不明24人,羁押未判236人,另有大量人员“被精神病”和强迫失踪未被完全记录在内。

每位政治犯、良心犯的被捕原因详情可访问维权网:《维权网:中国大陆在押政治犯、良心犯月度报告(2025年2月28日)第113期(共1700人)》

此外,我们还需关注非营利组织中国劳工通讯对中国劳工权利的追踪报道。一月份,中国发生安全事故0起,工人集体行动99起,工人求助1起。

Google vs ChatGPT 搜索体验对比实测

By: DUN
2 November 2024 at 15:22

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

随着 的新实时搜索功能, ChatGPT 正在将自己定位为传统搜索引擎如 的竞争对手。ChatGPT 以其对话式的响应而闻名,能够提供实时的上下文信息而不带广告。

我抓住机会看看 ChatGPT Search 与 Google 长期以来的搜索专业性相比如何。我进行了几次比较,涵盖了速度、准确性、视觉效果和整体用户体验等类别。以下是它们的表现。

问题“东京的主要旅游景点有哪些?”

Google 的搜索引擎非常快速,结果在毫秒内就能交付。搜索引擎拥有多年的优化经验,并且有专门为高速索引和检索而构建的基础设施,可以立即获得来自多个来源的广泛相关结果。

ChatGPT 的搜索同样快速,并为每个地点生成了更清晰、更用户友好的图像和信息。显然,AI 通过从相关来源提取信息来生成响应,然后以对话的方式分享这些信息。结果感觉更加友好,几乎就像 AI 很高兴我去旅行一样。

使用体验ChatGPT Search
在以对话且简洁的方式提供有价值的快速响应方面领先。

问题: “解释气候变化和全球变暖之间的区别。”

Google
 的响应来自 Gemini,概述了气候变化和全球变暖,并将其包裹在一个简短的段落中。从那里,我可以向下滚动并搜索一些来自 NASA、USGS.gov 甚至 Quora 的链接。显然,算法优先考虑流行和权威的来源,但它也是以广告驱动的,这意味着顶部结果有时包括我看到的来自联合利华的赞助内容。此外,对于复杂的主题,我自己需要浏览多个链接才能拼凑出完整的答案。

ChatGPT 提供了直接的答案,从网络中提取经过的信息,然后添加了一个可点击的「来源」图标。这个功能减少了我在 Google 搜索中从多个收集信息的时间。在这个搜索和其他搜索中,ChatGPT 的总结对于一般查询甚至更详细的主题都是准确的,其设计允许更干净、更加集中的体验。(不过,请记住,广告可能会在未来出现。)

使用体验ChatGPT Search
在便捷和准确的直接答案方面赢得了这一轮。

问题: 苹果目前的股价是多少?最近有什么更新?

Google 实际上没有给我一个立即的答案。相反,我得到了一个指向 Yahoo Finance 的链接,我可以点击并希望自己找到答案。

ChatGPT
在毫秒内,答案就在我眼前。我还得到了关于苹果的新闻和更新,当然,还有来源。ChatGPT Search 真是令人耳目一新。我得到了问题的答案,而不需要四处寻找细节。通过将答案直接呈现在我面前,我节省了时间,而不需要再点击几次。显然,对于实时的股票 或天气更新,ChatGPT 提供了可比的准确性,甚至在深度上超过了 Google 庞大的视觉库。

使用体验ChatGPT Search
继续以其策划的实时直接答案给我留下深刻印象,显示出未来更新的潜力。

问题: 给我展示媒体对心理健康影响的最新研究。

Google 提供了如此多不同的答案,我甚至不知道该从哪里开始。从 Gemini 的响应到侧边栏,再到下面的链接结果,整个体验极其杂乱——这是我在使用 ChatGPT Search 时从未注意到的。此外,Google 的广告模式意味着用户数据通常被用来提供个性化广告。虽然 Google 有广泛的隐私政策和设置,但其广告驱动的方法可能导致不总是优先考虑用户隐私的定向内容。

ChatGPT 再次,ChatGPT 搜索提供了一个更清晰的界面,没有推广内容。对于这种个人化的搜索,额外的隐私关注方式让我非常感激。作为一个希望在搜索过程中不被广告定向的用户,这种方式对我来说更具吸引力——或者在之后。

使用体验ChatGPT Search
在考虑隐私和负责任的内容使用方面领先。对于敏感搜索,不被广告定向是一个巨大的优势。

问题: 什么是我客厅里最好的电视?

Google 我说的就是我说的,Google。在纠正我输入「What's」而不是「What is」后,Google 给我回应了一些链接,所有这些链接都是赞助的,我需要点击才能找到电视。在得到这个回应后,我感觉我需要再次问它以帮助缩小范围。然而,在赞助链接下,还有来自内容发布者的链接。

ChatGPT 为我缩小了范围,包含了图像,并给出了我想要的答案。AI 确实感觉像是一个朋友,提供有价值的信息。每个电视图像旁边都有一段介绍,提供关于每个电视的信息。与 Google 相比,这种设计感觉更加干净和简洁。此外,对话格式直观,我可以滚动浏览推荐,而不需要像在 Google 搜索中那样需要浏览多个链接。

使用体验ChatGPT Search
提供了一个令人耳目一新的体验,直接回答和具体示例。

问题: 谁在民调中领先?

Google 的结果包括有关选举的新闻故事。我希望通过这个问题获得关于今天总统选举民调中谁领先的直接结果。我不得不挖掘新闻故事才能找到答案。

ChatGPT 给了我我想要的结果,直接提供了事实。选举新闻无处不在,所以我不需要阅读更多的新闻故事。ChatGPT 给了我一个直接的答案。

使用体验ChatGPT Search
提供了没有繁琐的实时答案。

问题: 洋基队在世界大赛中是如何崩溃的?

Google 的第一个结果是从《纽约时报》关于该主题的故事中提取的引用。这是一个快速的响应和直接的答案。然而,它让我感觉我没有得到完整的故事。

ChatGPT 提供了更全面的回应,从更多来源提取信息,但仍然感觉干净简洁。我得到了洋基队彻底失败的完整画面。

使用体验ChatGPT Search
再次提供了我所寻找的实时答案,并增加了确认我获得所有信息的全面性。

ChatGPTGoogle 在不同领域都表现出色,但它们满足的需求略有不同。如果你在寻找全面的搜索结果,拥有大量来源和视觉效果,Google 仍然是强者。

然而,如果你的优先事项是清晰、无广告、对话式的响应以及内置的实时更新,ChatGPT 提供了一种流畅、用户友好的体验,可能很快就会成为日常查询的主流。

ChatGPT Search 提供的无杂乱答案以及支持它们的来源是全面且可靠的。我对 ChatGPT 的答案更有信心,因为它们简洁且没有广告商的支持。结果感觉就像是专为我准备的。在杂乱的网络中,ChatGPT 就像一个乐于助人的朋友,我喜欢这种感觉。

Stirling PDF – 免费开源的 PDF 编辑工具,拥有超过 30 个的全面功能

By: Anonymous
16 October 2024 at 12:50

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

Stirling PDF 是一站式的 PDF 编辑,让用户能对 PDF 文件进行各种编辑操作,包括分割、合并、转换、重新组合、新增影像、旋转、压缩等等,特色是免费、开源GitHub〕,过程中文件只会存在用户的设备上,若在处理时有暂存于服务器的内容在下载后会即时从服务器删除,不会记录保存或追踪任何资料,相较于在线工具来说是更安全、的解决方案。

1 Locally hosted web application that allows you to perform various operations on PDF files – Stirling-Tools/Stirling-PDF

Stirling PDF 提供多元的 PDF 编辑功能,涵盖文件组织、格式转换、安全性、检视与编辑等工具,满足各类文件处理需求,用户无需额外下载、安装软件,只要通过即可进行操作,Stirling PDF 有中文在内等多国语言界面〔在我写这篇文章时中文字串翻译率已达 93%〕,进入、找到对应的功能后就能直接进行编辑。

这项服务目前可以做到的功能包括:

1. 文件组织

2. 格式转换

3. 签名与安全性

4. 检视与编辑

5. 进阶功能

顺带一提,Stirling PDF 还有提供 Windows 版本,可以在没有连上的情况下使用,如果有兴趣的朋友可以在 GitHub 找到下载链接,原则上两者功能差不多,无论在线版或 Windows 程序都不用付费、也无广告干扰。

Stirling PDF

进入 Stirling PDF 网站后先从右上角语言选择「中文」。

Stirling PDF – 免费开源的 PDF 编辑工具,拥有超过 30 个的全面功能

接着从上方「工具」就能看到完整功能,依照类型分为:组织、转换为 PDF、从 PDF 转换、签名与安全性、检视与编辑和进阶工具,也可以直接从首页输入功能名称列出相关工具。

有一个 PDF 万用工具是整合旋转、裁切、分割、移除、新增图片等功能,进入后先点击左下角新增要编辑的 PDF 文件。

加入后 PDF 页面预览就会显示于下方,每一页都可单独旋转、删除或调整页数,将光标到页面中间时还会出现其他编辑选项,例如裁切或是加入图片,其实操作上很直觉,稍微摸索一下就会。

编辑完成别忘记点击右上角「下载」保存新的 PDF 文件。

另一个压缩 PDF 也是很常在在线工具看到的功能,选择文件、设置压缩比或是自动模式〔自动调整质量以使 PDF 达到指定大小〕,就能快速压缩 PDF 以获得更小的文件容量。

点击压缩后就会开始处理,完成后自动跳出下载提示,我以大约 9 MB 的 PDF 文件、手动模式 3 级测试后获取一个约 2.5 MB 的新文件,压缩成效相当好,而且图片并没有失真或模糊等情形。

另一个也很常用到的功能是「分割 PDF」,可以将 PDF 指定页面删除、或只是留下需要的页面,使用方法也很简单就不多加赘述,Stirling PDF 会有预先设置的示例提示,用户照着格式稍作修改后就能完成相关编辑任务。

如果要说 Stirling PDF 有没有比较特殊、少见的功能,有一个「自动涂黑」工具很有用,用户只要输入要涂黑的文字,选择 PDF 后就会自动将识别到的文字涂黑,确保隐私和安全性,同时也省去手动编辑文件的时间,操作上更有效率哦!

下图就是使用自动涂黑工具识别、涂黑的 PDF 文件示例,指定文字就会被涂黑处理。

copyparty – 免费开源强大的文件服务器,支持 WebDAV、FTP、媒体播放等超多功能

By: Anonymous
19 October 2024 at 12:16

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

copyparty 是一款功能非常丰富的多功能文件服务器,主要用来你电脑、服务器、设备里的文件,并通过、WebDAV、FTP 等方式访问,还支持播放音乐、上传文件、权限设置等功能。

几乎可以在任何有 Python 环境的地方运行,还支持 Docker 托管,以及 系统下的单可执行程序,甚至可以在 中运行。虽然运行很容易,但我不敢说它简单易用。

Portable file server with accelerated resumable uploads, dedup, WebDAV, FTP, TFTP, zeroconf, media indexer, thumbnails++ all in one file, no deps – 9001/copyparty

copyparty 给自己的定位是「便携式文件服务器,具有断点续传、重复数据删除、WebDAV、FTP、TFTP、零配置、媒体索引器、缩略图++,全部集成在一个文件中,无依赖。」

所有的功能集中在一个 .py 文件中,718 KB,直接运行就可以了。Windows 系统有编译好的 .exe 单可执行文件,双击也即开机用。其他平台直接 python copyparty-sfx.py 就行了。

就是文档太啰嗦了…看不下去。

直接运行就可以在浏览器访问 http://127.0.0.1 了,默认会使用 80/443 端口,打开就是这样的:

可以上传、、播放、听歌、看图片…非常纯粹的文件分享。有一种 Alist 的感觉,不过它不支持网盘。

只需要在启动的时候添加一个用户,就能设置权限了,包括只读、文件夹限制等等:

这一行的意思是创建了三个用户:u1/u2/u3,为它们挂载文件夹 music,对 u1/u2 两个用户只读,u3 用户可以写。

但注意有参数后,访问端口就变化了(3923)。

copyparty 默认开启了 WebDAV,只需要在你的 WebDAV 客户端里直接连 http://ip:3923 就行了。

甚至,你可以通过 WebDAV 把这个文件夹映射为 Windows 的网络磁盘,不过 Windows 默认需要 https,改一下注册表就好了。

而 FTP 则需要在启动的时候添加 --ftp 21 参数,用户名密码和上面的设置相同,不设置就支持匿名访问。

ChatGPT o1 会主动思考推理的 AI,新模型发布实测总结

By: Anonymous
8 September 2024 at 12:45

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

ChatGPT o1 会主动思考推理的 AI,新模型发布实测总结

今天发布「 ChatGPT o1-preview」,是会尝试主动思考的 语言模型, Plus 订阅用户现在就可使用。

根据 OpenAI 的说法:「我们训练这些模型〔ChatGPT o1-preview〕在回应前花更多时间思考问题,就像人类一样。通过训练,它们学会精炼思考过程、尝试不同策略,并能察觉自己的错误。」「如果您正在解决科学、程序设计、数学和相关领域的复杂问题,这些增强的推理能力可能特别有用。」

我自己在讲 ChatGPT 提升工作效率的相关课程时,常常强调一个设计指令的重点:「如果我们写 AI 指令〔 prompt、提示语〕时,可以让 AI 写出自己在想什么、怎么处理任务,通常生成的内容结果会相对更好。

从用户端的角度来看「ChatGPT o1-preview」,就是在 AI 生成内容前,会先展开一步一步的思考流程,它可能会选择思考的策略与切入点,有时会提出一些批判思考,也会更仔细的分析资料细节来做深入处理。

在这个过程中,ChatGPT o1-preview」生成内容的速度其实比 GPT-4o 要慢上不少,可能需要 30~60 秒的思考时间〔或者更久〕,才会开始一步一步的生成内容。

也因为这样的「思考」过程需要耗费更多运算,所以即使是 ChatGPT Plus 用户,在使用「ChatGPT o1-preview」时也有一些限制:

也就是说,目前「ChatGPT o1-preview」比较像是「GPT-4o」的辅助,在进行一些需要深入分析资料、产出有逻辑结果的任务,或者像是科学、数学、程序代码相关领域时,可以运用。

今天这篇文章,我就从自己日常惯用的几个 AI 辅助需求:翻译、摘要、企划思考、文案,以及有时用代码写个小的角度,以实际案例测试看看,「ChatGPT o1-preview」的效果如何,并和「GPT-4o」同样指令下的结果作比较。

当然,如果能从科学、数学与代码的角度来更好,不过从我个人常用角度出发,也想验证看看 ChatGPT o1-preview 是否能满足我的日常工作需求,也提供大家参考。

下面,先提供大家下面测试案例的快速心得比较表格。

翻译结果更简洁有力,文句白话流畅。

用语更符合台湾惯用词汇。

在「白话流畅度」与「专业用语」间平衡得更好。

翻译结果相对较弱,文句不如 o1-preview 流畅。

能计算分数并回馈对错。

无需修改即可使用。

需要多次反复调整才能达到可用程度。

提供具体、逻辑分明的建议步骤和文章架构。

深入分析资料细节。

缺乏深入的分析和明确的建议。

能整理出详细的步骤和操作要点。

细节完整程度略有不足。

缺乏社交贴文所需的流畅性和吸引力。

更注重性和准确性,避免使用版权材料。

可能在细节上不够精准。

首先来试试看翻译〔英翻中〕,我通常会用下面指令来要求 ChatGPT 翻译文章:「把下面这篇 XXX 主题的文章,翻译成中文,请一段一段翻译,尽量在维持原文语意,主题风格的情况下,让上下文的语句更自然通顺,遇到专有名词时附注英文原文,并在第一遍基本翻译后,用台湾惯用词汇与语气进行最后修饰。

下图「左方」,是「ChatGPT o1-preview」翻译的结果。下图「右方」,是「GPT-4o」翻译的结果。

结论是,「ChatGPT o1-preview」花了 57 秒完成一整篇文章的翻译〔文章是 OpenAIChatGPT o1-preview」官方公告〕,但是翻译的结果比「GPT-4o」优异不少。

例如,大多数时候,ChatGPT o1-preview」翻译的文句更加简洁有力〔相对「GPT-4o」〕,可以在许多段落看到这样的差别。

ChatGPT o1-preview」翻译的结果也更白话,相对流畅,用语更符合我指定的中文用语。

ChatGPT o1-preview」在「白话的流畅度」与「专业用语」之间也相对更能拿捏得当,会让人更容易看懂,但又保持专业用语的明确性。

我让「ChatGPT o1-preview」测试直接写一个九九乘法表小工具。o1 同样会先思考撰写工具的逻辑,然后才开始写出程序代码。

我提供的指令是:「我的小孩正在练习记忆数学的 99 乘法表 ,你可以设计一个协助她练习的小游戏吗?

请一步一步分析,从简单的 2 与 5 的乘法表开始,然后练习 3、4、6、7、8、9 的乘法表,根据每一个乘法表设计一个记忆游戏,游戏一开始可以选择要练习哪一个乘法表,进入后可以随机考验该乘法表的熟练度,最好设计有游戏机制。

下面是 ChatGPT o1-preview 第一次生成的 99 乘法表小游戏,我没有做任何的修改,但是正确性、界面美化、操作流畅度都已经达到可用的程度,还会计算分数与回馈对错。

下面是旧版 GPT-4o 第一次生成的小游戏,基本界面可操作,但有一些明显错误〔如下图〕,可能还需要多几次的反复问答,才能调整正确。

我也很常跟 ChatGPT 一起讨论沟通企划案,下面是新旧版本生成的结果比较。

我提供了许多参考资料,请 AI 帮我做产品的企划报告。

ChatGPT o1-preview」在生成过程中,会主动做一些反向思考,与探索不同的报告呈现方式,并且提供一些具体的、逻辑分明的建议步骤,这些不一定有出现在我的指令中。

下面是 ChatGPT o1-preview 生成的版本,我举出其中一部分,它提出了一个撰写初稿的建议方案,并指出了一些明确的试写步骤、文章架构方向。

下面是 GPT-4o 类似段落的版本,虽然也提出了撰写初稿的建议,但整体的说明就比较一般,少了一些明确的、深入的分析与建议。

我也测试了用两个版本去摘要同一篇文章。

下面是 ChatGPT o1-preview 的版本,可以看到文章细节整理得更深入、完整、有条理。

下面是 GPT-4o 版本摘要的结果,基本架构也相似,但细节的完整程度就有一点落差。

不过,ChatGPT o1-preview 也有他不擅长的内容,目前看起来它撰写流畅文案的效果,反而没有 GPT-4o 好〔现在写文案相对效果最好的可能是 Claude 3.5 Sonnet 〕。

下面我请 AI 根据参考资料写出社交贴文上的文案。

ChatGPT o1-preview 版本,AI 会思考撰写过程,撰写时会进行更多安全性、准确性的思考,例如避免使用版权材料

但是多次尝试后, ChatGPT o1-preview 版本目前的结果,比较像是把参考资料更有结构、更有逻辑的分析整理,不太像是社交贴文。

相较之下, GPT 4o 的版本,可能细节没有那么精准,但文案比较流畅。〔如下图〕

以上就是我的初步测试案例与心得,提供大家参考。

信息茧房:网络时代的迷思

12 June 2024 at 00:00

信息茧房

端午假期,我和侄女聊天,我随口提起了最近网络上爆红的郭有才,我以为她也会有所耳闻。没想到,她却一脸茫然,表示从未听过这个名字。

我有些惊讶,毕竟山东菏泽的郭有才最近在网络上可谓是炙手可热。侄女打开抖音,搜索了他的名字,1000多万的粉丝数量赫然出现在眼前。侄女这才露出了惊讶的表情,感叹道:“居然有这么多人关注他,我却一点都不知道。”

我意识到,我和侄女的年龄差距,导致了我们所处的“信息圈”截然不同。她主要获取信息的方式是通过社交媒体,而我则更倾向于传统网络媒体和书籍。这不禁让我思考,在信息爆炸的时代,我们是否真的了解了世界,还是反而被困在了自己的信息茧房中?尤其是社交媒体变态的算法机制。

值得一说的是,社交媒体的注意力经济下,就更别说视频内容的浅薄化。如今,短视频平台上的内容充斥着各种娱乐八卦和无厘头的搞笑视频,这些内容虽然能够带来一时的快乐,却无法让我们获得真正的知识和思考。

长此以往,我们会逐渐失去阅读、写作和思考的能力,沦为被信息消费的对象,而不是信息的创造者。因此,我们应该减少对浅薄视频内容的依赖,多读书,多思考,多创作,才能真正提升自己的精神境界。

某国际学院最近想和德国合作,并对学生出国工作的意愿进行了一番初步调查。结果却令人意外,学生们出国工作的意愿并不高。这与我最初的预想截然不同,我以为在互联网如此发达的今天,人们对国外的情况应该更加了解,出国工作的意愿也会更高。

然而,事实却并非如此。专家说,这就是信息茧房的作用。我们每天接收到的信息,大多来自我们所关注的社交媒体和网站,这些信息往往都是迎合我们口味,甚至故意制造偏激的内容来刺激注意力。久而久之,我们就生活在一个由自身偏好所构建的信息茧房中,看不到外面的世界,也听不到不同的声音。

一位高校教师老太太,她的儿子从发达国家疫情期间留学回来,最近想去攻读博士。但她就觉得不建议她孩子去国外,疫情期间国外那种各种“惨状”让她很不放心。她甚至觉得,境外的话最多能接受去香港,其他地方都不安全,只有国内才让她放心,才是安全的。

老太太由于长期生活在自己的信息圈中,只接收到了国内媒体关于国外疫情的负面报道,因此对国外的情况产生了偏见和误解,她认为国外到处都是水深火热,不适合生活和学习。

那么,在社交媒体如此发达的今天,我们作为个体,如何才能跳出信息茧房的束缚呢?我认为,以下几点非常重要:

  • 主动探索: 除了关注自己感兴趣的内容,我们也应该主动去探索其他领域的信息,跳出自己的信息圈,到更大的世界中去寻找新的知识和观点。
  • 多方求证: 不要轻易相信单一的信息来源,要多方求证,从不同的角度去了解事情的真相。
  • 开放心态: 虚心接受不同的意见,即使与自己的观点不一致,也要保持开放的心态,进行理性的思考和判断。

信息茧房就像是一个舒适的囚笼,它让我们感到安全和满足,却也让我们失去了接触新事物、开拓眼界的机会。只有跳出信息茧房,才能真正拥抱更广阔的世界,获得更多的智慧和灵感。

在这个信息爆炸的时代,有智慧的人都应该警惕信息茧房的危害,主动跳出自己的舒适圈,去探索更大的世界,去创造更多属于自己的精彩。

绕过校园网分享限制,构建愉快的宿舍网络环境

By: prin
18 October 2020 at 16:45

最近大一新生们开学了,就有几位学弟来问我说,咱们学校的校园网要怎么才能开 WiFi 热点、能不能用路由器。回想一下当初我也折腾了好一段时间,本来想水篇博客的,后来不知道怎么的就咕咕咕了……正好借此机会分享一下。

其实吧,学校有的是办法搞你。除了强制一人一号、恶心的专用拨号客户端防共享以外,还能通过 IPID、TTL、时钟偏移检测,甚至是 DPI 深度包检测的方法来防私接,就看校方做得够不够绝了。当然破解的方法也有,但基本也不会让你好受。如果碰到这样的校园网,推荐你直接躺平,给这种垃圾网络交钱还不如开个无限流量套餐呢。

免责声明:日后你惹出祸来,不把师父说出来就行了.jpg

校园网的限制

先说一下我们学校校园网恶心的地方。接入网线后,你需要:

  1. 使用【软件A】进行第一次拨号:
    • 【软件A】会进行多网卡检测,如果你的系统里有一个以上的网络适配器,则拒绝拨号;
    • 上述网络适配器包括硬件网卡(USB 网卡、无线网卡)和虚拟网卡(各种虚拟机的虚拟网卡、TAP 网卡等);
    • 认证类型为 802.1x 认证。
  2. 使用【软件B】进行第二次拨号:
    • 【软件B】不检测网卡,但会拒绝在虚拟机中运行,如果宿主机开了 Hyper-V 还会误报;
    • 检测猎豹 WiFi、360 WiFi 等共享软件的进程;
    • 认证类型为 L2TP VPN。

而且这两个软件只能在 Windows 上跑,macOS、Linux 用户就干瞪眼吧。

其实说到这里,有些人应该都心里有数这俩软件是啥。不过我这里就不明说了,懂的都懂(x

接下来来看一下网上常见的破解方案,也就是路由器拨号

据说网上有很多人在卖所谓的「校园网路由器」,其实说白了就是刷了 OpenWRT 的路由器 + 破解校园网的插件。如果有现成的插件能用,那自然是最好,刷个固件也不是什么难事。但不幸的是,目前网上并没有针对【软件A】新版本的拨号脚本,而旧版本的已经不再适用于我们学校的网络了。除非另有大神愿意开发新版本的拨号脚本,否则这条路是行不通的。更何况我们这还要二次拨号,更是难上加难。

taobao-campus-routers

而如果想要在电脑上直接分享热点,第一会被检测多网卡,第二可能会被检测进程。

emmmmm……🤔

那么,让我们的网卡不被检测到不就行了?

使用虚拟机绕过网卡检测

这个方法其实是以前我偶然发现的。

当时我在用虚拟机捣鼓 Kali Linux,用了 VirtualBox 的 USB Passthrough 功能把 USB 外接网卡穿透进虚拟机给 Kali 使用。此时,宿主机操作系统里是看不见这个 USB 网卡的,设备管理器、网络适配器里都没有,就像不存在一样。不存在……嗯?

于是我翻箱倒柜找出了几年前凑单买的小米随身 WiFi,在虚拟机里一通操作:

vm-windows-xp-miwifi

嘿,成了!

如何配置,搜索「VirtualBox USB 网卡」即可。

看来虚拟机的 USB 直通确实可以避开校园网认证客户端的多网卡检测,而且客户端也并没有对 VirtualBox 做什么手脚(后来查了一下,据说【软件A】会干扰 VMware 的 NAT 网络共享服务……)。那么,能做的事情可就多了。

使用有线网卡桥接路由器

上面的方案能用是能用,但效率过于低下。

  1. 虚拟机系统没必要用 Windows,就算是 XP 也是性能浪费;
  2. USB 无线网卡孱弱的 WiFi 性能不足以满足我的需求;
  3. 每次开机都要启动虚拟机,操作繁琐复杂。

既然要用得爽,那肯定得把这些问题解决了。

首先,把 USB 无线网卡换成 USB 有线网卡,下联硬路由作为 AP。同时,把 Guest OS 换成轻量级的 Alpine Linux 并实现开机启动。完成后的网络拓扑图类似这样(综合考虑最后还是选择了两层 NAT):

network-topology

首先在虚拟机内安装 Alpine Linux 和对应的网卡驱动(注意不要用 virt 版本的内核,很多驱动都被精简掉了):

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000    link/ether [mac addr] brd ff:ff:ff:ff:ff:ff3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000    link/ether [mac addr] brd ff:ff:ff:ff:ff:ff4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000    link/ether [mac addr] brd ff:ff:ff:ff:ff:ff

添加网桥,把 USB 网卡和虚拟机的虚拟网卡桥接到一起:

brctl addbr br0brctl addif br0 eth0brctl addif br0 eth1brctl show

启动网络:

ip link set dev eth1 upip link set dev br0 upip link show

删除之前分配给虚拟网卡 eth0 的 IP,并启动 DHCP 客户端为 br0 获取 IP 地址:

ip addr flush dev eth0udhcpc -i br0ip addr show

此时应该虚拟机内、有线网卡端都能访问网络了,可以通过 ping 测试一下。

可以用的话就永久保存网络配置:

vi /etc/network/interfaces
auto loiface lo inet loopbackauto br0iface br0 inet dhcp        hostname alpine-vm        bridge-ports eth0 eth1        bridge-stp 0

接下来把 USB 网卡和路由器的 WAN 口用网线连接起来,测试是否工作正常。如果想省一层 NAT,可以连到 LAN 口上并关闭路由器 DHCP 功能,就当个单纯的 AP 使用。不过我为了相对稳定的内网环境,还是选择了前者。

router-interfaces

一切正常的话,就可以愉快地使用 WiFi 啦。

如果想要让 Alpine 虚拟机开机后台运行,可以使用 VBoxHeadlessTray 这个程序。

virtualbox-alpine-booting

当前方案的不足之处

至此,我们的校园网网络共享方案已经算是比较完善了。

幸运的是,我校似乎并没有部署其他什么防私接技术,像这样用了半年多也一直相安无事,省下我不少流量费。

然而,这个方案还是有些不爽的地方。

  1. 作为主机的电脑和其他设备不在一个子网下;
  2. 电脑必须一直开着其他设备才能有网。

在这套方案下,路由器下联的设备对于主机是几乎不可见的(不然也绕不过校园网分享限制了)。你可以在其他设备上访问主机上的网络服务(VirtualBox 的 NAT 网络里宿主机的 IP 一般为 10.0.2.2,子网下的设备可以直接访问,效果和主机上访问 localhost 基本一致),但无法反过来访问子网里的其他设备。

虽然你也可以通过 VirtualBox 的端口映射实现一些变通的解决,比如把路由器的 22、80 端口映射到宿主机上方便访问,但 SMB 这类服务就不行了(Windows 访问 SMB 服务器时强制端口为 445,无法手动指定,要改只能改注册表),所以我完全无法在主机上访问子网下的 NAS 设备。

这也太难受了,继续改进!

既然这些软件都需要跑在一台 Windows 机器上,那我专门弄一台机器来跑校园网相关的东西不就好了吗?

入手双网口工控机软路由

于是我把目光投向了最近几年很火的软路由。

就像计算机有软件和硬件的区别,路由器也有「软」「硬」之分。通常我们在各个电商平台上搜索「路由器」这三个关键词所得到的几乎所有商品都属于硬路由,它是由路由器厂商基于自行开发或是开源的嵌入式设备操作系统,根据特定的硬件设备,设计出来的传统硬件设备。

而与之对应的软路由,是基于软件工具在普通的硬件上来实现传统路由器的功能。我们可以在旧电脑、工控机、开发板、服务器甚至是硬件虚拟机中安装软路由系统,然后通过强大的软件实现各种各样的功能。

——《从听说到上手,人人都能看懂的软路由入门指南》

一番比较后,我在某鱼上入手了一台二手的双网口工控机,安装 Windows 7 系统后,将上面的所有校园网相关的软件都转移到了这台低功耗小主机上。

至于为什么买双网口的机器,虽然 VirtualBox 只能直通 USB 网卡所以还是得外接,不过考虑到以后不用校园网了还可以原地变身软路由,所以不如直接一步到位买个好点的。毕竟现在 CPU 差不多的也就几百块,没必要省那点钱买个电子垃圾。

写在后面

这套方案我用了一年多,基本上没啥问题。24 小时开机、低功耗、子网设备无感知,爽到。

另外,不要怪我写得这么笼统,毕竟每个学校的校园网都不太一样,很难写出一篇普适性的教程。这篇文章充其量算个 PoC,证明一下只要能折腾,还是能捣鼓出舒适的宿舍网络环境的。

如果你是大佬,甚至可以写个软件实现一样的功能,隐藏网卡、软件 NAT 啥的。不过我是菜鸡,也不想在这上面花太多心思,所以就这样吧。又不是不能用.jpg

至于这么折腾值不值得,那就见仁见智了。至少我是愿意的:你不让我开热点我就不开,那我岂不是很没有面子。老子又不是没交钱,凭什么?

smiling-dog

最后,祝各位早日摆脱傻逼校园网。

谈一谈阿里云香港的宕机

By: James Guo
18 December 2022 at 20:48

2022 年 12 月 18 日,阿里云香港服务出现了异常。本站所用的香港服务器也中招,由于本人不正确的报警配置,导致部分域名没有正确切换解析,造成了一小部分用户最长半小时的不可用。然而,阿里云香港机房出现问题的时间远不止一个小时。根据我这里的监控,自北京时间 10:49 开始,我跑在香港阿里云上的 HTTP、HTTPS 服务就完全不可用了,直至 20:46 才恢复,共计宕机时间 10 小时。

事故回顾

本人是在早上起床后就发现阿里云香港服务器不可用。一开始以为是被神秘力量封锁了,但是看到报警邮件后发现,香港服务器在国外其他地区也不可用。

然后我就测了一下,发现主机能 ping,但无法 SSH 上去,HTTP/HTTPS 服务亦不可用。此外,yangxi.tech 网站服务也受到了影响。然后我登录了 AWS 中国区的 Route 53 去查看报警,结果发现 Route 53 上没有任何报警(我的 guozeyu.com 和 yangxi.tech 都在用中国区 Route 53)。查看最近的监控,发现我在 Route 53 上有一处配置错误,导致程序实际上没有在监控香港阿里云……于是修改了监测规则。此时我登录了 AWS 国际区,发现国际区的阿里云香港监控是在正常报警,发现是从 10:49 开始,全球所有监测点均不可用。

由于此时 AWS 中国区的报警已经被我改成正确的了,所以已经根据规则,在 DNS 层面进行自动宕机切换了;而且,我之前配置的 DNS TTL 也仅有 120 秒,所以我的所有网站应该在 11:20 前就已经完全恢复正常了。如果没有错误的报警规则,我的网站总共宕机时间也不会超过 5 分钟。

然后我登录了我自建的 Observium 监控,不出意外的看到了阿里云香港的机器已经宕机了。但我发现在宕机前,服务器的 CPU 是 100%。我就怀疑这是不是我自己服务器上某个程序卡死了,占用了所有资源,导致看起来 HTTP/HTTPS/SSH 服务都不可用了。

Observium 监控

此时已经 11:30 了,我还觉得这个是我自己的问题,毕竟我也没收到阿里云任何邮件、电话提醒。于是我登录了阿里云后台,尝试进行重启。此时我没有选择强制关机。结果,关机指令已经执行了 10 分钟,机器仍未关闭。平时我使用 GCP 时,如果关机指令执行超过两分钟,那么就会自动执行强制关机,所以此时执行了 10 分钟的关机就很离谱。然后我就尝试发工单,但没能进入到工单,被转到了在线客服。我向在线客服描述了问题后,无人回复。然后我又尝试发工单,结果工单也是无人回复。只是得到了机器人回复,说在关机时,Windows 会执行系统更新,有时需要 10-15 分钟。请在等待 20 分钟后联系客服。

大概又过了半个小时,机器终于成功关闭了,但在尝试多次后,机器无法启动。即便我点了启动,机器也会在一段时间后变成 “已停止” 状态。由于此时我还是以为是我自己的问题,不是阿里云的问题,我以为是刚刚强制关机导致系统损坏了,于是尝试给现有云盘打快照,尝试回滚。但离谱的事又发生了,我发现我根本无法打快照!快照的进度一直是 0%。

在 11:55,我终于收到了工单的回复:“您好!阿里云监控发现香港地域某机房设备异常,影响香港地域可用区C的云服务器ECS、云数据库polardb等云产品使用,阿里云工程师已在紧急处理中,非常抱歉给您的使用带来不便,若您有任何问题,请随时联系我们”。此时我才知道,这次的宕机可能不是我自己的问题,我放弃了自己尝试恢复服务。

该回复没有提供解决方案,也没有预计的恢复时间,可以说无非就是告诉了我 “这个是我们阿里云的问题”,对于恢复服务没有实质性帮助。

无力吐槽阿里云

本次事件最值得吐槽的地方是,我从未收到阿里云发来的有关通知。直至现在,我在邮箱、短信、站内信中没有收到任何阿里云关于此次服务宕机的提醒。我相信阿里云是有很多监控的,我坚信阿里云早在我发现我的服务出现问题之前,就已经知道了我的服务,以及其他人的服务器出现了问题了。但我却没有收到任何通知。唯一告知我阿里云存在问题的还是我发工单自己问出来的。

我觉得阿里云有必要向所有受影响的,以及可能受影响的客户发送相关提醒。在连续宕机了 8 小时,且仍未恢复的情况下,阿里云仍不主动通知客户,我实在是难以怀疑阿里云是否是故意不做通知,试图掩盖问题。

那还用阿里云吗?

会的。作为中国第一大,以及全球也能排的上前几的云服务商,我不怀疑阿里云的技术实力。我现在用阿里云主要是为了阿里云香港的 CN2 精品网,用于数据跨境(价格为 3元/GB)。目前在这方面也没有什么可替代的方案。专线也考虑过,太贵了,买不起。

但是,我不会把核心业务放在阿里云上了。放在 AWS 上我更安心一些。本次阿里云香港宕机只影响了我的网站一小会儿,也正是因为我没有把核心业务放在阿里云上。

本站是如何做到高可用的?

很简单,本站在四个地区,使用了四个不同服务商的服务器:

  • 德国 OVH
  • 北京 AWS
  • 香港 阿里云
  • 美国 Google Cloud

而且本站是纯静态网站。本站会在构建后,将构建产物分别同步到四个服务器上,没有主服务器的概念。本站通过 GeoDNS,将访客解析到最近的服务器,以降低延迟。在阿里云香港服务器宕机后,只需要停止响应解析即可。原本亚太地区解析到香港,现在亚洲会解析到北京,澳洲会解析到美国,这部分用户就被分流到可用的服务器上了。

本站还使用了 Route 53 的 Health Check 功能,可以实现接近实时的监控主机运行状态,在发现运行状态异常时,自动停止响应解析。目前,我的网站会在出现异常后一分钟内检测并识别到,并停止响应解析。相关 DNS 记录的时间设置在了 120 秒,因此服务发生不可用时,用户影响的时间不会超过 3 分钟。

零基础建站教程

By: James Guo
21 August 2022 at 23:40

基本概念

这个视频介绍了 “基本概念”,下方文字是这个视频的概要。如果你熟悉域名相关的概念,可以直接跳转到操作步骤

建站基本概念

域名

什么是域名?域名是互联网上的地址,用户通过域名来访问包括邮件、网站、App 在内的互联网资源。比如常见的以 .com 结尾的域名,以及新出现的 .xyz 和 .tech 结尾的域名。域名的价格大多在 40 到 200 元之间,具体的价格取决于域名后缀。

域名需要在注册商购买。那么如何选择域名注册商呢?这里推荐氧熙科技,通过与全球第七大注册商 PDR 合作,提供三百多种域名后缀的优惠注册。其特点是无需实名认证,支持支付宝或微信支付,自动发货,支持退款。

服务器

注册了域名之后,还需要有一个服务器,才可以建立自己的网站。服务器主要分为三种类型,包括虚拟主机、云服务器和独立服务器。这里推荐氧熙科技的虚拟主机,即适合新手,也适合专业人士使用。

其次是服务器位置,氧熙科技销售的虚拟主机可以选香港和美国加州两个位置,香港和美国加州的服务器都不需要备案。这里推荐香港主机,国内的访问速度更快。

软件

这里推荐WordPress建站软件,全球有 65.3% 的网站使用WordPress 作为 CMS,并且可一键安装到虚拟主机。

操作步骤

这个视频介绍了 “操作步骤”,下方文字是这个视频的概要。

域名和主机购买及使用

购买域名和虚拟主机

首先需要购买域名和主机。新购买的虚拟主机可能需要半个小时才可以使用,在可以使用时会收到邮件提醒。

修改域名服务器

主机创建成功后,需要前往域名注册商将域名的服务器修改为虚拟主机的域名服务器。

安装 WordPress

前往管理虚拟主机进入 cPanel 面板,进入 WordPress Manager 去安装 WordPress。安装时需要暂时将协议调整为 http:// 开头的协议。

SSL 证书

修改域名服务器 48 小时内,SSL 证书会自动签发,然后就可以使用 https:// 协议访问网站了。

云服务推荐及选择指南

By: James Guo
9 August 2022 at 09:40

本文推荐一些本人用过或者正在使用的云服务,持续更新。未来还会增加购买建议。

云计算 Compute/VPS/EC2

最便宜: Scaleway Stardust

0.5GB RAM ,每月 €0.36,限速 100Mbps 不限流量(该价格为仅 IPv6 的价格,约¥2.48)购买链接

内存存储CPU 核心数CPU 基线带宽价格
1GB10GB SSD1N/A100Mbps€0.36
  • N/A 代表共享核心

目前只有 Paris 1 和 Amsterdam 1 有。前往上方购买链接(如果跳转到了登录/注册页面,请在登录后再点一次,即可直达 Stardust 购买页面),如果遇到无货,就拉到最底部复制 API,用 API 创建机器一般可以绕过前端的无货购买限制。

性价比: BuyVM

1GB RAM ,每月 CA$3.50 ,1Gbps 不限流量(约¥17.77 )。购买链接。注意,BuyVM 的计费周期是每月 1 日,所以若购买时不是 1 日,那么首月的价格会有所变化(因为到下个月或下下个月的 1 日不是整一个月)。

内存存储CPU 核心数CPU 基线*带宽价格
1GB20GB SSD1N/A1000MbpsCA$3.50
2GB40GB SSD1N/A1000MbpsCA$7.00
4GB80GB SSD1100%1000MbpsCA$15.00
8GB160GB SSD2100%1000MbpsCA$30.00
  • N/A 代表共享核心,100% 代表每个核心均为独立核心

配置更高的主机价格是同比例增加的,可以参考 4GB 版本乘以 N。

付款时使用支付宝即可使用 CA$ 同币值缴费,相对要比美元便宜很多。本网站就在使用 BuyVM,如果你从美国西部访问此页面,那就会使用 BuyVM 的服务器。

BuyVM 还可以购买 Block Storage Slab,每 TB 仅需要 $5.00,最低每月 $1.25 就可以买到 256GB。

国内网络好: AWS Lightsail

0.5GB RAM ,每月$3.50 ,限流量 1TB ,可开日本、法兰克福、美国西部均可直连(约¥22.21 )购买链接

内存存储CPU 核心数CPU 基线流量价格
0.5GB20GB SSD15%1TB$3.50
1GB40GB SSD110%2TB$5.00
2GB60GB SSD120%3TB$10.00
4GB80GB SSD220%4TB$20.00

本网站就在使用 Lightsail,如果你从美国东部或者亚洲 (中国大陆外) 访问此页面,那就会使用 Lightsail 的服务器。Lightsail 可以免费附加静态 IPv4;IPv6 则是随机器附带的,暂不可保留或迁移。此外,Lightsail 的自动快照功能是免费的,可以作为自动备份。

与其他同类产品对比

Vultr/Linode/Digital Ocean 都是与 Lightsail 类似的产品,价格也与 Lightsail 十分接近。他们可能没有 CPU 基线的限制,但这也未必是好事,因为失去了限制更有可能受到邻居(同机器上其他用户)的影响。这里有一些优惠码:

大内存、多 IP: OVH VPS

2GB RAM,每月 $3.5(或 3 欧元),限速 100Mbps 不限流量,法兰克福可直连中国,但美国可能绕欧洲。OVH 两欧就可以买一个额外 IPv4 ,该 IPv4 没有月费,只要机器在 IP 就一直是你的。一个账户可以买 16 个额外 IPv4。美国区购买链接国际美元区购买链接国际欧元区购买链接

美国境内机器只有美国区可以购买,其他位置机器需去国际区购买。

内存存储CPU 核心数CPU 基线*带宽价格
2GB20GB SSD1N/A100Mbps$3.50/€3.00
2GB40GB SSD1N/A250Mbps$6.00/€5.00
4GB80GB SSD1N/A500Mbps$11.50/€10.00
8GB160GB SSD2N/A1000Mbps$23.00/€20.00
  • N/A 代表共享核心

本网站就在使用 OVH,如果你从欧洲访问此页面,那就会使用 OVH 的服务器。

永久免费: Google Cloud Compute Engine

美国 us-central-1us-west-1us-east-1 区域,1GB RAM ,30GB 最基础的盘,仅 IPv4 ,出站流量自费。这个试用期过了也免费!

内存存储CPU 核心数CPU 基线*流量价格
1GB30GB HDD212.5%按量计费永久免费

最灵活: AWS EC2

AWS 国际区AWS 中国区

本网站就在使用 EC2 (中国区),如果你从中国大陆访问此页面,那就会使用 EC2 的服务器。目前 AWS 中国区仅限企业注册。

与 Google Cloud 的 Compute Engine 和 Azure 的 VMs 对比

Google Cloud 的按量付费可能是三者中的最便宜的,此外个人感觉 Google Cloud 的操作页面使用起来相比 Azure 和 AWS 更简单。这几家提供的产品都大同小异,此外他们也都可以预留实例一年到三年,实现最大化折扣

与阿里云、腾讯云对比

最大的区别是计费模式。AWS 无论是国内版还是国际版,均默认使用后付费模式,即类似信用卡,每月支付上一个月结算的账单。而阿里云和腾讯云无论是个人用户还是企业用户,均使用预付费模式。哪怕使用的是按量付费的机器,竟然也需要提前充值;余额耗尽后会直接停机。所以用阿里云或腾讯云的按量计费服务之前,无比要保证有充足的余额,不然将欠费了将直接影响生产环境。

此外,阿里云和腾讯云在 API 使用上没有 AWS 方便。虽然 AWS 国内版在国内没有阿里云那么大的占有率,但由于 AWS 国内版和国际版 API 保持了一致,因此 AWS 的文档资源要远比阿里云、腾讯云丰富的多。

个人认为,AWS 国际版完胜阿里云、腾讯云的海外区域,AWS 国内版核心问题是支持的可用区太少,只支持北京和宁夏两个区域;Azure 国内版支持的区域比 AWS 国内版要多一点;阿里云和腾讯云在国内区域数量上是远多于 AWS 的。不过在网络方面,目前 AWS 国内版也是 BGP 接入,线路完全不比阿里云差。

数据跨境方面(指中国大陆境内与境外之间的跨境),阿里云提供了香港精品网、云企业网,这是 AWS 所没有的。

虚拟主机

这里推荐氧熙科技/TlOxygen 的虚拟主机,香港位置采用 CN2 GIA 线路,美国加州也是国内直连;均无需备案,购买后即用。相比之下,美国加州提供更多的流量和存储,带宽也更大。他们的虚拟主机还支持 SSH 访问、Let’s Encrypt 证书自动签发(不可 root)。香港/加州虚拟主机购买链接

氧熙科技的香港 CN2 GIA 虚拟主机测速

CDN

等待补充

DNS

等待补充

域名注册类

等待补充

从零开始建立自己的域名和企业邮箱

By: James Guo
10 April 2022 at 04:40

本文将带领你注册属于自己的域名,并获得以自己的域名结尾的专属邮箱。全程仅需不到 10 分钟[1]。你只需要一台可以上网的设备,支付方式(微信/PayPal/银行卡)和一个现有邮箱。通过本文提到的域名注册商注册的 .com 域名价格为 CN¥79.20/年,并且续费不涨价。该域名注册商免费提供企业邮箱服务,因此不需要额外付费。

[1]:由于全球 DNS 服务器同步需要时间,可能需要 24-72 小时后域名上的服务才能够使用。若注册 .cn 等中国域名还需要进行实名认证,需要额外的时间。其他国际域名(如 .com)则不需要实名认证。

注册域名

首先,你需要注册一个属于自己的域名。域名的注册门槛很低,基本在几分钟内就可以完成注册,并且包括 .com 在内的众多域名后缀均不需要进行实名登记。通常,大多数域名都是按年进行购买。

本文推荐的是 氧熙域名注册 (原 TlOxygen)。该注册商是本站站长亲自建立,是全球第 7 大的域名注册商 PDR Ltd. 的最高级代理之一,提供更多的支付方式和更低的价格。从这里购买域名可以帮助本站持续发展。并且本站域名注册提供了域名删除与退款服务、免费企业邮箱和域名锁等服务。

首先,前往 氧熙域名注册主页(也可以浏览器地址输入 yangxi.tech 前往),进行域名搜索。比如,如果想要注册 guozeyu.com,只需要在搜索框里输入这个域名并点击搜索。如果你不确定想要注册什么后缀,那么也可以不输入后缀,如 guozeyu。如果你更习惯英语界面,或者需要以美元计费的结算方式,请前往 International Version

在首页搜索想要注册的域名查看搜索结果

可以看到,咱们心仪的域名已经被注册了。但是页面下方可以看到更多的 “其他可注册的匹配域名”。

选择一个域名

我们这里选择 guozeyu.online。注意划线价为域名续费的价格,为了可以方便地给域名续费,建议选择续费价格较低的域名。比如 .com 域名续费只需 CN¥79.20/年(国际版为 US$12.59/年),而 .online 的续费价为 CN¥270.00。我对域名的价格一向非常透明,我承认这绝不是市面上最低的价格。下表列出了一些注册商 .com 域名的续费价格

注册商美元/年人民币/年
氧熙/TlOxygen13.7987.60
阿里云万网 [2]10.9979.00
DNSPod [2]-72.00
NameCheap14.58-
GoDaddy19.99-
Cloudflare Registrar [3]9.15
NameSilo10.95
Google12.00

[2]:阿里云万网/DNSPod 注册 .com 域名需要实名认证,可能需要几天后域名才能够正常使用
[3]:Cloudflare Registrar 上注册的域名不支持修改 DNS 解析商、NS 记录,以及粘附记录(Glue Record)

完整的价格列表:中国大陆(人民币)International Version (USD)

注意,本文后续的内容仅适用于在氧熙注册的域名。在其他注册商注册的域名配置有所不同。此外,并不是所有注册商都免费提供 DNS、企业邮箱和域名转发服务。

然后进行结账。结账时建议选择免费的 “隐私保护” 功能,这样你的注册信息(包括邮箱、手机号、地址)就不会公开:

开启 “隐私保护” 功能,并选择 “创建账户”

然后填写注册信息。请确保注册信息是有效的(可以通过电子邮件联系到你),否则域名注册可能会失败。注册完成后即可选择支付方式了。目前支持的支付方式有微信支付、银行卡、PayPal

使用英文填写注册信息选择支付方式,这里以微信支付为例

付款完毕后,会自动跳转到支付成功页,点击 “继续管理订单” 进入后台管理页面。

支付成功

此时,你就可以看到你新注册的域名了。

点击你刚刚注册的域名

配置 DNS

点击你刚刚注册的域名,然后前往 DNS 管理菜单,点击 “管理DNS” 以激活 DNS:

点击 “管理DNS” 以激活 DNS

如果你看到 “您即将提交的信息不安全” 提示,请选择 “仍然发送”。随后看到如下页面即说明已经激活了:

DNS 管理界面

配置企业邮箱

此时我们已经拥有了域名,但该域名下还没有任何服务。我们首先配置企业邮箱,实现任何发往 @guozeyu.online 的邮件都转发到自己的邮箱里。这样有很多好处,比如你可以在注册微博的时候使用 weibo@guozeyu.online,在注册 GitHub 时使用 github@guozeyu.online,这样可以区分不同服务商发来的邮件;也可知道是谁卖了自己的邮箱信息,给自己发送垃圾邮件。

前往电子邮件菜单,点击 “管理电子邮件” 以激活企业邮箱:

点击 “管理电子邮件” 以激活企业邮箱

如果看到 “待验证域所有权 (Pending Domain Ownership Verification)”,则说明 DNS 尚未完成激活,请在 24-72 小时后尝试。新注册的域名默认使用我们提供的 DNS 服务器,邮件记录已经自动配置好了,所以无需手动添加记录。同时,你也可以点击 “设置 (Settings)”,选择 “修改语言偏好 (Modify Language Preference)” 然后选择 “Chinese (Simplified)” 以切换语言到简体中文。此外,如果你知道自己在做什么,也可以将域名换到其他 DNS 服务商,手动配置 DNS 记录。

待 24-72 小时,完成域名所有权验证后,你将看到如下页面,这时我们选择 “添加只转发帐户”:

选择 “添加只转发帐户”

这里我们用户名输入字母 i,“转发至” 输入自己的邮箱。这里只是拿我的邮箱演示。

填写必要转发信息

添加成功后,发往 i@guozeyu.online 的邮件就会转发到你刚刚配置的 “转发至” 邮箱了。但发往其他用户名的邮件依然会被拒收。此时我们需要配置 Catch-All:

点击 “邮件” 菜单中的 “管理 Catch-All”

然后选择 “转发到以下用户/账户”,并输入刚刚设置的用户名 i,然后点击 “应用” 即可。

配置 Catch-All

配置域名转发

目前,浏览器里的网站是无法访问的,因为我们还没有配置用于 Web 的服务器,也没有建立自己的网站。但我们可以配置域名转发,将访问到域名的的流量跳转到其他 URL。比如,你可以设置跳转到自己的微博、GitHub 等网站。具体操作如下:

前往域名转发菜单,点击 “管理域名转发” 以激活域名转发:

点击 “管理域名转发” 以激活域名转发

此时,你可以配置要转发的域名和要转发到的地址:

这里以跳转到我的 GitHub 页面为例

同时,也可以选择高级设置。我建议关闭 “URL掩蔽 / 重定向 / URL隐藏”。

建议关闭 “URL掩蔽 / 重定向 / URL隐藏”

同样,该配置需要 24-72 小时后才能生效。

总结

本文介绍了如何注册属于自己的域名,建立以自己域名结尾的的企业邮箱,以及配置域名转发。后续的文章将会更新如何建立属于自己的个人网站。可以点击页面顶部的关于按钮订阅本网站,这样就不会错过后续的内容啦~

Azure DNS、NS1、Constellix,三家海外 GeoDNS 服务商对比

By: James Guo
15 November 2018 at 11:45

最近 DNSPod 的解析服务器宕机了一段时间,导致许多 DNSPod 用户的网站无法访问。本文将推荐几个提供 100% SLA 的海外 GeoDNS 服务,可用于替代不稳定的 DNSPod。并介绍一下使用多家 DNS 提供商来提高服务可用性的方法。

本文包括 Azure DNS、NS1、Constellix 的全面对比。

简介

这次推荐的三家 DNS 均是海外的支持 GeoDNS 的服务商,并都支持 Anycast。其中的 Azure DNS 和 NS1 在国内的速度都非常好,是直接走的香港/亚洲线路,平均延迟能够在 50ms 以内,不输国内 DNS 服务商。而这三家的海外速度都是极快的,可以秒杀 DNSPod、CloudXNS、阿里云解析等国内提供商。

关于 GeoDNS,精细度最好的是 Constellix:支持国家、省、市(包括中国的省、市),甚至是 AS 号(可以实现分运营商解析)、IP 段。NS1 支持国家、美国的州,也支持 AS 号、IP 段。至于 Azure DNS,通过使用 Traffic Manager,可以支持国家、部分国家的州、IP 段。由于都支持 IP 段,所以理论上支持任意精度的 GeoDNS 了。

至于价格,NS1 提供了免费额度(每月 500k 请求),对于小流量网站而言是够用的,可一旦超出这个免费额度,那么收费是很高的:**$8/百万个请求**。相比而言,Azure DNS 和 Constellix 的价格都很便宜了,其中 Constellix 有 $5/月 的起价。

使用多家 DNS 服务商

同时使用多家 DNS 服务商是可行的,只要使用服务商的 DNS 记录保持相同即可。这要求所使用的服务商能够配置主域名的 NS 记录(建议但不是必须)。这次介绍的 Azure DNS、NS1、Constellix 三家,以及以前介绍过的 Route 53、Google Cloud DNS、Rage4、阿里云解析均可配置主域名的 NS 记录(其中阿里云解析和 Azure DNS 只能额外添加第三方记录;其他几家可以完全自定义 NS 记录)。而 Cloudflare 以及国内的 DNSPod、CloudXNS、阿里云解析由于不能配置主域名下的 NS 记录,意味着你不能很好的进行 DNS 混用。

要使用多家 DNS,有两种实现方法:主服务商和从服务商方式以及两个主服务商方式。完成配置后,将多家的 NS 服务器配置到权威 NS 记录以及域名注册商下的 NS 列表。

使用两家服务商会增加配置难度,但可以提高 DNS 服务的稳定性。如最近的 DNSPod 宕机以及 2016 年的 Dyn 宕机所导致的众多网站无法访问,均是因为众多网站仅使用了一家 DNS 提供商。如果使用了多家 DNS 提供商,则网站仅会在所使用的所有服务商均发生宕机事故时才会无法访问,而这显然发生概率很小。

主服务商和从服务商

要想这样配置,需要从服务商支持使用 AXFR 从主服务商获取记录,还需要主服务商也支持 AXFR 传输。其中,NS1、Constellix 均可作为主服务商或从服务商,意味着你可以同时使用这两家,并选择任何一家作为主服务商,另一家作为从服务商。

两个主服务商

你也可以使用两个主服务商,并保持所有的记录(包括主域名下的 NS 记录)相同(建议,但不是必须)。建议也将 SOA 的序列号同步。

样例

github.com. 这个域名就同时使用了 Route 53 和 DYN 的服务。这可以使用 dig 工具验证。

$ dig github.com ns +short  ns1.p16.dynect.net.  ns2.p16.dynect.net.  ns3.p16.dynect.net.  ns4.p16.dynect.net.  ns-1283.awsdns-32.org.  ns-421.awsdns-52.com.  ns-1707.awsdns-21.co.uk.  ns-520.awsdns-01.net.

经检验,在两家 DNS 服务商也配置了相同的记录。

$ dig @ns1.p16.dynect.net. github.com a +short  13.229.188.59  13.250.177.223  52.74.223.119  $ dig @ns-1283.awsdns-32.org. github.com a +short  13.229.188.59  13.250.177.223  52.74.223.119  

下面逐个介绍一下这三家 DNS 提供商。

所有 DNS 测评一览(还包括 CloudXNS、Route 53、Cloudflare、Google Cloud DNS、Rage4 以及阿里云解析)

Azure DNS

微软 Azure 产品线下的 DNS 服务。使用 Anycast 技术,并且国内能够直接连接到香港/亚洲节点,所以速度很快。

值得注意的是,类似 Route 53,Azure 所分配的四个服务器使用的是不同的网段、不同的线路,可能有更高的可用性。

注意:Azure 的 DNS 的分区解析可能不兼容 IPv6,这意味的解析结果可能会被 Fallback 到默认线路。

  • 国外速度:★★★★☆,36 ms
  • 北美速度:★★★★☆,27 ms
  • 亚洲速度:★★★★☆,39 ms
  • 欧洲速度:★★★★☆,29 ms
  • 国内速度:★★★★☆,49 ms
  • 最短 TTL:0s
  • 国内分区解析:★★★★★,支持配置到中国,支持 IP 段配置(配合 Traffic Manager)
  • 国外分区解析:★★★★★,支持配置到大州、国家以及部分国家的州,支持 IP 段配置(配合 Traffic Manager)
  • DNSSEC:不支持
  • IPv6:支持
  • 记录类型:支持 A、AAAA、CNAME、NS、MX、TXT、SRV、CAA、PTR。
  • 根域名 CNAME 优化:不支持
  • 优先级:支持(配合 Traffic Manager)
  • 自定义 NS:仅支持添加额外的 NS
  • 价格:每个域名 $0.5/月,**$0.4/百万个请求**
  • 用例 A 价格:**$0.90**
  • 用例 B 价格:**$10.50**
  • SLA:100%

NS1

NS1 也使用了 Anycast 技术,并且国内能够直接连接到香港/亚洲节点,所以速度很快。

  • 国外速度:★★★★★,23 ms
  • 北美速度:★★★★★,9 ms
  • 亚洲速度:★★★★☆,40 ms
  • 欧洲速度:★★★★★,20 ms
  • 国内速度:★★★☆☆,65 ms
  • 最短 TTL:0s
  • 国内分区解析:★★★★★,支持配置到中国,支持 IP 段配置。
  • 国外分区解析:★★★★★,支持配置到大州、国家、美国的州,支持 AS 号、IP 段配置。
  • DNSSEC:支持
  • IPv6:不支持
  • 记录类型:支持 A、AAAA、AFSDB、CAA、CERT、CNAME、DS、HINFO、MX、NAPTR、NS、PTR、RP、SPF、SRV、TXT。
  • 根域名 CNAME 优化:支持
  • 优先级:支持(配合 Traffic Manager)
  • 自定义 NS:仅支持添加额外的 NS
  • 价格:每月前 500k 请求免费,超出部分 $8.0/百万个请求
  • 用例 A 价格:**$4**
  • 用例 B 价格:**$156**
  • 用例 C 价格:**$156**
  • SLA:100%

Constellix

此 DNS 以 GeoDNS 优势著称,使用了 Anycast 保证最低的延迟。

Constellix 三组有六个 DNS 服务器,每一组使用了不太相同的线路。

  • 国外速度:★★★★☆,31.51 ms
  • 北美速度:★★★★★,9.81 ms
  • 亚洲速度:★★★★☆,48.87 ms
  • 欧洲速度:★★★★★,23.77 ms
  • 国内速度:★★☆☆☆,108.9 ms
  • 最短 TTL:0s
  • 国内分区解析:★★★★★,可以精确到每一个省、市,可以配置 ASN 以实现运营商分区解析。
  • 国外分区解析:★★★★★,精确到了各个国家、省、市
  • DNSSEC:不支持
  • IPv6:支持
  • 记录类型:更加齐全,只支持 A、AAAA、CNAME、NS、MX、TXT、SRV、HINFO、NAPTR、CAA、CERT、PTR、RP、SPF。
  • 根域名 CNAME 优化:支持
  • 优先级:支持
  • 自定义 NS:支持
  • 价格:第一个域名 $5/月,此后每个域名 $0.5/月。**$0.4/百万个请求**。分区解析 $0.6/百万个请求
  • 用例 A 价格:**$5.39**
  • 用例 B 价格:**$14.90**
  • 用例 C 价格:**$19.30**
  • 统计功能:支持,可以看到每个国家、城市的请求数。甚至还可以启用日志,看到每一个请求的客户端 IP、IP 数据包类型等等。
  • SLA:100%

Cloudflare Argo 与 Railgun 对比测试,CDN 加速的黑科技

By: James Guo
20 May 2017 at 19:52

本网站曾经一直将国外解析到 CloudFront 实现为国外加速,最近看到 Cloudflare 支持了 Argo 这一新功能,于是就把国外的 CDN 从 CloudFront 换到了 Cloudflare 并开启了 Argo 来试一下效果,官方宣称无缓存时能明显降低 TTFB(首字节延迟),有缓存时也能提高缓存命中率。本文还会将其与 Cloudflare 的另一个企业级的 CDN 加速黑科技——Railgun 进行对比。

Cloudflare Argo

提升缓存命中率,Argo Tiered Cache

Cloudflare 的节点很多,但是节点太多有时不是一件好事——大多数 CDN 之间的节点是相对独立的。首先要先明白 CDN 的工作原理,CDN 通常不会预先缓存内容,而是在访客访问时充当代理的同时对可缓存的内容缓存。就拿本站来说,本站用的是香港虚拟主机,如果有英国伦敦的访客访问了我的网站,那么由于我的网站是可被缓存的,他就会连接到伦敦的节点并被缓存在这个节点。那么如果是英国曼彻斯特的访客访问了呢?由于 CDN 在曼彻斯特另有节点,访客会直接连接到曼彻斯特节点,然而曼彻斯特上并没有缓存,所以该节点会回源到香港。而显然的是,如果曼彻斯特回源到伦敦,使用伦敦的缓存会更快。 综上,如果能选择性的从其他节点上获取资源,TTFB 会更低,缓存命中率也会相应提高。但是一般的 CDN 不会去这样做,因为节点相互独立,节点之间并不知道对方是否已经缓存。一般的解决方法是节点与源站之间先经过为数不多的几个节点,这几个节点可能只是分布在几个州,比如整个欧洲就只有一个这种节点。这样的话,伦敦的访客访问后,同时也被欧洲的那个节点缓存。这样,当再有欧洲其他地区的访客连接到一个没有缓存的节点时,这些节点会直接提供欧洲的那个节点的缓存。CloudFront 和 KeyCDN 就利用了这样的技术。 Cloudflare 是如何实现的他们官方没有详细说明。然而在实际测试时,并没有观察到缓存率上有明显提升,远比不过 CloudFront 的效果。下图是通过这些节点测试的 TTFB,请求是逐个发起的。

Cloudflare 上可被缓存的内容的首次访问测试,启用了 ArgoCloudFront 对比,比 Cloudflare 要强

降低 TTFB,Argo Smart Routing

通常情况下,节点与源站的连接是直接的,这之间的网络很大程度上取决于主机的网络接入。然而,有了 Argo Smart Routing,Cloudflare 会使用自己的线路。图片来自 Cloudflare.com。

Argo Smart Routing 动态图

国外请求测试地址,其中的 via 字段就是 Cloudflare 与本站建立的连接的 IP 地址。通过 GeoIP 服务查询,发现是香港的 IP。Cloudflare 将自己的节点之间都建立了长连接,并在离源站最近的服务器上与源站也提前建立了连接。这样,就能大大降低首次连接所需要的时间。如果回源是 HTTPS 的,那么效果更明显。我的另一个测试地址是没有开启这个功能的,用来对比,它的回源与本站建立的 IP 就不是香港的。

使用 Flexible SSL 的 TTFB 对比

没有启用 Argo启用了 Argo

使用 Full SSL 的 TTFB 对比

没有启用 Argo 并且是 Full SSL启用了 Argo 并且是 Full SSL

速度的确有一定的提升,但是不是特别明显,而且似乎开启了之后一些节点反而更不稳定——原本都是比较稳定的一个速度,开了这个之后一些节点反而忽快忽慢。看来提速的最佳方法还是半程加密。

Cloudflare Railgun

Railgun 是 Cloudflare 专门为 Business 和 Enterprise 企业级客户提供的终极加速方案。要使用它,先需要升级网站套餐为 Business 或 Enterprise,然后还需要在服务器上安装必要软件并在 Cloudflare 上完成配置。这相当于是一个双边加速的软件,其实现原理是让服务器与 Cloudflare 建立一个长久的 TCP 加密连接,使用 Railgun 独有协议而不是 HTTP 协议,这样显然能减少连接延迟。此外,它还会对动态页面缓存:考虑到大多动态页面都包含了大量相同的 HTML 信息,在用户请求一个新的页面时,服务器将只发送那些变化了的内容。这相当于一种多次的 Gzip 压缩。

开启 Railgun 截图

官方宣称,使用 Railgun 能够实现 99.6% 的压缩率,并实现两倍的速度。实际体验也确实如此:

启用了 Railgun 并且是 Full SSL

Railgun 的加速效果还是非常之明显的,明显强于 Argo。

总结

Argo 并没有想象中的那么好用,而且 $5/mo 的起步价和 $0.10/GB 的流量并不便宜。当然也有可能需要一段时间 Argo 去分析线路延迟才能更好的进行优化。本文预计将在一个月后补充更新。 Railgun 效果还是极其显著的,但是它需要企业版套餐才能够使用,并不亲民。

动态内容

延迟:Google Cloud CDN 延迟最低,Cloudflare Railgun 仅次。 流量:对于普通的动态 CMS,Cloudflare Railgun 大约能节省 10 倍以上流量,Google Cloud CDN 是做不到的。 我在国内外几家全站 CDN 对比中测试 Google Cloud CDN 时,其极低的 TTFB 令我惊讶,仔细研究后发现节点是与主机之间建立长连接,而且会保持很长一段时间,此外所有网络都走 Google 内网,本质上与 Argo 和 Railgun 类似。所以目前服务动态内容最快的应该还属 Google Cloud CDN 了,Railgun 基本与之相当。

静态内容

CloudFront 自带的 Regional Edge Caches 在缓存静态内容提高缓存命中率上要比 Argo Tiered Cache 和 Railgun 好,但是 Argo Smart Routing 在服务于动态的不可缓存的内容上更显出优势。Railgun 和 Google Cloud CDN 除了会在边缘节点缓存之外没有其他专门的优化。

关于本站的分区解析

本站的解析没有使用 Cloudflare 而是 自建的 DNS,因为我的 Cloudflare 域名是通过 CNAME 接入的。Cloudflare 分配的 IP 在很长时间内都不会变动,所以我直接把其 IP 设置为了海外线路。使用自建的DNS是为了在备案后,为国内分区解析配置 CDN 线路。 PS: 大家应该都知道启用这个功能后并不会提升国内连接 Cloudflare 的速度,如果想要用 Cloudflare 并且希望国内快一点,源站最好就用美国西岸的。

关于建站和服务选购的一些建议

By: James Guo
7 January 2017 at 07:00

建立网站、建立软件(或游戏)的服务器等,可能会有很多纠结的地方,也有很多坑,这篇文章根据我个人的经验来帮助大家选择最适合自己的方案,以及一些建议,在最后列出来一些我推荐的服务。

服务的三种类型

一般的,建站所需要购买的服务也是属于这三种服务之间的。从 SaaS、Paas 到 IaaS,依次从使用简便到复杂,从可拓展性低到高。了解这三种服务类型有助于选择合适的服务。

  • SaaS,软件即服务:比如 WordPress.com 等提供了一整套服务(包括了域名、主机、平台和软件)的,就算是 SaaS,这种服务对于初学者使用起来最方便,专业人士也能玩出不少花样,但可拓展性受到软件的限制,通常这种服务都有较高的可用性,并且是分布式的。
  • PaaS,平台即服务:比如基于 cPanel、Plesk 面板的虚拟主机,你可以在平台上安装已有的开源软件,或者将自己软件代码上传,总体使用几乎和 SaaS 一样简单,使用特定的操作系统和代码语言,安装各种程序。PaaS 有普通的也有分布式的,后者的在可用性和数据保障,以及可拓展性上都要好于前者。
  • IaaS,基础设施即服务:包括 VPS、独立服务器、云 VPS 和共有/私有云服务器。VPS 和独立服务器相比主要差距是在配置上,包括 CPU、内存、硬盘等,后者的配置会高很多,可用性方面没有太大区别。云 VPS 和共有/私有云实际上是基于云端分布式的 VPS 和独立服务器,一样的,他们的在可用性和数据保障,以及可拓展性上都要好于 VPS 和独立服务器。IaaS 需要自己选择操作系统,所有的服务和软件都是自己配置,通常都给你 root 权限。

服务的选择

  • 位置选择之国内:首先需要考虑的是国内还是国外?如果选择国内,首先你得域名需要经过备案,这可能需要将近一个月时间,这无疑为建网站增加了不少成本。而且国内的服务器普遍较贵。不过如果要选择国内,我比较推荐的主机是新浪的 SAE,它价格很低,是按需付费,并且还有免费额度,它属于分布式的 PaaS,提供高可用率的服务,支持 Docker 容器、DDOS 防御。不过 SAE 对于非企业用户不提供 CDN 和自定义域名 HTTPS,我推荐你使用 UPYUN 来实现 CDN 和自定义域名 HTTPS 功能。国内的优点:可以保证网络延迟低,并能符合目前的一些法律政策。
  • 位置选择之国外:不少亚洲的主机(包括但不限于香港、日本、新加坡)从大陆连接会 “绕道”,导致延迟很高,购买前需要先了解清楚,香港便宜的共享主机推荐 TlOxygen。亚洲的主机普遍网络带宽不大,流量比较少,如果不选择亚洲的,那就建议先选北美的。国外的主机通常会有比国内很多主机更低的价格,更好的国际带宽。 如果有条件,可以配置多个服务器,两个服务器推荐的解决方案是亚洲 + 北美东岸,并将亚洲和大洋洲都指向亚洲,其余的都指向北美。如果有条件配置更多服务器,那么可以同时配置北美东岸 + 北美西岸 + 欧洲 + 亚洲的四个服务器并分区解析,就我的实际测试而言,把非洲指向欧洲,把大洋洲指向北美西岸能达到最快的速度。

一些可能需要的特性:基于要实现的不同功能,可能需要在以下方面有要求,在选择服务的时候需要优先考虑。

  • 高数据可靠性:几乎所有的网站或是和网络相关的软件,都需要存储用户的数据,所以高数据可靠性是十分重要的。所以磁盘阵列为 RAID1 和 RAID10 是首选。而且用户数据的备份也是十分重要的,可以存储在第三方如 AWS S3。一些服务提供商提供了备份功能,其实也是能够保证高数据可靠性。
  • 防御攻击的能力:攻击的成本已经越来越低,种类也很多。通常最难防御的攻击种类是 DDOS,其余的几乎都可以通过软件实现。建议在选择服务器时就要选择有 DDOS 防御的服务器,或者直接使用 CloudFlare 之类的基于第七层的防御。
  • 可伸缩,按需付费:最简单的例子就是网络的计费方式不是按照带宽计费,而是按照每 GB 多少钱计费,不限带宽,能够避免不必要的支出的同时还会让用户享受最快的速度。同样的道理,按照系统资源的使用来计费的模式是最好的选择。一般的,基于云端的 PaaS 都是这种计费方式,IaaS 则需要自行配置来实现资源不够时升级配置,资源过剩时回收配置(也可以是 Auto Balancing),所以按小时(或分钟、秒种)级别的计费 IaaS 计费方式最适合这样伸缩以达到按需付费的目的。
  • 网络可靠性:网络可靠性也十分重要,如果服务的网络不好,那么将极大的影响用户体验,导致用户不可以使用服务。
  • SLA:重要的服务都需要 SLA,SLA 能给你承诺服务的可用率,当服务没有满足承诺时,服务提供商会给你赔偿。
  • IPv6:就目前来看,如果不支持 IPv6 也没什么问题。但是能有原生的 IPv6 支持总比没有好,而且现在正在有越来越多的运营商支持 IPv6,使用 IPv6 有可能会有更低的网络延迟,同时配置 IPsec 也有优势。

其他

  • 域名相关:不管你是选择使用虚拟主机、VPS 或是独立服务器,通常你还需要自己买一个域名,配置 DNS 解析等等,推荐免费的 DNS 解析有 CloudFlare、Rage4,国内还有 CloudXNS,一些虚拟主机商以及域名注册商也提供免费的解析,但不如前面介绍的那几个(详细关于 DNS 的介绍请见此)。如果选择使用 CloudFlare,那么你还可以在 DNS 后台选择开启 Proxy(CDN),这样能为你的网站缓存并加速(但实际上对于国内来说有可能反而减速),并获得一些基础的 DDOS 防护,并隐藏你的源站 IP 地址。
  • 域名注册商的选择:首先,要保证总的域名保有量大;其次,要域名后缀种类齐全;第三,最好能附加免费的企业邮箱和高级的隐私保护;第四,域名注册后要能删除并退款,防止手抖注册错了;第五,价格不能太贵。在我做的 TlOxygen 这个公共域名注册服务上,使用的域名注册商是全球前十大域名注册商;有 500 多种域名后缀,数量超过 GoDaddy;赠送企业邮箱,可以配置无限个转发邮箱,甚至还可以配置子域名邮箱,还支持 DKIM;大多数种类域名删除可以拿到退款;价格比 Godaddy 便宜很多,续费价格没那么坑,基本上是 7 折;域名隐私保护只有 5 元,但功能比很多免费的高级:即使开了域名隐私保护,别人给你发邮件时,会收到表格,还能继续填写表格与你联系。

一些服务商的推荐

排列的顺序只是与添加在这个列表里的时间有关,新添加的会被放在后面。此处添加的服务商全是个人的推荐的,以后还会持续更新。 标注列表:

  • (6):全面支持 IPv6
  • (6):部分支持 IPv6
  • (D):支持免费 DDOS 防御

SaaS

建立网站

CDN

以下 CDN 都支持 HTTPS 与 IPv6

DNS

数据存储

代码托管

SaaS 还有很多,太多的东西都是 SaaS 了,所以这里只能算举几个例子。

PaaS

虚拟主机

云主机

或者说是分布式的虚拟主机,但是有独立的 CPU 和内存资源。

可自选软件语言的/Docker 容器

IaaS

VPS/Cloud

标注列表:

备注

  1. SAE 的 IPv6 的激活需要额外的月付
  2. OVH 的 SSD VPS 暂时不支持 IPv6
  3. 在购买某种配置时,若告知你是共享 CPU,那么还是共享 CPU
  4. OVH 只有 Cloud VPS 是基于云端的 VPS
  5. Google 官方并没有明确说明提供 DDOS 防御,但实际上是有能力防御的
  6. Vultr 的 DDOS 防御需要额外购买,且仅部分地区支持,最大防御仅 10Gbps

DNS 域名解析系统详解——基础篇

By: James Guo
24 December 2016 at 20:18

DNS(域名解析系统)的工作使命,就是服务于与域名相关的内容的底层。是域名(如:example.com)的核心组成部分。绝大多数与域名相关的东西,都离不开它。比如:

  • 访问一个网站,通常是输入一个域名(如 https://www.example.com
  • 发送邮件@ 后面是主机名,而主机名通常是个域名(如 webmaster@example.com

整个 DNS 具有复杂的层次,这对刚开始购买域名的人有很大的疑惑。本文将详尽的介绍 DNS 的工作原理,有助于更深刻的理解。本文将介绍:

  1. 在客户端上是如何解析一个域名的
  2. 在 DNS 缓存服务器上是如何逐级解析一个域名的

同时还包含:

  1. 域名的分类
  2. 什么是 Glue 记录
  3. 为什么 CNAME 不能设置在主域名上

先从本地的 DNS 开始讲起。

本地 DNS

本地的 DNS 相对于全球 DNS 要简单的多。所以先从本地 DNS 开始讲起。 127.0.0.1 常被用作环回 IP,也就可以作为本机用来访问自身的 IP 地址。通常,这个 IP 地址都对应着一个域名,叫 localhost。这是一个一级域名(也是顶级域名),所以和 com 同级。系统是如何实现将 localhost 对应到 127.0.0.1 的呢?其实就是通过 DNS。在操作系统中,通常存在一个 hosts 文件,这个文件定义了一组域名到 IP 的映射。常见的 hosts 文件内容如下:

127.0.0.1       localhost::1             localhost

它就定义了 localhost 域名对应 127.0.0.1 这个 IP(第二行是 IPv6 地址)。这样,当你从浏览器里访问这个域名,或者是在终端中执行 Ping 的时候,会自动的查询这个 hosts 文件,就从文件中得到了这个 IP 地址。此外,hosts 文件还可以控制其他域名所对应的 IP 地址,并可以 override 其在全球 DNS 或本地网络 DNS 中的值。但是,hosts 文件只能控制本地的域名解析。hosts 文件出现的时候,还没有 DNS,但它可以说是 DNS 的前身。 如果需要在一个网络中,公用同一个 DNS,那么就需要使用 IP 数据包向某个服务器去获取 DNS 记录。 在一个网络里(此处主要指本地的网络,比如家庭里一个路由器下连接的所有设备和这个路由器组成的网络),会有很多主机。在与这些主机通信的时候,使用域名会更加的方便。通常,连接到同一个路由器的设备会被设置到路由器自己的一个 DNS 服务器上。这样,解析域名就不仅可以从 hosts 去获取,还可以从这个服务器上去获取。从另一个 IP 上去获取 DNS 记录通过 DNS 查询,DNS 查询通常基于 UDP 或者 TCP 这种 IP 数据包,来实现远程的查询。我的个人电脑的网络配置如下,这是在我的电脑连接了路由器之后自动就设置上的:

网络配置截图

重点是在路由器和搜索域上。 我的电脑的主机名(也是电脑名)设置的是 ze3kr,这个内容在连接路由器时也被路由器知道了,于是路由器就给我的主机分配了一个域名 ze3kr.locallocal 这个一级域名专门供本地使用。在这个网络内所有主机通过访问 ze3kr.local 这个域名时,路由器(10.0.1.1)就会告知这个域名对应的 IP 地址,于是这些主机够获得到我的电脑的 IP 地址。至于搜索域的作用,其实是可以省去输入完整的域名,比如:

$ ping ze3krPING ze3kr.local (10.0.1.201): 56 data bytes64 bytes from 10.0.1.201: icmp_seq=0 ttl=64 time=0.053 ms--- ze3kr.local ping statistics ---1 packets transmitted, 1 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 0.053/0.053/0.053/0.000 ms

当设置了搜索域时,当你去解析 ze3kr 这个一级域名时,便会先尝试去解析 ze3kr.local,当发现 ze3kr.local 存在对应的解析时,便停止进一步解析,直接使用 ze3kr.local 的地址。 现在你已经了解了本地 DNS 的工作方式。DNS 的基本工作方式就是:获取域名对应 IP,然后与这个 IP 进行通信。 当在本地去获取一个完整域名(FQDN)时(执行 getaddrbyhost),通常也是通过路由器自己提供的 DNS 进行解析的。当路由器收到一个完整域名请求且没有缓存时,会继续向下一级缓存 DNS 服务器(例如运营商提供的,或者是组织提供的,如 8.8.8.8)查询,下一级缓存 DNS 服务器也没有缓存时,就会通过全球 DNS 进行查询。具体的查询方式,在 “全球 DNS” 中有所介绍。

总结

在本地,先读取本地缓存查找记录,再读取 Hosts 文件,然后在搜索域中查找域名,最后再向路由器请求 DNS 记录。

全球 DNS

在全球 DNS 中,一个完整域名通常包含多级,比如 example.com. 就是个二级域名, www.example.com. 就是个三级域名。通常我们常见到的域名都是完整的域名。

全球 DNS 拓扑图

一级域名被分为以下三个部分:

  1. 普通域(gTLD):通常是三个字节或三个字节以上的域名后缀,或者是 Unicode 字符的后缀。这些域名分配给机构管理。
  2. 国家域(ccTLD):所有两个字节的域名都是国家代码,这些域名分配给国家管理。不少国家域都开放了注册,不过有的国家域仅允许当前国家的人去注册。
  3. arpa:用于将 IP 地址转换为对应的域名的根域。

我们通常所见到的域名都是普通域和国家域,而 arpa 域用作 IP 到域名的反向解析。 在本地 DNS 中,只存在域名对应 IP 这种映射关系。然而,在全球 DNS 中,有着更多的资源记录种类(RR),不只是域名对应 IP 的关系,下面将分别介绍一些最基本的资源记录种类:

  • A 记录:定义了一个 IP 地址。(AAAA 记录则是定义一个 IPv6 地址)(RFC 1035
  • NS 记录:域名服务器记录,说明一个域名下的的授权域名服务器记录。内容必须是一个域名。(RFC 1035

根域名

先从根域名开始,未命名根也可以作为 . 。你在接下来的部分所看到的很多域名都以 .结尾,以 .结尾的域名是特指的是根域名下的完整域名,然而不以 . 结尾的域名大都也是完整域名,实际使用时域名末尾的 .也常常省略。在本文中,我使用 dig 这一个常用的 DNS 软件来进行查询,我的电脑也已经连接到了互联网。 假设目前这个计算机能与互联网上的 IP 通信,但是完全没有 DNS 服务器。此时你需要知道根 DNS 服务器,以便自己获取某个域名的 IP 地址。根 DNS 服务器列表可以在这里下载到。文件内容如下:

;       This file holds the information on root name servers needed to;       initialize cache of Internet domain name servers;       (e.g. reference this file in the "cache  .  <file>";       configuration file of BIND domain name servers).;;       This file is made available by InterNIC;       under anonymous FTP as;           file                /domain/named.cache;           on server           FTP.INTERNIC.NET;       -OR-                    RS.INTERNIC.NET;;       last update:    October 20, 2016;       related version of root zone:   2016102001;; formerly NS.INTERNIC.NET;.                        3600000      NS    A.ROOT-SERVERS.NET.A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:ba3e::2:30;; FORMERLY NS1.ISI.EDU;.                        3600000      NS    B.ROOT-SERVERS.NET.B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201B.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:84::b;; FORMERLY C.PSI.NET;.                        3600000      NS    C.ROOT-SERVERS.NET.C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12C.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2::c;; FORMERLY TERP.UMD.EDU;.                        3600000      NS    D.ROOT-SERVERS.NET.D.ROOT-SERVERS.NET.      3600000      A     199.7.91.13D.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2d::d;; FORMERLY NS.NASA.GOV;.                        3600000      NS    E.ROOT-SERVERS.NET.E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10E.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:a8::e;; FORMERLY NS.ISC.ORG;.                        3600000      NS    F.ROOT-SERVERS.NET.F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2f::f;; FORMERLY NS.NIC.DDN.MIL;.                        3600000      NS    G.ROOT-SERVERS.NET.G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4G.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:12::d0d;; FORMERLY AOS.ARL.ARMY.MIL;.                        3600000      NS    H.ROOT-SERVERS.NET.H.ROOT-SERVERS.NET.      3600000      A     198.97.190.53H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::53;; FORMERLY NIC.NORDU.NET;.                        3600000      NS    I.ROOT-SERVERS.NET.I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17I.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fe::53;; OPERATED BY VERISIGN, INC.;.                        3600000      NS    J.ROOT-SERVERS.NET.J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:c27::2:30;; OPERATED BY RIPE NCC;.                        3600000      NS    K.ROOT-SERVERS.NET.K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fd::1;; OPERATED BY ICANN;.                        3600000      NS    L.ROOT-SERVERS.NET.L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:9f::42;; OPERATED BY WIDE;.                        3600000      NS    M.ROOT-SERVERS.NET.M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35; End of file

这个文件中每一行分为 4 列,分别是完整域名、资源类型、生存时间(TTL,也就是可以缓存的时间)以及资源数据。通过这个文件就可以知道根域名所对应的 13 个根域名服务器的完整域名,还能知道这 13 个完整域名所对应的 IP 地址。这是因为 NS 记录只能设置为完整域名,所以为了告知 NS 所对应的 IP,还需要额外的数据去说明这 13 个完整域名对应的 IP(这些额外的数据叫做 Glue 记录)。这 13 个根域名服务器都是独立的且冗余的(但是所返回的内容应该是相同的),这样当其中的某个或某些服务器发生故障时,不会影响到解析。一旦无法解析根域名,那么所有的域名都将无法访问。

Glue 记录:如果 NS 记录对应的某个完整域名包含在那个域名之中,那么就需要添加一个 Glue 记录,来指定那个完整域名所对应的 IP。实际上任何完整域名都属于根域名之中,所以根域名就必须对这些 NS 记录设置对应的 IP 地址。Glue 记录实质上就是 A(或 AAAA)记录。(RFC 1033

我们假设你已经通过某种方法成功获取到了这个文件,那么下一步,就是使用这里的服务器对根域名以及一级域名进行解析。对根域名的解析实际上是不必要的,但是我们还是对其进行解析以便进一步分析,获得在互联网上最新、最全的数据。 在根域名上的记录,以从根域名服务器中所解析其根域名的数据为准,而不是刚才的那个文件中的内容。刚才的文件内容只是告知根域名服务器的列表,也就是只有 NS 记录和 NS 记录对应的完整域名的 IP 记录,而不是根域名下的所有记录。 我们先向 198.41.0.4 这个 IP 发送查询根域名的所有记录,any 代表显示任何类型的记录,为了看起来方便,一些无关的响应已经删除(如果只是解析根域名,这一步不能跳过。如果需要直接解析一级域名,那么这一步就可以跳过)。

$ dig @198.41.0.4 . any;; QUESTION SECTION:;.INANY;; ANSWER SECTION:.518400INNSa.root-servers.net..518400INNSb.root-servers.net..518400INNSc.root-servers.net..518400INNSd.root-servers.net..518400INNSe.root-servers.net..518400INNSf.root-servers.net..518400INNSg.root-servers.net..518400INNSh.root-servers.net..518400INNSi.root-servers.net..518400INNSj.root-servers.net..518400INNSk.root-servers.net..518400INNSl.root-servers.net..518400INNSm.root-servers.net..86400INSOAa.root-servers.net. nstld.verisign-grs.com. 2016122400 1800 900 604800 86400;; ADDITIONAL SECTION:a.root-servers.net.518400INA198.41.0.4b.root-servers.net.518400INA192.228.79.201c.root-servers.net.518400INA192.33.4.12d.root-servers.net.518400INA199.7.91.13e.root-servers.net.518400INA192.203.230.10f.root-servers.net.518400INA192.5.5.241g.root-servers.net.518400INA192.112.36.4h.root-servers.net.518400INA198.97.190.53i.root-servers.net.518400INA192.36.148.17j.root-servers.net.518400INA192.58.128.30k.root-servers.net.518400INA193.0.14.129l.root-servers.net.518400INA199.7.83.42m.root-servers.net.518400INA202.12.27.33a.root-servers.net.518400INAAAA2001:503:ba3e::2:30b.root-servers.net.518400INAAAA2001:500:84::bc.root-servers.net.518400INAAAA2001:500:2::cd.root-servers.net.518400INAAAA2001:500:2d::de.root-servers.net.518400INAAAA2001:500:a8::ef.root-servers.net.518400INAAAA2001:500:2f::fg.root-servers.net.518400INAAAA2001:500:12::d0dh.root-servers.net.518400INAAAA2001:500:1::53i.root-servers.net.518400INAAAA2001:7fe::53j.root-servers.net.518400INAAAA2001:503:c27::2:30k.root-servers.net.518400INAAAA2001:7fd::1l.root-servers.net.518400INAAAA2001:500:9f::42m.root-servers.net.518400INAAAA2001:dc3::35

其中,可以看到 TTL 与刚才文件中的内容不一样,此外还多了一个 SOA 记录,所以实际上是以这里的结果为准。这里还有一个 SOA 记录,SOA 记录是普遍存在的,具体请参考文档,在这里不做过多说明。

SOA 记录:指定有关 _DNS 区域_的权威性信息,包含主要名称服务器、域名管理员的电邮地址、域名的流水式编号、和几个有关刷新区域的定时器。(RFC 1035

_DNS 区域_:对于根域名来说,DNS 区域就是空的,也就是说它负责这互联网下所有的域名。而对于我的网站,DNS 区域就是 guozeyu.com.,管理着 guozeyu.com. 本身及其子域名的记录。

此处的 ADDITIONAL SECTION 其实就包含了 Glue 记录。

一级域名

根域名自身的 DNS 服务器服务器除了被用于解析根自身之外,还用于解析所有在互联网上的一级域名你会发现,几乎所有的 DNS 服务器,无论是否是根 DNS 服务器,都会解析其自身以及其下级域名。 从之前的解析结果中可以看出,根域名没有指定到任何 IP 地址,但是却给出了 NS 记录,于是我们就需要用这些 NS 记录来解析其下级的一级域名。下面,用所得到的根 NS 记录中的服务器其中之一来解析一个一级域名 com.

$ dig @198.41.0.4 com any;; QUESTION SECTION:;com.INANY;; AUTHORITY SECTION:com.172800INNSa.gtld-servers.net.com.172800INNSb.gtld-servers.net.com.172800INNSc.gtld-servers.net.com.172800INNSd.gtld-servers.net.com.172800INNSe.gtld-servers.net.com.172800INNSf.gtld-servers.net.com.172800INNSg.gtld-servers.net.com.172800INNSh.gtld-servers.net.com.172800INNSi.gtld-servers.net.com.172800INNSj.gtld-servers.net.com.172800INNSk.gtld-servers.net.com.172800INNSl.gtld-servers.net.com.172800INNSm.gtld-servers.net.;; ADDITIONAL SECTION:a.gtld-servers.net.172800INA192.5.6.30b.gtld-servers.net.172800INA192.33.14.30c.gtld-servers.net.172800INA192.26.92.30d.gtld-servers.net.172800INA192.31.80.30e.gtld-servers.net.172800INA192.12.94.30f.gtld-servers.net.172800INA192.35.51.30g.gtld-servers.net.172800INA192.42.93.30h.gtld-servers.net.172800INA192.54.112.30i.gtld-servers.net.172800INA192.43.172.30j.gtld-servers.net.172800INA192.48.79.30k.gtld-servers.net.172800INA192.52.178.30l.gtld-servers.net.172800INA192.41.162.30m.gtld-servers.net.172800INA192.55.83.30a.gtld-servers.net.172800INAAAA2001:503:a83e::2:30b.gtld-servers.net.172800INAAAA2001:503:231d::2:30

可以看到解析的结果和解析根域名的类似,com. 下也设置了 13 个域名服务器,但是这 13 个域名服务器与根域服务器完全不同

此处也存在 ADDITIONAL SECTION 包含的 Glue 记录,然而 gtld-servers.net. 却并不包含在 com. 下。然而实际上,com.net. 域名都是属于同一个所有者(Verisign),所以这样设置是可以的。

和根域名类似,此时解析到的内容只是 com. 的域名服务器,而并不是 com. 本身的记录,com. 上的记录,以从 com. 的域名服务器中所解析其 com. 域名的数据为准。 所以,下面再使用 com. 的域名服务器来解析 com. 自身,看情况如何(如果只是解析一级域名,这一步不能跳过。如果需要直接解析二级域名,那么这一步就可以跳过):

$ dig @192.5.6.30 com any;; QUESTION SECTION:;com.INANY;; ANSWER SECTION:com.900INSOAa.gtld-servers.net. nstld.verisign-grs.com. 1482571852 1800 900 604800 86400com.172800INNSe.gtld-servers.net.com.172800INNSm.gtld-servers.net.com.172800INNSi.gtld-servers.net.com.172800INNSk.gtld-servers.net.com.172800INNSb.gtld-servers.net.com.172800INNSj.gtld-servers.net.com.172800INNSa.gtld-servers.net.com.172800INNSd.gtld-servers.net.com.172800INNSg.gtld-servers.net.com.172800INNSc.gtld-servers.net.com.172800INNSh.gtld-servers.net.com.172800INNSf.gtld-servers.net.com.172800INNSl.gtld-servers.net.;; ADDITIONAL SECTION:e.gtld-servers.net.172800INA192.12.94.30m.gtld-servers.net.172800INA192.55.83.30i.gtld-servers.net.172800INA192.43.172.30k.gtld-servers.net.172800INA192.52.178.30b.gtld-servers.net.172800INA192.33.14.30b.gtld-servers.net.172800INAAAA2001:503:231d::2:30j.gtld-servers.net.172800INA192.48.79.30a.gtld-servers.net.172800INA192.5.6.30a.gtld-servers.net.172800INAAAA2001:503:a83e::2:30d.gtld-servers.net.172800INA192.31.80.30g.gtld-servers.net.172800INA192.42.93.30c.gtld-servers.net.172800INA192.26.92.30h.gtld-servers.net.172800INA192.54.112.30f.gtld-servers.net.172800INA192.35.51.30l.gtld-servers.net.172800INA192.41.162.30

也和根域名解析的情况类似,此时多了一个 SOA 类型的记录。

二级域名

和解析一级域名 com. 时类似,继续使用 com. 的域名服务器解析 guozeyu.com.

$ dig @192.5.6.30 guozeyu.com any;; QUESTION SECTION:;guozeyu.com.INANY;; AUTHORITY SECTION:guozeyu.com.172800INNSa.ns.guozeyu.com.guozeyu.com.172800INNSb.ns.guozeyu.com.guozeyu.com.172800INNSc.ns.guozeyu.com.;; ADDITIONAL SECTION:a.ns.guozeyu.com.172800INAAAA2001:4860:4802:38::6ca.ns.guozeyu.com.172800INA216.239.38.108b.ns.guozeyu.com.172800INAAAA2001:4860:4802:36::6cb.ns.guozeyu.com.172800INA216.239.36.108c.ns.guozeyu.com.172800INAAAA2001:4860:4802:34::6cc.ns.guozeyu.com.172800INA216.239.34.108

此处也存在 ADDITIONAL SECTION 包含的 Glue 记录,是因为 ns.guozeyu.com.guozeyu.com. 之下。 同样的,guozeyu.com. 上的记录,以从 guozeyu.com. 的域名服务器中所解析其 guozeyu.com. 域名的数据为准。此时这种解析就尤为必要了,因为 guozeyu.com. 上不只有 SOA 记录,同时也有 A 记录和其他重要的记录。 现在使用 guozeyu.com. 的域名服务器来解析 guozeyu.com.(如果只是解析二级域名,这一步不能跳过。如果需要解析三级域名,那么这一步可以跳过):

$ dig @216.239.38.108 guozeyu.com any;; QUESTION SECTION:;guozeyu.com.INANY;; ANSWER SECTION:guozeyu.com.21600INA104.199.138.99guozeyu.com.172800INNSa.ns.guozeyu.com.guozeyu.com.172800INNSb.ns.guozeyu.com.guozeyu.com.172800INNSc.ns.guozeyu.com.guozeyu.com.21600INSOAa.ns.guozeyu.com. support.tlo.xyz. 1 21600 3600 259200 300guozeyu.com.172800INMX100 us2.mx1.mailhostbox.com.guozeyu.com.172800INMX100 us2.mx2.mailhostbox.com.guozeyu.com.172800INMX100 us2.mx3.mailhostbox.com.;; ADDITIONAL SECTION:a.ns.guozeyu.com.604800INA216.239.38.108a.ns.guozeyu.com.604800INAAAA2001:4860:4802:38::6cb.ns.guozeyu.com.604800INA216.239.36.108b.ns.guozeyu.com.604800INAAAA2001:4860:4802:36::6cc.ns.guozeyu.com.604800INA216.239.34.108c.ns.guozeyu.com.604800INAAAA2001:4860:4802:34::6c

可以发现增加了 A、SOA 和 MX 记录。

  • MX 记录:邮件交换记录,让发送到一个域名的邮件由其他的主机去接受,用于与 A 记录共存。(RFC 1035

正是因为 MX 记录的存在,所以发往 username@guozeyu.com 的邮件不是指向 guozeyu.com. 对应的 IP 地址,而是使用 mailhostbox.com. 下的服务器。 当然,由于我是 guozeyu.com. 的所有者,所以我也可以控制 guozeyu.com. 下的三级或更高级的域名。比如 www.guozeyu.com.

$ dig @216.239.38.108 www.guozeyu.com any;; QUESTION SECTION:;guozeyu.com.INANY;; ANSWER SECTION:www.guozeyu.com.172800INCNAMEguozeyu.com.guozeyu.com.21600INA104.199.138.99guozeyu.com.172800INNSa.ns.guozeyu.com.guozeyu.com.172800INNSb.ns.guozeyu.com.guozeyu.com.172800INNSc.ns.guozeyu.com.guozeyu.com.21600INSOAa.ns.guozeyu.com. support.tlo.xyz. 1 21600 3600 259200 300guozeyu.com.172800INMX100 us2.mx1.mailhostbox.com.guozeyu.com.172800INMX100 us2.mx2.mailhostbox.com.guozeyu.com.172800INMX100 us2.mx3.mailhostbox.com.;; ADDITIONAL SECTION:a.ns.guozeyu.com.604800INA216.239.38.108a.ns.guozeyu.com.604800INAAAA2001:4860:4802:38::6cb.ns.guozeyu.com.604800INA216.239.36.108b.ns.guozeyu.com.604800INAAAA2001:4860:4802:36::6cc.ns.guozeyu.com.604800INA216.239.34.108c.ns.guozeyu.com.604800INAAAA2001:4860:4802:34::6c
  • CNAME 记录:规范名称记录,一个主机名字的别名。内容必须是一个域名。(RFC 1035

我的三级域名 www.guozeyu.com. 使用 CNAME 记录指向了 guozeyu.com.,这代表着 guozeyu.com.所有资源类型均与 guozeyu.com. 相同。这也是为什么 CNAME 不能和其他任何记录连用的原因,CNAME 的存在会取代任何其他的记录。由于主域名下常常也存在 SOA、NS 以及 MX 记录,所以主域名下不能使用 CNAME 解析。此外,我也可以设置在 guozeyu.com. 下的三级域名指向一个 NS 记录,这样我就可以把我的三级域名再给别人使用。

总结

  1. 如果需要解析一个根域名,使用根域名服务器解析根域名即可。
  2. 如果需要解析一个一级域名,需要先使用根域名服务器解析一级域名,获取到一级域名的域名服务器,然后用一级域名服务器解析一级域名自身。
  3. 如果需要解析一个二级域名,需要先使用根域名服务器解析一级域名,获取到一级域名的域名服务器,然后用一级域名服务器获取二级域名的域名服务器,然后用二级域名服务器解析二级域名自身。
  4. 如果需要解析一个三级域名,需要先使用根域名服务器解析一级域名,获取到一级域名的域名服务器,然后用一级域名服务器获取二级域名的域名服务器,然后用二级域名服务器解析三级域名,若三级域名下没有 NS、CNAME 记录,则解析结束,如果有 CNAME 记录则再通过正常的解析方式解析这个 CNAME 所指向的域名的记录,如果有 NS 记录,则用三级域名服务器解析三级域名自身。

DNS 缓存

通常,凡是解析过的记录,都会被解析服务器、路由器、客户端、软件缓存。这样可以大大减少请求次数。凡是被缓存的记录,其在 TTL 规定的时间内都不会再次去解析,而是直接从高速缓存中读取。正常情况下,服务器、路由器等都不应该扩大 TTL 值。被缓存的内容,TTL 值要在每秒减 1 。

$ dig guozeyu.com;; QUESTION SECTION:;guozeyu.com.INA;; ANSWER SECTION:guozeyu.com.21599INA104.199.138.99;; Query time: 514 msec;; SERVER: 10.0.1.1#53(10.0.1.1);; WHEN: Sat Dec 24 20:00:29 2016;; MSG SIZE  rcvd: 43$ dig guozeyu.com;; QUESTION SECTION:;guozeyu.com.INA;; ANSWER SECTION:guozeyu.com.21598INA104.199.138.99;; Query time: 45 msec;; SERVER: 10.0.1.1#53(10.0.1.1);; WHEN: Sat Dec 24 20:00:30 2016

这是我连续两次在我的电脑上直接通过路由器解析 guozeyu.com. 的结果。显然第一次解析没有命中高速缓存,路由器向运营商的 DNS 服务器查询,运营商的 DNS 再从根域名逐级解析 guozeyu.com.,总耗时 514 毫秒。然后 guozeyu.com. 就会同时在运营商的服务器上和路由器的 DNS 服务器上进行缓存。在第二次请求 guozeyu.com. 时,就命中了在路由器上的缓存,于是由路由器直接返回解析记录,总耗时 45 毫秒。两次查询时间相隔一秒,所以 TTL 值也被减去 1 。

arpa 反向解析

反向解析用于:给定一个 IP 地址,返回与该地址对应的域名。函数 gethostbyaddr 正是使用了这种方法获取 IP 对应的域名。 一级域名 arpa. 用于设置反向解析,对于我的网站的 IPv4 地址 104.199.138.99,其所对应的 arpa 完整域名是:99.138.199.104.in-addr.arpa.,通过获取这个域名的 PTR 记录,就可以得到这个域名所对应的完整域名域名。

$ host 104.199.138.9999.138.199.104.in-addr.arpa domain name pointer 99.138.199.104.bc.googleusercontent.com.$ dig 99.138.199.104.in-addr.arpa. ptr +short99.138.199.104.bc.googleusercontent.com.
  • PTR 记录:指针解析记录,内容是一个完整域名,定义一个 IP 所对应的域名。

可以看到,使用 host 命令获得 IP 地址的域名与使用 dig 获取的相同,均为 99.138.199.104.bc.googleusercontent.com. 。可以看出,这个 IP 是属于 Google 的。此外,需要注意的是 in-addr.arpa. 下的字域名正好与原 IPv4 地址排列相反。 这个记录通常可以由 IP 的所有者进行设置。然而,IP 的所有者可以将这项记录设置为任何域名,包括别人的域名。所以通过这种方法所判断其属于 Google 并不准确,所以,我们还需要对其验证:

$ dig 99.138.199.104.bc.googleusercontent.com a +short104.199.138.99

可以看到,这个域名又被解析到了原本的 IP,此时验证完毕,确认了这个 IP 属于 Google。所以,通过 gethostbyaddr 之后,还要继续 getaddrbyhost 验证。 然而,进行这种解析时解析服务器是由谁提供的呢?我们来看看 99.138.199.104.in-addr.arpa. 的上一级域名的解析记录:

$ dig 138.199.104.in-addr.arpa. any;; QUESTION SECTION:;138.199.104.in-addr.arpa.INANY;; ANSWER SECTION:138.199.104.in-addr.arpa. 21583INNSns-gce-public1.googledomains.com.138.199.104.in-addr.arpa. 21583INNSns-gce-public2.googledomains.com.138.199.104.in-addr.arpa. 21583INNSns-gce-public3.googledomains.com.138.199.104.in-addr.arpa. 21583INNSns-gce-public4.googledomains.com.138.199.104.in-addr.arpa. 21583INSOAns-gce-public1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300

可以看到,上一级 138.199.104.in-addr.arpa. 下配置了 Google 的域名服务器,所以 104.199.138.0/24104.196.123.0 - 104.196.123.255)都是属于 Google 的。然而,既然这个域名下的域名服务器可以设置为 Google 自己的,所以这个域名下就可以设置任何记录,不只是 PTR,所以也可以添加 A 记录把 arpa 域名当作网站! 我虽然没有那么大块的 IPv4 地址,但是我有这个 IPv6 地址:2001:470:f913::/48 并且能够设置在 arpa. 下的 NS 记录。这个 /48 的 IPv6 地址对应着 arpa. 反向解析的完整域名是 3.1.9.f.0.7.4.0.1.0.0.2.ip6.arpa. ,可以看到 IPv6 的反向解析在另一个二级域名 ip6.arpa. 下,此外其地址是将 IPv6 的每一个十六进制为拆开为一个字域并反向排列的。 我已把这个地址设置为了我自己可以控制的 NS,然后配置了 A 记录,瞬间这个反向解析域名就可以当作正常的解析使用了!

  • 3.1.9.f.0.7.4.0.1.0.0.2.ip6.arpa
  • ze3kr.3.1.9.f.0.7.4.0.1.0.0.2.ip6.arpa

如果你试图用浏览器访问这两个域名,会收到证书错误的报告,因为我还没给这个域名签发证书。

利用 GCE 建立一个 Anycast 网络,超快的香港节点,Google Cloud CDN

By: James Guo
4 October 2016 at 09:27

在上一篇文章中,我简单的介绍了 Google Compute Engine(简称 GCE)的基础使用。这篇文章我将介绍如何利用 GCE 建立一个 Anycast 网络,并测试了其速度。 想要实现这个功能,就需要使用 Cross-Region Load Balancing(跨地区的负载均衡),此功能就相当于一个 HTTP(S) 的反向代理,所以只能针对 HTTP/HTTPS 请求进行负载均衡。

简要概述

GCE 上所实现的这个功能是基于第七层的网络代理,所以其拓扑图是这样的: 用户 —> 边缘服务器 —> 实例

  • 用户到边缘服务器之间的连接:使用 HTTP 或 HTTPS;如果是 HTTPS 连接,那么 TLS 加密过程是在边缘服务器上实现。
  • 边缘服务器到实例的连接:使用 HTTP 或 HTTPS 连接,之前的网络是走的 Google 的专线。

不论配置了几个位置的实例,边缘服务器都是使用 Google 全部的边缘服务器。 启用这个功能后,就会得到另一个 Anycast 的 IP 地址,这是个独享的 IP 地址。

什么是 Anycast?Anycast 能够让多个主机使用一个 IP 地址,当用户连接这个 IP 地址的时候,连接到的只是这多个主机中的其中之一,通常会选择最快的线路,能有效的降低延迟,所以很多 DNS/CDN 提供商都使用了 Anycast。

此外,目前使用负载均衡是唯一能让其原生支持 IPv6 的方法。具体可以参见其文档:IPv6 Termination for HTTP(S), SSL Proxy, and TCP Proxy Load Balancing

预留 IPv6 地址的截图

配置方法

建立实例

首先,需要前往到 GCE 后台,建立至少两个不同地区的实例,我专门为测试 Anycast 功能建立了两个新的实例:

为 Anycast 建立的两个实例

每个地区也可以建立多个实例以提高可用性,而我只给每个地区建立了一个实例,这两个实例分别叫 anycast-asia 和 anycast-us。

建立实例组

然后,需要给每个地区的实例建立一个实例组

实例组配置页面

需要注意的是,实例组配置页面中位置里的 “多地区(Multi-zone)” 是指同一个地区(Region)的不同可用区域(Zone),而不是多个不同的地区,所以这实际上是翻译的错误,应该叫做 “多可用区域” 才对。


刚接触云服务的人可能不理解可用区域的概念,可以参考 AWS 的这篇文章来理解。简单点说,地区这个概念就是指离得很远的地区(比如城市之间,如北京和上海),所有在北京的服务器都算北京地区,所有在上海的服务器都算上海地区。但是为了能达到更高的可用性,通常还会在同一个地区设立多个数据中心,也就是可用区域。这些可用区域虽在一个地区中,其之间的距离可能相隔几十甚至几百公里,但这些可用区域之间的距离和不同地区之间的距离相比起来要小得多,所以这些可用区域之间的网络延迟也很低。

设立多个可用区域的意义是:可以能加更高的可用性(主要是为了避免外界因素:比如说火灾等),虽然是异地分布,但是可用区域之间的距离并不远,所以网络延迟可以忽略。

我只给每个地区建立了一个实例,所以我只需要选择 “单地区(Single-zone)”。每个地区都需要建立一个实例组,所以一共需要建立两个(或更多的)实例组。我配置了两个实例组,分别叫 asia-group 和 us-group。

建立负载均衡

完成前两步之后,就需要建立负载均衡的规则了,需要选择 “HTTP(S) 负载平衡” 来实现 Anycast 的功能。

三种负载均衡模式

在负载均衡的配置界面,把这两个实例组都添加到 “后端” 中。 该功能还需要创建一个运行状态检查(相当于监控功能),当主机宕机后能实现切换。

暂时先不开启 CDN 功能保留默认的 “主机路径和规则”目前是需要 HTTP 的例子,如果需要 HTTPS,还需要指定一个证书。

创建成功后,可以看到如下界面,其中的 IP 地址就是 Anycast IP 了。

成功创建了一个 Anycast IP

Nginx 的配置

这里的配置只是为了方便调试,实际使用不用额外修改 Nginx 的配置。 在这两个主机上都安装 Nginx,然后稍微改动默认的配置文件:增加两个 Header,然后 Reload。

add_header X-Tlo-Hostname $hostname always;add_header Cache-Control "max-age=36000, public";

检测是否可用

在测试 Anycast 之前,先测试这两个主机是否存在问题。为了方便阅读,我将 curl 的 IP 地址换为主机名,并省略两个主机都相同的 Header 字段

$ curl anycast-us -IHTTP/1.1 200 OK…ETag: "57ef2cb9-264"X-Tlo-Hostname: **anycast-us**$ curl anycast-asia -IHTTP/1.1 200 OK…ETag: "57ef2b3b-264"X-Tlo-Hostname: anycast-asia

可以看到这两个主机都没有什么问题。然后,我用我的电脑去测试那个 Anycast IP:

$ curl anycast-ip -IHTTP/1.1 200 OK…ETag: "57ef2b3b-264"X-Tlo-Hostname: anycast-asiaAccept-Ranges: bytesVia: 1.1 google

可以看到,这是 anycast-asia 主机响应的。现在我使用另一个在美国的主机继续测试这个 Anycast IP:

$ curl anycast-ip -IHTTP/1.1 200 OK…ETag: "57ef2cb9-264"X-Tlo-Hostname: anycast-usAccept-Ranges: bytesVia: 1.1 google

此时就是 anycast-us 主机响应的,是因为客户端离这个服务器更近。 当通过 Anycast IP 访问时,就可以看到 HTTP Header 中的 Via: 1.1 google 字段。

速度测试

Ping 测试

Ping 测试发现速度很快,看来反代的操作是放在 Google 的边缘服务器上了。速度堪比 Google 啊!

对 Anycast IP 的国外速度测试

中国的速度那更是一流的快,Google 有香港的边缘节点,所以基本上是直接走的香港节点,比原本的连接台湾可用区快不少。(只有部分 IP 段是完全直连的)

对 Anycast IP 的国内速度测试

HTTP GET 测试

在开启 CDN 功能之前,负载均衡器是不会对任何内容缓存的,所以会发现 Connect 的速度很快,但是 TTFB 延迟还是有不少。

对 Anycast IP 进行 HTTP GET 测试

可以预测,如果启用了 HTTPS 功能,其 TLS 所需要的等待时间也会很短,TTFB 时间不变,总时长不会延长太多。

开启 CDN 后进行 HTTP GET 测试

当将 CDN 开启后,负载均衡器就会自动地对静态资源做缓存了,当缓存命中后会显示 Age 字段,这个字段是表示自缓存命中了,后面的数字代表这是多少秒之前缓存的内容。

curl anycast-ip -I
HTTP/1.1 200 OK

Via: 1.1 google
Age: 10

经过多次执行这个指令,会发现有一定几率 Age 字段消失,这可能是流量指到了同一个地区的不同可用区上。但总之,是缓存命中率不高,即使之前曾访问过了。

开启 CDN 后进行 HTTP GET 测试

多次运行测试确保有缓存之后,发现速度似乎并没有太多明显的提升。能够明显的看出改善的是:巴黎和阿姆斯特丹的 TTFB 延迟从 200ms 减少到了 100ms,然而还是不尽人意。可能的原因是:Google 并没有将内容缓存到离访客最近的边缘节点上,而是别的节点上。 CDN 缓存服务器的位置列表

缓存服务器的位置

统计与日志

开启了 Load Balancing 后,就会自动在 Google Cloud Platform 下记录一些信息了。

实时流量查看

在网页后台的 Network,Load balancing,advanced menu 的 Backend service 下,可以查看实时的流量情况:

图形还是很漂亮的

延迟日志

在网页后台的 Stackdriver,Trace 下,可以看到延迟日志:

延迟日志截图 1延迟日志截图 2

这里的延迟包含了网络延迟和服务器响应延迟

总结

GCE 所能实现的 Anycast 功能,只能通过 HTTP 代理(第七层)的方式实现,所以只能代理 HTTP 请求,其他功能(如 DNS)无法实现。所以很多功能受限于负载均衡器的功能(比如证书和 HTTP2 都需要在负载均衡器上配置),然而由于 TLS 加解密过程是在边缘服务器上实现,而且其本身也带有 CDN 功能,所以会比单纯的 Anycast(比如基于 IP 层,或是 TCP/UDP 层)的更快一些。

价格

前五个 Rules $18/月,流量费用相比 GCE 不变,已经被缓存的内容的流量有一点优惠。

对比

Cloudflare

通过使用 Cloudflare 所提供的服务也能实现 Anycast,也是基于第七层的,即将也能实现 Cross-Region Load Balancing 的功能。虽然它还不能根据主机的 CPU 占用率去调整权重(毕竟它拿不到这些数据),却有强大的 Page Rules 功能以及 WAF 功能。 CloudFlare 并不提供独立 IP 地址,不过这不是什么大问题。 由于它属于第三方服务,不受服务提供商的限制,于是就可以给多种不同的服务提供商去做 Anycast 功能;而且无论服务商是否支持,都能够使用。 连接速度上,GCE 的在中国连接速度有明显的优势。

BuyVM

BuyVM 是一家 VPS 提供商,却提供免费的 Anycast 功能,其 Anycast 功能是直接基于 IP 层的 Anycast,所以可以配置 HTTP 之外的各种服务。BuyVM 没有所谓的边缘服务器一说,只能有三个节点,Ping 的结果不像前两家那么快,而且 TLS 过程也是在原本的主机(这三个主机中里用户最近的一个)上进行,也会有一定延迟。 BuyVM 并不提供任何亚洲的主机,所以中国的连接速度也没有比 Cloudflare 快多少,整个亚洲的速度也不是很快。

Google Compute Engine 新手教程及使用体验

By: James Guo
1 October 2016 at 11:00

2017 年 4 月更新:由于 GCE 在国内经常不稳定,本站主机已经换到了 TlOxygen 的虚拟主机上了。 最近想要寻找按流量计费、连接中国速度比较快的 VPS,最终选择了 Google Compute Engine(下文简称 GCE)的亚洲区。GCE 的后台配置页面虽不能在中国访问,但是其 GCE 实例是可以在中国访问的。 创建一个新的 GCE 的流程十分简单,只需要自定义配置、选择操作系统、配置 SSH Key,然后选择创建就好了,整个流程十分像 VPS,但是可自定义的功能却远比 VPS 多。

价格与配置

具体价格请参见官方价格表。(由于有持续使用折扣,每月实际价格比按照每小时更低) GCE 的价格比较亲民,最低配 (f1-micro) 1 共享核-0.6 GB 内存-10GB HDD 每月只需要不到 5 美元,而且由于 CPU、内存大小和磁盘大小都是可调的,所以可以根据自己的需要去购买最适合的,能省去不必要的开销。 而且对于北美的部分机房而言,账户首个最低配 (f1-micro) 实例可以享受到永久免费配额,对于建站而言 (再配合 Cloudflare 使用) 还是很划算的。流量的话对于所有的可用区,连中国大陆 $0.23/Gbyte、美欧地区 $0.12/Gbyte,流量的价格有些小贵,但是如果是连接 Google 自己的服务的话(包括但不限于 Gmail、YouTube),流量不计费(但是流量是双向的,所以是本地通过 GCE 上传完全免费,下载还是原价)。 GCE 还有一点比较特殊的是它是按分钟计费的,当服务处于终止状态(相当于关机,磁盘数据保留)时,不收取费用(除了少量的磁盘使用费用)。每次计算 Uptime 时,如果不到 10 分钟则一律按十分钟算,超过 10 分钟后才是真正的按分钟计费,不过还是很划算了。

关于共享核的实例的补充

f1-micro(0.6 GB)和 g1-small(1.7GB)这两个版本使用的是共享核心(其余配置都是独立核心),根据 Google 的说明,0.60GB 是 0.2 vCPU,1.70GB 是 0.5 vCPU。但是却支持 Bursting,也就是短时间内最高能使用到 1.0 vCPU。 那么 1.0 vCPU 是多少呢?查 cpuinfo,是 Intel(R) Xeon(R) CPU @ 2.50GHz。也就是说这两个版本最高能占用到 2.5GHz。但是假如长时间占用,速度就会压缩到 0.5GHz 和 1.75 GHz。

监控图

我的 f1-micro 装了监控软件,对比 GCE 给的 CPU 占用率(深蓝色)和系统自己监控到的占用率(浅蓝色),发现 GCE 图表上统计的 CPU 占用率正好是本地统计的 5 倍,也就是说如果本地看到的 CPU 占用是 20%,GCE 图表上显示的就正好是 100%,本地为 20100%,GCE 图表上就是 100500%,这时就算作 Bursting 了。 和其他 VPS 对比,其他的 VPS 也几乎都是共享核心,但你却无从判断是否超售。比如有 10 个用户共用一个核心,如果那 10 个人都在不停的占用 CPU,那么你的 CPU 速度会低于单核的十分之一。而 Google 的共享核心,保证了一个最低的速度(0.2 vCPU 和 0.5 vCPU),就算其他用户用的再狠,也能给你保证一定的速度。

使用流程以及配置方法

首先需要前往创建实例的页面,然后进行配置

基础配置

一些基本的配置

其他一些选项配置介绍

  • “抢占”:该模式能够获得更低廉的价格,但是不能用做需要长期保持在线的服务(比如 Web 服务),它最长的使用期限是 24 小时,然而在我的使用中,它有时候不到 1 小时就会被终止使用。它只适合短时间去计算一些东西,计算完后中止它,平常的一般使用不要开启此功能。
  • 自动重启:推荐开启,以获得在云端的好处,以及更好的 Uptime
  • 主机维护期间:推荐选择 “迁移”,原因同上
  • IP 转发:建议关闭,几乎不会用得着此功能,关闭有助于提高安全性
  • SSH:这可能不同于其他一些 VPS,它默认不自动生成用户密码,所以为了远程登录必须配置好公钥私钥。而且所填写的公钥末尾的用户名是有作用的,所填写的用户名就是所需要登录的用户名,默认不支持 root 登陆,除非你将用户名设置成了 root。
SSH 配置截图

防火墙配置

GCE 默认开启了防火墙且不能关闭,只能允许你自己指定的协议和端口的流量;经过我自己的实际测试,GCE 能够自动过滤相当的 DDOS 攻击流量。 由于防火墙不能关闭,所以不能配置类似 IPv6 Tunnel 的服务,所以导致目前的 GCE 是不能够支持 IPv6 的,不过相信以后 Google 还是会启用 IPv6 支持。 在 “网络” 里,可以找到防火墙规则,然后可以添加防火墙规则。 默认已经允许了 SSH 和 ICMP 等(以 default 开头的)

我所启用的所有规则列表SNMP 监控配置

我只需要另一个主机去访问 SNMP 监控,不需要将其公开到互联网上,所以限制了 IP。

用做权威 DNS 服务器的配置

有的 DNS 请求是通过 TCP 发送的,所以需要同样启用 TCP 请求。 如果配置了目标标记,那么就不是默认应用到所有实例的防火墙规则,还需要在实例上配置好同样的标记才可以。

添加上相同的标记

网络——如同 Google 自身一样棒

由于 GCE 是 Google 的,其网络其实也是 Google 的 AS15169,于是不用想也知道连接 Google 旗下的服务会很快,但是实际使用后发现远比我想象的快,GCE 连接 Google 的服务简直就像内网一样。

$ ping google.comPING google.com (74.125.203.102) 56(84) bytes of data.64 bytes from th-in-f102.1e100.net (74.125.203.102): icmp_seq=1 ttl=53 time=0.631 ms64 bytes from th-in-f102.1e100.net (74.125.203.102): icmp_seq=2 ttl=53 time=0.433 ms64 bytes from th-in-f102.1e100.net (74.125.203.102): icmp_seq=3 ttl=53 time=0.330 ms64 bytes from th-in-f102.1e100.net (74.125.203.102): icmp_seq=4 ttl=53 time=0.378 ms64 bytes from th-in-f102.1e100.net (74.125.203.102): icmp_seq=5 ttl=53 time=0.413 ms^C--- google.com ping statistics ---5 packets transmitted, 5 received, 0% packet loss, time 3999msrtt min/avg/max/mdev = 0.330/0.437/0.631/0.103 ms

要是 traceroute 的话就更神奇了:

$ traceroute google.comtraceroute to google.com (64.233.189.113), 64 hops max  1   64.233.189.113  0.826ms  0.313ms  0.435ms

中国目前连接 GCE 亚洲区的速度还算不错,按流量计费,实际测试能够超过 100M 带宽。亚洲区的位置在台湾,中国连接通常会绕香港,然后从香港到台湾这条路线走的是 Google 自己的骨干网,所以最终的结果只是比香港服务器慢了十几毫秒而已。

其他国家连接的话优势就更明显了,Google 的网络实在太强大,无论是亚洲还是欧美,几乎还没有出这个城市/国家就立即跳进 Google 的骨干网络里了,然后 Google 自身的骨干网的选路通常要比运营商的选路要好一些,几乎不会出现绕路的情况。

配置 Anycast

详细内容已在下一篇文章中介绍,通过 Load Balancing 可以分配到一个独立的 IPv4 地址,还能够有原生的 IPv6,支持 CDN 和 HTTPS。Google 的 Anycast 有多快?和 Google 一样快。

内部网络互通

每个实例都有其对应的内网 IP,方便两个主机间建立直接的连接,这个内网 IP 的神奇之处在于:它可以跨可用区使用,包括跨大洲。经过实际测试,使用内网 IP 建立的连接速度会稍快,而且收取的价格(如果是跨州的话)也有优惠。

功能

统计功能

在 GCE 的后台,能够显示长达 30 天的 CPU 利用率、磁盘字节数、磁盘操作字节数、网络字节数、网络数据包量等数据,都能够精确到分钟级别的记录,而且是实时更新的。

快照

你可以为主机增加快照,方便在其他实例中恢复快照,或者用做备份功能。GCE 的快照是增量备份,这意味着如果有两个快照,第二份快照只备份与第一份快照的差异部分。使用这个脚本可以实现自动备份,并且能够实现到期自动删除老备份。

附加硬盘

你可以轻松的添加任意(大于 10 GB)大小的硬盘,有多种磁盘种类可供选择。经过我的测试,如果执行长时间的高 I/O 操作,硬盘读写速度会明显地降低。而且并不一定 SSD 就比 HDD 快,硬盘的大小与吞吐量限制和随机 IOPS 限制呈正相关,也就是说 40G 的 HDD 的速度相当于 10G 的 SSD。

适用场景

低配置的版本用来建站或者是当 “梯子” 都很不错,每月 5 美元的价格还是很吸引人的(做 “梯子” 的一定要注意流量价格!)。已经相当完善的 Web 控制页面可以大大降低使用和学习的门槛。高配置的版本拥有独立 CPU,而且可伸缩性很大。与 Google Cloud 各种功能配合使用,可以搭建大型网站或者游戏服务器

GCE 的一些坑

下面来讲一讲它的一些坑,尤其是从传统 VPS 转到 GCE 会遇到的一些问题。由于 GCE 是基于云端的,所以有很多东西都不太一样。

主机的外网 IP 并不是直接分配的

GCE 虽然是提供独立 IP 的,但是当你执行 ifconfig -a 时,你会看到默认分配的 IP 是一个内网的保留 IP(形如 10.123.0.1),这是为了方便 instance 里之间互相连接的 IP。当你配置一些需要外网的服务要 bind 到指定 IP 时,你只需要 bind 到这个 IP 即可,所分配给你的外网 IP 会自动将流量转发到这个 IP 上。而且,你的主机并不知道那个外网 IP 就是主机本身,所以所有发向主机对应的外网 IP 的流量都会经过一个路由器,然后再由路由器返回,并且会应用防火墙策略。所以,如果需要本地的通讯,建议尽量多使用环回地址(如 127.0.0.1,::1)或那个内网地址。

防火墙

不能关闭的防火墙对于初次接触的人来说可能有些不适,不过一旦习惯后便会爱上这个功能,这个基于在路由器上的防火墙功能要比在 iptables 里做限制更方便。强烈建议利用好防火墙功能,不要默认允许所有端口。比如你的网站流量全部经过 Cloudflare,那么就可以通过防火墙来只允许 Cloudflare 的 IP 与你的主机连接。

不支持多 IP 与 IPv6

GCE 上不能通过加钱的方式去购买多个 IPv4 地址,所以一个实例只能有一个 IPv4 地址,需要多个 IPv4 需求的可以尝试多个实例(或者可以通过 Load Balancing 来实现多个 IP 地址)。 同时,GCE 目前不支持 IPv6,这实在是很可惜的。目前已经可以通过负载均衡器来实现 IPv6

使用免费 Let's Encrypt 实现 ECDSA/RSA 双证书

By: James Guo
21 August 2016 at 10:52

Ubuntu 16.04.01 自带的软件源中的是 Nginx 1.10.0,但是这个版本的 Nginx 的 HTTP/2 模块中存在 Bug,具体见此。现在 Nginx 1.12 Stable 已经推出,直接安装 Stable 版本即可。 2018-06 更新:如果你使用 Ubuntu 18.04 或者是以后的版本,那么系统默认的软件源的 Nginx 版本(1.14)就足够了。

关于双证书,仅建议使用独立 IP 的人去使用,如果没有独立 IP,那么就需要启用 SNI 功能——然而几乎所有支持 SNI 功能的浏览器也都支持了 ECC 证书,所以可以跳过升级步骤,直接换 Let’s Encrypt 的 ECC 证书,不使用 RSA 证书。 我有不止一个服务器,如果都使用自己编译的 Nginx,那么太麻烦了,于是我决定使用添加软件源的方法,通过 apt 升级,方法如下: 首先需要先添加 Nginx mainline 的软件源:

$ sudo add-apt-repository ppa:nginx/stable # sudo apt install software-properties-common$ sudo apt update

然后移除现有 Nginx 并安装新版本:

$ sudo apt remove nginx nginx-common nginx-core$ sudo apt install nginx

安装时可能会询问是否替换原来默认的配置文件,选择 N 即可。 此时安装的 Nginx 已经包含了几乎所有的必要和常用模块,比如包括但不限于 GeoIP Module、HTTP Substitutions Filter Module、HTTP Echo Module。我安装的 Nginx 的 OpenSSL 版本是 1.0.2g-fips,所以并不支持 CHACHA20,想要支持 CHACHA20 只能使用 CloudFlare 的 Patch 然后自己编译。安装完成后就可以验证 Nginx 版本了:

$ nginx -Vnginx version: nginx/1.12.0built with OpenSSL 1.0.2g  1 Mar 2016TLS SNI support enabledconfigure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-DYnRGx/nginx-1.12.0/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-DYnRGx/nginx-1.12.0/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-DYnRGx/nginx-1.12.0/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-DYnRGx/nginx-1.12.0/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-DYnRGx/nginx-1.12.0/debian/modules/ngx_http_substitutions_filter_module

此时,你的服务器就没有 Nginx 的 HTTP/2 bug 了,既然使用了最新版的 Nginx,那么就能够配置 ECDSA/RSA 双证书了。

Nginx 升级的小坑

在我升级的时候,遇到了 GeoIP 模块无法使用的问题,经研究发现是新版本将 GeoIP 改成动态调用模块的方式实现了,在 Nginx 的 http {} 配置中添加下方代码得以解决:

load_module "modules/ngx_http_geoip_module.so";

使用 Let’s Encrypt 签发免费多域名证书

Let’s Encrypt 提供完全面为免费,并且是自动化签发的证书,一张证书最多能签 100 个域名,暂不支持通配。 为了配置双证书,你首先应该签发下来两张证书,以下以 acme.sh 为例,首先先建立目录(以下所有案例均使用 example.com 作为例子,实际使用需自行替换):

$ mkdir -p /etc/letsencrypt$ mkdir -p /etc/letsencrypt/rsa$ mkdir -p /etc/letsencrypt/ecdsa

然后修改 Nginx 配置文件,确保所有在监听 80 端口的都有 location ^~ /.well-known/acme-challenge/ 区块,本配置文件是强制跳转 HTTPS 的案例,这是源站的配置:

server {    listen 80 default_server;    listen [::]:80 default_server;    location ^~ /.well-known/acme-challenge/ {        root /var/www/html;    }    location / {        # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.        return 301 https://$host$request_uri;    }}

在签发之前,确保所有要签发的域名都指向了你自己的服务器! 然后签发 RSA 证书(如果需要多域名证书,只需要多个 -d 即可,下同,不过保存的文件目录以及证书显示名称均为第一个域名):

$ acme.sh –issue –reloadcmd “nginx -s reload” -w /var/www/html -d example.com –certhome /etc/letsencrypt/rsa

然后再签发 ECDSA 证书:

$ acme.sh –issue –reloadcmd “nginx -s reload” -w /var/www/html -d example.com -k ec-256 –certhome /etc/letsencrypt/ecdsa

卸载 acme.sh 自带的 cron,自己重新配置:

$ acme.sh –uninstallcronjob
$ vim /etc/cron.d/renew-letsencrypt

输入以下内容,注意替换 acme.sh 的路径为你安装的绝对路径:

15 02 * * * root /path/to/acme.sh --cron --certhome /etc/letsencrypt/rsa20 02 * * * root /path/to/acme.sh --cron --ecc --certhome /etc/letsencrypt/ecdsa

然后就完成了,证书会自动续签。

给证书添加或删除域名

因为 Let’s Encrypt 使用的不是通配符域名,所以会经常遇到有新的子域的情况,此时就需要给证书添加域名,一张证书最多可以添加 100 个域名。最简单的添加方法如下: 首先,修改证书的配置文件,两个证书的配置文件都要修改:

$ vim /etc/letsencrypt/rsa/example.com/example.com.conf$ vim /etc/letsencrypt/ecdsa/example.com\_ecc/example.com.conf

找到 Le_Alt 一行,将新的域名添加进后面(每个域名用逗号隔开,总共不能超过 100 个)。然后开始重新签发这个证书,需要添加 -f

$ acme.sh --renew -d example.com --certhome /etc/letsencrypt/rsa -f$ acme.sh --renew -d example.com --ecc --certhome /etc/letsencrypt/ecdsa -f

要注意的一点是,目前 Let’s Encrypt 签发的 ECC 证书的中间证书和根证书暂且不是 ECC 证书,这将会在以后支持,详情见 Upcoming Features

配置 Nginx

首先需要生成几个 Key:

$ openssl rand 48 > /etc/nginx/ticket.key$ openssl dhparam -out /etc/nginx/dhparam.pem 2048

然后添加以下内容进 Nginx,放在 http 或 server 区块下,虽然不支持 CHACHA20,但是添加进去也没影响。

### SSL Settings##ssl_certificate /etc/letsencrypt/rsa/example.com/fullchain.cer;ssl_certificate_key /etc/letsencrypt/rsa/tlo.xyz/example.com.key;ssl_certificate /etc/letsencrypt/ecdsa/example.com_ecc/fullchain.cer;ssl_certificate_key /etc/letsencrypt/ecdsa/example.com_ecc/example.com.key;ssl_session_timeout 1d;ssl_session_cache shared:SSL:50m;ssl_session_tickets off;ssl_dhparam dhparam.pem;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';ssl_stapling on;ssl_stapling_verify on;

最后不要忘了 nginx -s reload,然后 前往 SSL Labs 检查配置,可以看到旧的浏览器使用了 RSA 证书(我的服务器有独立 IP,所以无 SNI 支持的也能访问):

支持的客户端

至此,ECDSA/RSA 双证书配置完成,你可以在浏览器里查看到证书类型:

ECDSA 证书

如何配置以实现纯 IPv6-Only 网络访问

By: James Guo
9 August 2016 at 20:32

在今年 5 月 4 日,Apple 就开始要求新的应用程序支持 IPv6 DNS64/NAT64 网络,这意味着苹果开始力推 IPv6 网络,在苹果的官网上就有介绍一些 IPv6 的优势,主要来说就是对移动网络更加友好,并能提高一些性能,减少一些传输上的开销。 最近,我也将我的所有服务器全面部署 IPv6,完全支持 IPv6-Only 网络。

什么是 IPv6-Only 网络 严格上来讲,IPv6-Only 网络下只能连接上 IPv6 地址,这也就意味着 DNS 缓存服务器也必须是 IPv6 地址,只能连接上支持 IPv6 的服务器。如果要解析一个域名,这个域名本身及其所属的根域名的 DNS 服务器也必须统统支持 IPv6。总之,在整个过程中不存在 IPv4。所以想要支持 IPv6-Only 网络,几乎需要在所有的环节下功夫。

使用支持 IPv6 的根域名和 DNS 服务器

为了支持 IPv6,首先你所使用的根域名必须支持 IPv6,好在大多数根域名都支持 IPv6 了。从这里可以看到已经有 98% 的根域名都支持了 IPv6。 一般大家还是喜欢使用第三方的 DNS 而不是去自建,那么这就需要给自己使用支持 IPv6 的 DNS 服务器。好在也有不少 DNS 服务器支持 IPv6 了,比如 CloudFlare、OVH、Vultr、DNSimple、Rage4 等等大多数国外 DNS 解析,哦,除了 Route53;国内目前就见到了百度云加速、sDNS 的 DNS 解析支持,其他常用的 CloudXNS、DNSPod、阿里云等等都不支持。 检测根域名或者是某个域名所使用的 DNS 服务器是否支持 IPv6,只需要执行指令,替换其中的 <domain> 为根域名(如 com)或者任意一级域名(如 example.com):

$ dig -t AAAA `dig <domain> ns +short` +short

然后查看输出的 IP 中是否全是 IPv6 地址,如果什么也没有输出,说明 DNS 服务器不支持 IPv6。 正确配置 IPv6 的例子:

根域名 com 和一级域名 example.com 都正确配置了支持 IPv6 的 DNS 服务器

如果想要自建 DNS 服务器,可以参考自建 PowerDNS 方法。 如果你的根域名不支持 IPv6,那么你可以联系根域名那里让他们去支持,或者换一个根域名。如果你的一级域名不支持 IPv6,那就联系 DNS 解析商让他们支持,或者直接换走。

让网站、API 等服务器支持 IPv6

方案一,直接配置 IPv6

也就是让你自己的服务器支持 IPv6,这需要联系你的服务器提供商,让他们给你分配一个 IPv6 地址,如果还是不支持 IPv6,那么可以使用 IPv6 Tunnel Broker,比如 Hurricane Electric 的免费 Tunnel Broker,这样通常没有服务商给你的原生的 IPv6 好,但是在服务商支持原生 IPv6 之前只能先用着。Tunnel Broker 相当于建立在网络层(第三层)上的代理,需要你的服务器的操作系统支持,而且服务器必须要有一个固定的 IPv4 地址。为了使用它你需要在系统里重新配置网卡(所以共享主机就没戏了),然后就能按照正常方法使用 IPv6 了,简直零成本支持 IPv6。注意,主机到 Tunnel Broker 传输是明文,不过只要应用程序都使用安全的协议(如 HTTPS、SMB、SFTP、SSH),这不是问题。

很可惜,我目前的两个服务器暂时都没有原生的 IPv6 可以用,于是只能用 Tunnel Broker 了,使用后发现虽然是免费的,但是效果也不错:下载时似乎没有限速,我 100M 的独享带宽在原生的 IPv4 上下载速度为 12Mbyte/s,在 IPv6 上还几乎是这个速度。Ping 延迟还是会有一些增加的,主要是因为 Tunnel Broker 的服务器连接到你的服务器会有一些延迟,它相当于一个代理,所以创建时一定要选择离你服务器最近的 Tunnel Broker(延迟最短的),而不是里用户最近的 Tunnel Broker。

注意,强烈不建议国内主机使用 HE 的 Tunnel Broker,原因是中国连接 HE 都会绕道美国,最终会给 IPv6 增加 500ms 的 Ping 延迟,1000ms 以上的 TCP 延迟和好几秒的 HTTPS 延迟。建议国内主机使用方案二。

在服务器支持了 IPv6 后,确保域名上也新设置了 AAAA 记录解析到了 IPv6 地址上。

方案二,上 CDN/HTTP Proxy

刚才所介绍的方案是直接支持,或者使用 Tunnel Broker 建立在网络层的代理。当然还有另一种代理的方式,那就是建立在应用层(第七层)上的,建立在第七层上的其实就是 HTTP Proxy,不过大多数提供 HTTP Proxy 功能的地方都能够缓存静态内容,所以也就是 CDN。 最佳解决方案是直接使用免费的 CloudFlare,然后开启 CDN 功能,这需要更换 DNS 服务器,甚至还可以配置 IPv4 回源,仅使用 IPv6 CDN),不过这样的话连 DNS 在内的所有服务都能支持 IPv6 了,类似的还有 Akamai,它们在代理了之后都能给你 IPv6 支持。 但是如果使用这种方案,原先收集用户真实 IP 的功能就会失效,包括防火墙和 Web 应用程序在内。但只需要配置稍作一些修改,就又能收集访客 IP 了。


在做好了这些配置之后,网站就能够被 IPv6-Only 的网络访问了。然而这只是其中一步,别忘了网站上的 CDN 和域名上的邮件服务还没支持 IPv6 哦,最后,我来列一下:

一些支持 IPv6 的服务列表

CDN

  • CloudFlare
  • Akamai

VPS

  • Vultr
  • Linode
  • DigitalOcean
  • OVH

DNS

注:CDN、VPS 中列出的那几家服务自己都提供了支持 IPv6 的 DNS,在此不再列出(其中 Linode 和 DigitalOcean 所提供的 DNS 服务实际上也是 CloudFlare 的)

  • Rage4
  • Hurricane Electric DNS
  • Route 53
  • Google Cloud DNS

Tunnel Broker

  • Hurricane Electric Tunnel Broker

邮件服务

  • Gmail / G Suit (Gmail for Work)

当你配置好后,你可以在 IPv6 Test 上测试你的网站

测试截图

直至现在,支持 IPv6-Only 网络访问在生产中仍然不是必须的,因为实际上很少存在 IPv6-Only 的网络,一般都兼容 IPv4,很多大网站也完全不支持 IPv6。苹果所说的要求支持 IPv6-Only,只是程序内部要使用 IPv6 通信,程序中不能有 IPv4 地址,能够在只分配了 IPv6 地址的运营商使用(然而实际上这些运营商还是支持 IPv4 的)。

几个 WordPress 的加速建议

By: James Guo
9 June 2016 at 17:36

WordPress 是目前最流行的内容管理系统,本网站正是使用着它。但对于一个全新安装的 WordPress 来说,它的性能并不是很高,当网站的访问量突然增加时,优化性能就显得十分重要了。通过实施以下几个方案,可以大大提升 WordPress 访问速度:

配置缓存

WordPress 是一个动态的系统,如果不配置缓存,每次请求都需要服务器去读取数据库,生成页面内容,对于不同性能的主机,这可能就需要 20ms~1000ms 甚至更慢。如果能够正确配置缓存,就可以明显的加速,并且减少主机的运算资源。

配置页面缓存

使用插件来配置缓存是最简单的方法。在此推荐 WP Super Cache,这是 WordPress.com 出品的缓存插件,就页面缓存来说,功能非常全面,它支持多种缓存模式,包括 mod_rewrite,如果你使用 Nginx,那么可以使用我这个配置文件,这样可以直接跳过 PHP 而直接服务静态文件,页面相应速度有显著提升。 同时,为浏览器返回正确的 Cache-Control 也是十分有必要的,尤其是 CSS 和 JS 文件。

配置对象缓存

对象缓存比页面缓存更灵活,使用范围更广,但速度肯定不如页面缓存。在此推荐 APCu 缓存系统。在 Ubuntu/Debian 安装方法如下:

$ apt install php-apcu

然后重启 Web server,安装 APCu Object Cache Backend 即可。 Redis、Memcached 等都算此类型的缓存,不过 APCu 配置最为简单,速度也很快。

建立分布式缓存系统

比如我的网站使用北美东岸(主要)和亚洲的 VPS,主服务器配置了 Nginx,PHP 和 MySQL;亚洲的服务器只配置了 Nginx。在这些服务器上都配置好缓存,并用 lsyncd 同步缓存内容。每次访问时 Nginx 检查缓存,仅当没有缓存时代理,这样可以大大减少首页面的延迟。

使用 CDN

使用全站 CDN

使用全站 CDN,可以免去在自己的服务器上配置缓存的问题,还可以为服务器增加 HTTPS、HTTP/2 等功能,同时还能过滤非法流量,防御 DDOS(前提是你的 IP 没有被暴露,或者你设置好了白名单)。 除此之外,使用 CDN 后还能更加明显的提高网站加载速度,让访客从中受益。

使用 CloudFlare

CloudFlare 是可以免费使用的,使用 CloudFlare 前需要更改 DNS 服务商,然后无需额外配置就能使用了。但是它只会缓存 CSS、JS 和多媒体文件,不会缓存 HTML 页面,也就是说用户每次访问时还是会返回到原始服务器,页面本身的速度不会有明显提高,在原始服务器上配置缓存也是必要的。

使用 KeyCDN 并配合插件

KeyCDN 是一个按流量使用付费的 CDN 提供商,使用我制作的插件 Full Site Cache for KeyCDN 可以简单的对其配置,这个插件会自动刷新缓存。 KeyCDN 相比 CloudFlare,可以缓存 HTML 页面,大大减少源服务器的压力,同时在刷新缓存时可以通过 Tag 方式刷新,避免不必要的刷新。 在网站访问量较大时,使用 KeyCDN 就能明显的提高速度,缓存命中率也会有很大的提高。

仅资源部份使用 CDN

你可以配置另一个域名,在那个域名上使用 CDN,然后通过插件重写页面地址实现部分 CDN。上文提到的 WP Super Cache 就能配置 CDN,或者使用 CDN Enabler 也能实现部分 CDN 功能。至于 CDN 的选择无所谓,只要支持 Origin Pull(也就是请求回源)就行。

服务器性能

提高服务器本身的性能是最简单的方法,使用更大的内存,更多核心的 CPU 能明显提速。除此之外,提高服务器上应用的性能也很重要:

脚本性能

PHP 脚本的处理速度是 WordPress 的一大瓶颈,使用最新版本的 PHP,可以获得更高的性能,例如 7.0 就比 5.6 快了 3 倍

其次,少用插件能减少 PHP 需要执行的脚本,因为在加载每一个页面时,WordPress 都会加载一遍所有的插件。少量的插件(10个以下)对 WordPress 速度的影响不大,当然也取决于插件本身。

数据库性能

数据库是 WordPress 性能的瓶颈之一,在数据库上优化能提高一定的速度。 一般情况下,如果正确的使用 WordPress,并不需要清理数据库。但可能会有某些插件可能在数据库中创建了太多没用的表,这时服务器的响应速度就会大大降低(约 1~3 倍),推荐使用 WP-Optimize 进行清理。 不是太多的文章数量,是不太会的影响加载速度(1 万篇文章以下速度其实都还能接受,不过你写那么多文章干嘛,质量比数量更重要嘛)。

图片优化

图片占据着网页中很大一部分的大小,同时也关系着用户体验。

图片压缩

对图片压缩不仅可以提高访问时图片加载速度,还能减少服务器带宽 推荐使用免费的 EWWW Image Optimizer,可以在服务器上对图片进行处理。如果你的服务器性能有限,可以使用 Optimus 在线处理,免费版功能十分有限。

响应式图片

对于不同的设备加载不同的图片,比如在手机上加载的图片,就可以比视网膜屏幕的电脑上要加载的图片小的多。使用本站曾经提到过的 srcset 技术可以最简单的实现这个功能,只要你的主题支持就可以了(官方的最新默认主题已经支持),如果主题本身不支持,也可以通过插件实现。

禁用不需要的服务

WordPress 中有一些自带的服务你可能并不需要,禁用它们可以减少页面所需要加载的资源以及服务器需要做的事情。

Emoji 支持

WordPress 支持 Emoji 表情符号,但会因此在页面中引入额外的 CSS,使用这个脚本可以禁用它(如果你不需要的话)。

Google Fonts

Google Font 在国内加载非常慢,而且加载完成之前页面会一直白屏。你可以专门安装 Disable Google Fonts 的插件,或者在下文要提到的 Autoptimize 插件中的设置里禁用它。

Pingback

进入 设置 => 讨论 中可以禁用 “尝试通知文章中链接的博客” 和 “允许其他博客发送链接通知(pingback和trackback)到新文章” 功能(如果你不需要的话)。 此功能并不影响页面加载时间。

减少请求数和页面大小

减少请求数在也一些情况下也能提高加载速度,减少页面大小能缩短下载页面所需要的时间。推荐使用 Autoptimize,它可以 minify CSS、JS 和 HTML,还能 combine CSS 和 JS 以减少请求数。

然而,如果你的博客启用了 HTTP/2 协议,那么减少请求数就没什么必要了,不过为了启用 HTTP/2,必须要使用 HTTPS,所以最终下来是快是慢也不好说。不过还是强烈推荐使用 HTTPS,为了安全,牺牲点速度算什么。

总结

做到上面几点,就能有效提速了,我的网站做到以上几点,在国内无缓存的 Wi-Fi 情况下本网站的时间线如下:

在 1 秒钟内完成包括图片在内的加载

CloudXNS、Route 53、阿里云解析等 DNS 服务的全面对比

By: James Guo
29 May 2016 at 14:43

DNS(域名系统)是因特网的一项服务。它能够将域名指向一个 IP(服务器),这样你就可以通过域名来访问一个网站。能够通过域名访问的网站,都需要一个 DNS 服务器。这里指的是给站长的域名使用的权威 DNS 而并非缓存 DNS。本文包括 CloudXNS、Route 53、Cloudflare、Google Cloud DNS、Rage4 以及阿里云解析的全面对比。

CloudXNS

备注:CloudXNS 不支持 TCP。

国内免费 DNS 中最好用的,作为 DNS 服务来说其功能也算齐全。CloudXNS 的服务器国内有不少,但没有使用 Anycast 技术,所以谈任何国外的服务器都是白搭。

CloudXNS 通过 GeoDNS 对其 NS 服务器的域名进行分区解析,国内的解析到国内服务器,国外的解析到国外服务器。然而其根域名的 Glue Record 中的四个仍是国内的四个服务器,实际解析中会优先使用 Glue Record,所以并不会用上任何国外的服务器。

为什么不将这些国外服务器也添加到 Glue Record 上?因为 Glue Record 并不支持 GeoDNS,所以解析器将会随机选择服务器,所以如果这样的话会导致国内的一部分请求也走到美国服务器,反而减速。

  • 国外速度:★☆☆☆☆,248 ms
  • 北美速度:★☆☆☆☆,272 ms
  • 亚洲速度:★★☆☆☆,196 ms
  • 欧洲速度:★☆☆☆☆,283 ms
  • 国内速度:★★★★☆,32 ms
  • 最短 TTL:60s
  • 国内分区解析:★★★★★,精确到绝大多数的运营商和省
  • 国外分区解析:★★☆☆☆,精确到了大洲和一些国家,而没有城市
  • DNSSEC:不支持
  • IPv6:不支持
  • 记录类型:基本齐全,只支持 A、AAAA、CNAME、NS、MX、TXT、SRV。
  • 根域名 CNAME 优化:不支持
  • 优先级:支持,可以配置解析到不同的服务器的优先级
  • 自定义 NS:不支持,由于它不支持修改根域名下的 SOA 和 NS,所以这是做不到的
  • 价格:免费,按功能收费
  • 用例 A 价格:免费
  • 用例 B 价格:免费
  • 用例 C 价格:免费
  • 统计功能:支持,能精确到国家和省份、运营商
  • SLA:99.9%。(超出防护峰值或账户月解析量时降为98%)

Route 53

国外相当流行的 DNS 服务,必要的那些功能也算齐全。服务器都遍布全球,使用了 Anycast 保证最低的延迟。

  • 国外速度:★★★☆☆,84 ms
  • 北美速度:★★★☆☆,61 ms
  • 亚洲速度:★★★☆☆,79 ms
  • 欧洲速度:★★★☆☆,82 ms
  • 国内速度:☆☆☆☆☆,328 ms
  • 最短 TTL:0s
  • 国内分区解析:★★½☆☆,只能为中国这一个地区作单独设置,不支持省和运营商。若使用 Regional 智能解析,那么可以设置偏向于宁夏和北京的两个服务器。
  • 国外分区解析:★★★★★,精确到了各个国家,众多的国家还精确到了省/市
  • DNSSEC:不支持
  • IPv6:支持
  • 记录类型:更加齐全,支持 A、AAAA、CNAME、NS、MX、TXT、SRV、PTR、SPF、NAPTR、CAA。
  • 根域名 CNAME 优化:不支持
  • 优先级:支持
  • 自定义 NS:支持,同时也可以修改根域名下的 SOA 和 NS
  • 价格:每个域名 $0.5/月,**$0.4/百万**个请求,分区解析 $0.7/百万个请求
  • 用例 A 价格:**$0.90**
  • 用例 B 价格:**$10.50**
  • 用例 C 价格:**$16.50**
  • 统计功能:基本不支持,只有在每月最后结算的账单中看到
  • SLA:100%

Cloudflare

国外占有量相当大的免费 DNS,服务器都遍布全球,使用了 Anycast 保证最低的延迟。

  • 国外速度:★★★★★,13 ms
  • 北美速度:★★★★★,10 ms
  • 亚洲速度:★★★★☆,30 ms
  • 欧洲速度:★★★★★,8 ms
  • 国内速度:★★☆☆☆,193 ms
  • 最短 TTL:120s
  • 国内分区解析:☆☆☆☆☆,完全不支持国内的分区解析,国内的请求一般会被认作美国西岸。
  • 国外分区解析:★★★☆☆,如果购买了 Load Balancing 服务后,可以根据不同的区域配置分区解析。虽然没有按国家和城市区分,但是有时却比国家还精细(比如它支持为北美洲东西中部不同地区作分区解析)
  • DNSSEC:支持,同样支持 DNSSEC 特有的记录,包括 SSHFP、TLSA、DNSKEY、DS
  • IPv6:支持
  • 记录类型:更加齐全,支持 A、AAAA、CNAME、TXT、SRV、LOC、MX、NS、SPF、CERT、NAPTR、SMIMEA、URI
  • 根域名 CNAME 优化:支持
  • 优先级:支持,需要购买了 Load Balancing 服务
  • 自定义 NS:不支持,购买 $200/月的 Business 版本后才能支持
  • 价格:免费
  • 用例 A 价格:免费
  • 用例 B 价格:免费
  • 用例 C 价格:**$20.00**
  • 统计功能:部分支持,免费用户可以看到的统计有限
  • SLA:无(Business 和 Enterprise 版本有 100% 的 SLA 保障)

Google Cloud DNS

价格低廉,提供 100% 的 SLA,使用了 Anycast 保证最低的延迟。

  • 国外速度:★★★☆☆,60 ms
  • 北美速度:★★★☆☆,53 ms
  • 亚洲速度:★★★☆☆,95 ms
  • 欧洲速度:★★★★☆,30 ms
  • 国内速度:★★☆☆☆,171 ms
  • 最短 TTL:0s
  • 分区解析:☆☆☆☆☆,不支持
  • DNSSEC:支持,同样支持 DNSSEC 特有的记录,包括 IPSECKEY、SSHFP、TLSA、DNSKEY、DS
  • IPv6:支持
  • 记录类型:几乎完全齐全,支持 A、AAAA、CNAME、NS、MX、TXT、SRV、SPF、LOC、NAPTR、PTR、CAA 以及上方列出的 DNSSEC 相关记录。
  • 根域名 CNAME 优化:不支持
  • 自定义 NS:支持
  • 价格:每个域名 $0.2/月,**$0.4/百万个请求**。
  • 统计功能:基本不支持,只有在每月最后结算的账单中看到
  • SLA:100%

Rage4

同时支持 DNSSEC 和分区解析,使用了 Anycast 保证最低的延迟。

  • 国外速度:★★★★☆,30 ms
  • 北美速度:★★★★★,18 ms
  • 亚洲速度:★★★☆☆,59 ms
  • 欧洲速度:★★★★☆,26 ms
  • 国内速度:★★☆☆☆,153 ms
  • 最短 TTL:根据套餐情况而定
  • 国内分区解析:★★☆☆☆,只能为亚洲东部为中国配置解析
  • 国外分区解析:★★★★☆,可以根据不同的区域配置分区解析
  • DNSSEC:支持
  • IPv6:支持
  • 记录类型:更加齐全,支持 SOA、NS、A、AAAA、CNAME、TXT、MX、SRV、PTR、SPF、SSHFP、TLSA、LOC、NAPTR
  • 根域名 CNAME 优化:支持
  • 优先级:支持
  • 自定义 NS:支持,同时也可以修改根域名下的 SOA 和 NS
  • 价格:每个域名 €2/月 起,根据功能而非使用量定价
  • 用例 A 价格:€2
  • 用例 B 价格:€10
  • 用例 C 价格:€100
  • 统计功能:支持,能精确到国家
  • SLA:99.99%

阿里云解析

阿里云旗下产品,解析服务器全部使用阿里云机房,有速度保障。按照使用功能而非解析量收费。服务器国内有不少,但没有使用 Anycast 技术,所以国外速度很差。 测速基准:

ns1.alidns.com. 106.11.141.111

阿里云付费版与免费版线路有所不同,付费版含有海外线路,但由于没有 Anycast,所以最终线路是随机选择的,所以付费版与免费版相比,其在国外的响应时间稍短,在国内的解析时间稍长。 备注:阿里云 DNS 不支持 TCP。

  • 国外速度:★☆☆☆☆,238 ms
  • 北美速度:★☆☆☆☆,229 ms
  • 亚洲速度:★★☆☆☆,186 ms
  • 欧洲速度:★☆☆☆☆,251 ms
  • 国内速度:★★★★☆,33 ms
  • 最短 TTL:免费套餐:600s;付费套餐:1~120s
  • 国内分区解析:★★★★★,免费版支持运营商,付费版支持地域解析
  • 国外分区解析:★★★☆☆,免费版仅支持海外,付费版可以支持到洲、国家
  • DNSSEC:不支持
  • IPv6:不支持
  • 记录类型:支持 A、AAAA、CNAME、NS、MX、TXT、SRV。其中 CAA 仅限付费版。
  • 根域名 CNAME 优化:不支持
  • 优先级:支持
  • 自定义 NS:不支持
  • 价格:免费,按功能收费
  • 用例 A 价格:免费
  • 用例 B 价格:免费
  • 用例 C 价格:免费
  • 统计功能:仅限付费版
  • SLA:99.95%

TL-PA500 电力猫,部署无线局域网集群

By: James Guo
15 January 2016 at 22:49

电力猫就是一个能够让家中的电线代替网线,实现拿电缆代替网线的数据传输,解决家中没有布全网线的问题。当然,如果有网线,那就不需要它了。 TL-PA500 标称是 500M 的电力适配器,由于家中网线并没有覆盖到所有的位置,于是就买了 3 个。我有 3 个 AirPort 基站,其中一个(AirPort Express)放在了弱电箱中,直接接入网线,并作拨号连接,并接出一个网线连接电力猫。然后在另两个位置接入电力猫,并连上另外两个 AirPort 基站。实现三个 AirPort 基站有线连接,让全家 Wi-Fi 信号满格。

AirPort 集群截图

其实,在 TL-PA500 的说明书中,写明了它的网线端口为 10/100Mbps 端口,也就是说它根本无法达到 100M 以上的速度…… 其实我并不相信这个电力猫真的能达到 500M 的速度,于是我对其进行了测试,在连接另一个 AirPort 基站(无线)的情况下,拷贝一个 3 GB 的文件到 AirPort Time Capsule。并在直接连接 AirPort Time Capsule (无线)情况下拷贝,对比时间,两个基站距离约 15m。 特别要注意的是,另一个基站(AirPort Extreme)是不支持 802.11ac 的,而 AirPort Time Capsule 是支持的。二者都支持 5GHz 频段,拷贝时都使用了它。 经过了电力猫之后,传输这个 3GB 的文件消耗了 8 分钟,大约达到了 50M 的速度,没有达到 802.11n 在 5GHz 下的极限。 直接传输,消耗了 2 分 20 秒,大约是 170M。 所以,经过了电力猫之后,传输速度被限制在了 50M 左右(但或许是用了网线也是这个速度),这个速度还是可以接受的,因为中国地区普遍的网速都没有达到这个极限,用来部署互联网还是完全可行的。 然而最终还是重新走了暗线,全家局域网终于达到 1000M,可算是够用了。

如何解决某些国内网站、app疯狂上传的问题?

By: fengooge
27 July 2023 at 14:16
我们在访问国内的网站尤其是看视频的时候,会发现一个现象,有时候上传流量会突然飙升,有服务在进行疯狂上传。最典型的例子是抖音,一人刷抖音,全家上网都遭殃(网络卡顿)。为什么会这样呢?以腾讯视频为例,当我们打开腾讯视频的网站或应用观看视频时,一般情况下,我们是从腾讯的服务器下载视频资源,这些下载的流量,腾讯是需要向电信运营商付费的(当然个人的宽带也是付了钱的)。腾讯为了省钱,就将每个用户的腾讯视频应用甚至浏览器弄成一个小型的缓存站。当其他用户观看视频的时候,就可以不用从腾讯自己的服务器下载视频,而是从被当作缓存站的个人用户那里。不止腾讯,国内几乎所有的视频网站都这样搞,看视频时都会霸道地疯狂上传,上传流量、上传网速是下载的几倍、十几倍是常有的事。这样做确实给腾讯这样的视频服务提供商省了大笔的钱,但却给用户带来了诸多麻烦:首先,不加节制地上传会阻塞下载,最直接的例子就是上面说的,当家庭网络有人

计算机网络通讯的【系统性】扫盲——从“基本概念”到“OSI 模型”

18 March 2021 at 21:15
  近期老是在写政治博文,又有两个月左右没写技术博文了。某些技术型的读者,背地里肯定骂俺太懒。今天搞了一篇内容特别长,信息量特别多的。喜欢看技术博文的读者,可以慢慢消化。

★本文的目标读者


  今天这篇的标题是“扫盲”,也就是说:即使那些完全不懂 IT 领域,也不懂通讯领域的读者,依然能看懂(至少能看懂一部分)。为了做到这点,俺会尽量使用通俗的比喻,并适当加一些示意图。
  另外,就算你已经比较了解网络通讯领域,本文中提到的某些部分,也可能是你所不知道的。也就是说:懂行的同学,看看此文,也会有帮助。
  本文的标题特地强调了【系统性】——俺希望这篇教程能帮助读者对“计算机网络”这个领域进行系统性学习(何为“系统性学习”?请看这篇教程
  为了做到【系统性】这个目的,这篇教程很长。俺开博12年,这篇的长度估计能排到前5名。建议大伙儿慢慢看,不要着急。


★基本概念


  为了足够通俗,俺先要介绍一些基本概念。

◇信道(channel


  这是通讯领域非常基本的概念,肯定要先聊聊它。
  通俗地说,信道就是“传送信息的通道”。

◇信道的类型


  首先,信道可以从广义上分为“物理信道 & 逻辑信道”。
  顾名思义,“物理信道”就是直接使用某种【物理介质】来传送信息;至于“逻辑信道”——是基于“物理信道”之上抽象出来的玩意儿(待会儿讲到“协议栈”的时候再聊)。

◇信道的带宽


  “带宽”指的是:某个信道在单位时间内最大能传输多少比特的信息。
  请注意:
  电气领域 & 计算机领域都有“带宽”这个概念,但两者的定义不太一样。电气领域所说的“带宽”指的是“模拟带宽”,单位是“赫兹/Hz”;计算机领域所说的“带宽”指“数字带宽”,单位是“比特率”或“字节率”。
  后续章节提到“带宽”,都是指计算机领域的术语。

◇带宽的单位——容易把外行绕晕


  “比特率”或“字节率”很容易搞混淆。用英文表示的话——大写字母 B 表示【字节】;小写字母 b 表示【比特】。

  由于带宽的数字通常很大,要引入“K、M、G”之类的字母表示数量级,于是又引出一个很扯蛋的差异——“10进制”与“2进制”的差异。
  【10进制】的 K 表示 1000;M 表示 1000x1000(1百万)
  【2进制】的 K 表示 1024(2的10次方);M 表示 1024x1024(2的20次方)
  为了避免扯皮,后来国际上约定了一个规矩:对【2进制】的数量级要加一个小写字母 i。比如说:Ki 表示 1024;Mi 表示 1024x1024 ...... 以此类推。
  举例:
  1Kbps 表示“1000比特每秒”
  1KiBps 表示“1024字节每秒”

◇信道的工作模式:单工 VS 半双工 VS 全双工


  再来说说信道的工作模式。大致可以分为如下三种。为了让大伙儿比较好理解,俺对每一种都举相应的例子。

  单工(simplex)
  比如“电台广播”就是典型的【单工】。“电台”可以发信号给“收音机”,但“收音机”【不能】发信号给“电台”。

  半双工(half-duplex)
  比如“单条铁路轨道”,就是典型的【半双工】。火车在单条铁轨上,可以有两种运行方向;但对于同一个瞬间,只能选其中一个方向(否则就撞车了)。

  全双工(full-duplex)
  比如“光纤”就是典型的【全双工】。在同一根光导纤维中,可以有多个光束【同时相向】传播,互相不会干扰对方。

◇端点


  为了叙述方便,俺把参与通讯的对象(主体)称作“通讯端点”,简称“端点”。
  这里的“端点”是广义的,可以是硬件(比如某个网卡),也可以是软件(比如某个应用程序)。

◇单播、组播/多播、广播、选播


  对于“网络通讯”,至少得有 N 个端点参与,并且【N ≥ 2】才有意义。
  当 N 个端点构成一个网络,这时候就会涉及到“单播、组播、广播”这几个概念。
  通俗地说:
单播(unicast)——发送给网络中的指定的【单个】端点
组播/多播(multicast)——发送给网络中的指定的【多个】端点
广播(broadcast)——发送给网络中的【所有】端点
选播(anycast)——发送给网络中随机选择的【单个】端点

◇通讯协议(protocol)


  所谓的“通讯协议”就是:参与通讯的各方所采用的某种【约定】。只有大家都遵守这个约定,才有可能相互传递信息。
  打个比方:如果两个人要用自然语言交流,前提是:双方使用相同(或相互兼容)的自然语言。
  “通讯协议”就类似某种自然语言,参与通讯的多个端点,都必须能理解这个语言。


★从“分层”到“参考模型”


◇分层


  在聊“分层”之前,先说说“分工”。比如在一个公司中,通常设有不同的工种/岗位,这就【分工】。
  对于网络通讯也是如此,不太可能用一种通讯协议完成所有的信息传递任务(注:对于特别简单的网络,或许有可能只用单一协议;但如今的网络通讯已经很复杂,用【单个】通讯协议包办所有事情,已经不太可能)
  一旦采用了多种通讯协议,这几种协议之间,该如何配合捏?
  在网络通讯领域,采用的是【分层】的设计思路。多个层次的协议在一起协同工作,技术上称作“协议栈”(洋文叫做“protocol stack”)。

◇协议栈的原理


  对于多层次的协议栈。每个层次都有各自的“端点”(进行通讯的主体)。处于【同一层次】的两个端点会使用该层次的协议进行通讯(注:同一个层次的协议,可能只有一个,也可能有多个)。
  除了最顶层,每个层次的端点会向其【直接】上层提供“服务”;除了最底层,每个层次的端点会调用【直接】下层提供的“服务”(这里所说的“服务”指某种“编程接口”,技术行话叫 API)。

不见图 请翻墙
(“协议栈”的示意图)

不见图 请翻墙
(“服务”与“协议”之间的关系)

◇逻辑信道


  (前一个小节说了)每个层次会向上一个层次提供服务(API 调用)。对上层而言,调用下层提供的 API 发送信息,其效果相当于在使用某种【信道】进行通讯,这也就是俺在 ★基本概念 那个章节所说的“逻辑信道”。

不见图 请翻墙
(“逻辑信道”示意图)

◇数据格式的原理


  大部分协议会把要传送的数据切割为 N 份,每一份就是一个数据包。
  通常来说,数据包的格式有如下三部分:
头部
身体(也称作“有效载荷”)
尾部(注:很多协议没有尾部)
  如果你收过快递,可以把“网络数据包”与“快递包裹”作一个对照——
数据包的“头/尾”,就类似于快递包裹的【包装袋】。数据包的“身体”,就类似于快递包裹里面的东西。

  对于【相邻】两层的协议,【下】层包含【上】层。也就是说:下层协议的【载荷】就是上层协议的【整体】。
  还是以快递举例:
  假设你从网上买了一台笔记本电脑。电脑出厂时,电脑厂商肯定会提供一个包装盒。快递公司在寄送这台笔记本的时候,又会在笔记本的盒子外面再加一个包装袋。对应到网络协议——“快递公司的包装袋”相当于【下层】协议;“电脑厂商的包装盒”,相当于【上层】协议。

不见图 请翻墙
(上下层协议的格式及包含关系)

◇网络分层的参考模型


  上述所说的“分层 & 协议栈”只是一个抽象的(笼统的)思路。具体要分几层?每一层要干啥事儿?这些都是很有讲究滴!网络技术发展了几十年,已经有很多牛人提出了各种不同的划分方案,称之为“网络分层的参考模型”(为了打字省力,以下简称“模型”)。
  在各种模型中,名气最大的当然是“OSI 模型”(洋文称作“OSI model”)。在后续的章节中,俺会以这个模型为主体,进行介绍。
  除了“OSI 模型”还有一个很出名的模型是“TCP/IP 模型”(因为互联网很成功,它才跟着出名)。
  对“TCP/IP 模型”的分层,不同的文章或书籍,说法不太一样(“3层、4层、5层”皆有),这就引发了一些争议。包括几位热心读者也在博客留言,表达不同意见。为了避免一家之言,贴出维基百科的“这个链接”,其中给出了几种比较有名的说法。
  另外,俺想提醒一下:
  由于本文是基于【OSI 模型】进行展开。对于 TCP/IP 模型到底算几层,这方面的争论【不】影响本文后续的内容。


★OSI 概述


◇OSI 的历史


  “OSI”的全称是“Open System Interconnection”。先说说它的历史。
  上世纪70年代,“国际电信联盟”(ITU)想对各国的电信系统(电话/电报)建立标准化的规格;与此同时,“国际标准化组织”(ISO)想要建立某种统一的标准,使得不同公司制造的大型主机可以相互联网。
  后来,这两个国际组织意识到:“电信系统互联”与“电脑主机互联”的性质差不多。于是 ISO 与 ITU 就决定合作,两家一起干。这2个组织的2套班子,从上世纪70年代开始搞,搞来搞去,搞了很多年,一直到1984年才终于正式发布 OSI 标准。

◇OSI 标准的两个组成部分


  严格来讲,OSI 包括两大部分——
其一,抽象的概念模型,也就是前面提到的【OSI model】;
其二,针对这个概念模型的具体实现(具体的通讯协议),洋文叫做【OSI protocols】。

  (前面说了)OSI 是由 ISO & ITU 联手搞出来滴。这两个国际组织里面的人,要么是来自各国的电信部门,要么是来自各国的高校学者。总而言之,既有严重的官僚风气,又有明显的学究风气。(正是因为这两种风气叠加,所以搞了很多年,才搞出 OSI)
  OSI 的协议实现(OSI protocols),不客气地说,就是一堆垃圾——据说把 OSI protocols 所有的协议文档,全部打印成 A4 纸,摞起来得有一米多高!是不是很吓人?协议搞得如此复杂,严重违背了 IT 设计领域的 KISS 原则
  由于 OSI protocols 实在太复杂,后来基本没人用。但 OSI model 反而广为流传,并且成为“网络分层模型”中名气最大,影响力最广的一个。
  因此,本文后续章节中,凡是提到 OSI,指的是【OSI model】。

◇OSI 模型的7层


  OSI 模型总共分7层,示意图参见如下表格:
层次中文名洋文名
第7层应用层Application Layer
第6层表示层Presentation Layer
第5层会话层Session Layer
第4层传输层Transport Layer
第3层网络层Network Layer
第2层数据链路层Data Link Layer
第1层物理层Physical Layer
(注:为了打字省力,在后续章节把“数据链路层”直接称为“链路层”)

  考虑到本文是针对一般性读者的【扫盲教程】,俺重点聊第1~4层。搞明白这几个层次之后,有助于你更好地理解网络的很多概念,也有助于你更好地理解很多信息安全的概念。
  网上已经有很多关于 OSI 的文章,可惜大部分写得粗糙——很多文章只是在照抄定义。
  俺曾经写过一篇《学习技术的三部曲:WHAT、HOW、WHY》,其中提到【理解技术】的不同层次。要想更好地理解 OSI 模型,你得搞明白:为啥需要引入某某层?(请注意:这是一个 WHY 型的问题)
  接下来在讨论 OSI 的每个层次时,俺都会专门写一个小节,谈该层次的【必要性】。搞明白【必要性】,你就知道为啥要引入这个层次。


★物理层:概述


◇物理层的必要性


  通俗地说:直接与物理介质打交道的层次,就是物理层。这一层的必要性比较明显。
  因为所有的通讯,归根结底都要依赖于【物理介质】。与物理介质打交道,需要牵涉到很多与【物理学】相关的东东。比如:“无线电通讯”需要关心“频率/波长”;电缆通讯需要跟“电压”打交道;“光纤通讯”需要关心“玻璃的折射率&光线的入射角” ......
  “物理层”的主要职责是:屏蔽这些细节,使得“物理层”之上的层次不用再去操心物理学。

◇物理信道的类型


  何为“物理信道”,在本文开篇的“基本概念”已经提到了。
  对于“物理信道”,还可以进一步细分为如下三大类:
1. 有线信道(比如:双绞线、同轴电缆、光纤、等等)
2. 无线信道(比如:微波通讯、电台广播、卫星通讯、等等)
3. 存储信道

  “存储信道”比较少见,很多人没听说过,稍微解释一下。
  假设你要把一大坨信息传送给另一个人,除了用“有线 or 无线”这两种通讯方式,还可以把信息先保存到某种【存储介质】(比如硬盘),然后再把存储介质用某种方式(比如快递)转交给对方。这就是所谓的“存储信道”。

信噪比(Signal-to-noise ratio)


  俺在很多篇关于“学习&心理学”的博文中提到过【信噪比】这个概念。其实这个概念是从通讯领域借用的术语。
  对于“物理信道”,总是会存在某些环境干扰,称之为“噪声”(Noise)。“信道传输的有用信息”与“无用的干扰噪声”,这两者的比值就是“信噪比”。
  “信噪比”单位是【分贝】。“分贝”洋文叫做“decibel”(简写为 dB)。“deci”表示“十进制”;“bel”是为了纪念大名鼎鼎的贝尔(电话它爹)。

◇带宽的限制因素


  “物理信道”要依赖于物理传输介质。不管使用何种物理介质,都要受限于某些基本的物理学定律(比如“光速上限”)。另外,不管何种物理介质,总是会有或多或少的环境干扰(噪声)。这两个因素导致了:任何“物理信道”的最大传输率总是有限滴。
  由于物理层是最底下的一层,物理层之上的其它层次总是要直接或间接地依赖【物理信道】。因此,其它层次建立的“逻辑信道”,其带宽只会比“物理信道”的最大带宽更小。换句话说:“物理信道”的带宽上限也就是整个协议栈的带宽上限。

多路复用(Multiplexing)


  一般来说,凡是能实现【长距离】通讯的“物理信道”,都有相当的经济成本。比如铺设“光纤、同轴电缆”都要花钱。无线电通讯虽然免去了铺设线路的成本,但需要竞标购买频段。因此,物理信道非常强调“多路复用”。
  所谓的“多路复用”,通俗地说就是:尽可能地共享物理信道,不要浪费了。
  “多路复用”有很多种类型;不同的类型,原理也不同。为了展示各种不同的原理,俺拿【无线通信】来说事儿。
  无线通信领域的“多路复用”,【至少】有如下几种:

  频分多路复用/FDM(Frequency-Division Multiplexing)
  这个最简单,就是根据频率拆分。不同的线路占用不同的频段,互不干扰。(电台广播用的就是这个思路)
  但这个思路的缺点很明显——
其一,要依赖足够宽的频段(频段是稀缺资源);
其二,不同线路的流量可能会动态变化。如果某个线路空闲,其占用的频段就浪费了。
  (注:光纤通讯中有个“波分多路复用/WDM”,本质上就是 FDM)

  时分多路复用/TDM(Time-Division Multiplexing)
  这种思路只用一个很窄的频段。为了在同一个频道发送多个信道,采用【分时机制】,把时间切割成很小的时间片,每个线路占用一个时间片。周而往复。
  这个思路有点像十字路口的红绿灯——每隔一段时间,其中一条路可以通行。
  这个思路的优点是:可以只使用一个很窄的频段。缺点是:线路越多,每条线路等待越久;即使某个线路空闲,依然会占用时间片(浪费了资源)。

  码分多路复用/CDM(Code-Division Multiplexing)
  这种思路采用某种【编码】的技巧,使得多个端点可以在同一个时间点使用同一频段发送数据;由于他们采用不同的编码方式,不会相互干扰。
  一般来说,CDM 要依赖于“扩频技术”(spread spectrum),需占用一个比较宽的频道范围。这算是缺点。但其优点很明显——
其一,可以支持 N 个线路(N 动态变化);
其二,即使任何一个线路的流量动态变化,也不会浪费物理信道的资源。
  显然,这种思路明显优于 FDM & TDM。如今在移动通讯领域大名鼎鼎的 CDMA(码分多址),采用的就是这个思路。


★物理层:具体实例


◇物理层的【协议】


  物理层的协议主要有如下:
USB 协议
蓝牙协议的一部分
IEEE 802.11 的一部分(Wi-Fi)
IEEE 802.16(WiMAX)
IEEE 1394(火线接口)
RS-232 协议(串行接口/串口)
......
(考虑到篇幅)俺不可能具体细聊这些协议,只是贴出每个的维基百科链接,感兴趣的同学自己点进去看。

◇物理层的【协议实现】


  对于电脑主机(含移动设备),“网卡硬件”包含了物理层的协议实现(参见如下示意图)
  另外,还有一些专门的【1层】网络设备,也提供物理层的功能(参见下一个小节)。

不见图 请翻墙
(OSI 模型中,不同层次的协议实现)

◇物理层相关的【网络设备】


  调制解调器(modem)
  通俗地说,“调制解调器”就是用来翻译“数字信号 & 模拟信号”。
  在发送信息时,modem 把电脑要发送的“字节流”(数字信号)翻译成“模拟信号”,然后通过物理介质发送出去;当它从物理介质收到“模拟信号”,再翻译成“数字信号”,传回给电脑。
  早期的拨号上网,modem 面对的物理介质是“固话线路”;如今家庭宽带普及,光纤入户,modem 面对的物理介质是“光纤线路”。

不见图 请翻墙
(老式 modem,用于固定电话线路)

  中继器(repeater)
  信号在物理介质中传输,会出现【衰减】(不论是“有线 or 无线”都有可能衰减)。“中继器”的作用是【信号增益】,使得信号能传得更远。
  另外,比如“微波通讯”是直线传播,而地球表面有弧度,还有地形的起伏。所以每隔一定距离要建“微波塔”。这玩意儿也相当于“中继器”。

不见图 请翻墙
(微波塔示意图)

  集线器(hub)
  可以把“集线器”视作更牛逼的“中继器”——“中继器”只有两个口(只能连接两个通讯端点),而“集线器”有多个口(同时连接多个通讯端点)。
  通常所说的“集线器”是指“以太网集线器”。这种设备如今已经逐步淘汰,很少见到了。

不见图 请翻墙
(老式的10兆以太网集线器)

  另外,很多同学应该都用过“USB hub”,就是针对 USB 线的“集线器”(“USB 线”也可以视作某种通讯介质)。


★链路层:概述


◇链路层的必要性


  对信息的打包
  物理层传输的信息,通俗地说就是【比特流】(也就是一长串比特)。但是对于计算机来说,“比特流”太低级啦,处理起来极不方便。“链路层”要干的第一个事情,就是把“比特流”打包成更大的一坨,以方便更上层的协议进行处理。在 OSI 模型中,链路层的一坨,称之为“帧”(frame)。

  差错控制
  物理介质的传输,可能受到环境的影响。这种影响不仅仅体现为“噪声”,有时候会出现严重的干扰,导致物理层传输的“比特流”出错(某个比特“从0变1”或“从1变0”)。因此,链路层还需要负责检查物理层的传输是否出错。在 IT 行话中,检测是否出错,称之为“差错控制机制”(后面有一个小节会简单说一下这个话题)。

  流量控制
  假设两个端点通过同一个物理信道进行通讯,这两个端点处理信息的速度可能不同。如果发送方输出信息的速度超过接收方处理信息的速度,通讯就会出问题。于是就需要有某种机制来协调,确保发送方的发送速度不会超出接收方的处理速度。在技术行话中,这称之为“流量控制”,简称“流控”。

  信道复用
  在上一个章节已经讲到:用于远距离通讯的“物理介质”,总是有成本。因此需要对物理信道进行“多路复用”,就会导致多个端点共用同一个物理信道。如果同时存在多个发送者和多个接收者。接收者如何知道某个信息是发给自己而不是别人?
  另外,某些物理介质可能不支持并发(无法同时发送信息)。某些物理介质可能是【半双工】,所有这些物理层的限制,都使得“多路复用”变得复杂。为了解决这些问题,链路层需要提供了某种相应的机制(协议),术语叫做“介质访问控制”(洋文是“Media Access Control”,简称 MAC)。后续小节会聊它。

◇差错控制


  为了发现传输的信息是否出错,设计了很多相应的数学算法。这些算法大体分为两类:“检错算法 & 纠错算法”。
  简而言之,“检错算法”只能检测出错误,而“纠错算法”不但能检测出错误,还能纠正错误。很显然,“纠错算法”更牛逼,但是它也更复杂。
  常见的“检错算法”对传输的数据计算出一个【校验值】,接收方收到数据会重新计算校验和,如果算出来不对,就把收到的数据丢弃,让对方重发。“校验算法”的原理类似于《扫盲文件完整性校验——关于散列值和数字签名》一文中提到的“散列算法/哈希算法”。
  “纠错算法”更高级,由于涉及到更多数学,俺就不展开啦。
  对于【无线】物理信道,由于出错的概率更高,并且重新传输数据的成本也更高。所以【无线】通讯的链路层协议,更倾向于用【纠错】机制;作为对比,【有线】通讯的链路层协议,更倾向于用【检错】机制。

MAC 协议


  “MAC 协议”用来确保对下层物理介质的使用,不会出现冲突。为了形象,俺拿“铁路系统”来比喻,说明“MAC 协议”的用途。
  假设有一条【单轨】铁路连接 A/B 两地。有很多火车想从 A 开到 B,同时还有很多火车想从 B 开到 A。
  首先,要确保不发生撞车(如果已经有车在 A 开往 B 的途中,那么 B 就不能再发车);其次,即使是同一个方向的车,出发时间也要错开一个时间间隔。
  所有这些协调工作,都是靠“MAC 协议”来搞定。

◇MAC 地址


  为了完成上述任务,光有“MAC 协议”还不够,还需要为每一个端点引入【惟一的】标识。这个标识就称作“MAC 地址”。
  通俗地说,每个网卡都内置了一个“MAC 地址”。这个地址是网卡在出厂的时候就已经设置好的,并且用某种机制确保该地址【全球唯一】。

  如何保证 MAC 地址全球唯一捏?简单说一下:
  MAC 地址包含6个字节(48个比特),分为两半。第一部分称作【OUI】,OUI 的24个比特中,其中2个比特有特殊含义,其它22个比特,用来作为网卡厂商的唯一编号。这个编号由国际组织 IEEE 统一分配。
  MAC 地址第二部分的24比特,由网卡厂商自己决定如何分配。每个厂商只要确保自己生产的网卡,后面这24比特是唯一的,就行啦。
不见图 请翻墙
(MAC 地址的构成)

  由于俺在很多安全教程中鼓吹大伙儿使用“操作系统虚拟机”,再顺便说说【虚拟网卡】的 MAC 地址。
  “虚拟网卡”是由【虚拟化软件】创建滴。IEEE 也给每个虚拟化软件的厂商(含开源社区)分配了唯一的 OUI。因此,虚拟化软件在创建“虚拟网卡”时,会使用自己的 OUI 生成前面24个比特;后面的24比特,会采用某种算法使之尽可能【随机化】。由于“2的24次方”很大(224 = 16777216),碰巧一样的概率很低。
  (注:如果手工修改 MAC 地址,故意把两块网卡的 MAC 地址搞成一样,那确实就做不到唯一性了。并且会导致链路层的通讯出问题)


★链路层:具体实例


◇链路层的【协议】


  链路层的协议主要有如下:
MAC 协议(介质访问控制)
LLC 协议(逻辑链路控制)
ARP 协议(解析 MAC 地址)
IEEE 802.3(以太网)
IEEE 802.11 的一部分(Wi-Fi)
L2TP 协议(2层VPN)
PPP 协议(拨号上网)
SLIP 协议(拨号上网)
......
(考虑到篇幅)俺不可能具体细聊这些协议,只是贴出每个的维基百科链接,感兴趣的同学自己点进去看。

◇链路层的【协议实现】


  对于电脑主机(含移动设备),“网卡硬件 & 网卡驱动”会包含链路层协议的实现(参见如下示意图)。
  另外,还有一些专门的【2层】网络设备,也提供链路层的功能(参见下一个小节)。

不见图 请翻墙
(OSI 模型中,不同层次的协议实现)

◇链路层相关的【网络设备】


  网络交换机(network switch)
  (注:一般提到“网络交换机”,如果不加定语,指的就是“2层交换机”;此外还有更高层的交换机,在后续章节介绍)
  为啥要有交换机捏?俺拿“以太网的发展史”来说事儿。
  以太网刚诞生的时候,称之为“经典以太网”,电脑是通过【集线器】相连。“集线器”前面提到过,工作在【1层】(物理层),并不理解链路层的协议。因此,集线器的原理是【广播】模式——它从某个网线接口收到的数据,会复制 N 份,发送到其它【每个】网线接口。假设有4台电脑(A、B、C、D)都连在集线器上,A 发数据给 B,其实 C & D 也都收到 A 发出的数据。显然,这种工作模式很傻逼(低效)。由于“经典以太网”的工作模式才“10兆”,所以集线器虽然低效,还能忍受。
  后来要发展“百兆以太网”,再用这种傻逼的广播模式,就不能忍啦。于是“经典以太网”就发展为“交换式以太网”。用【交换机】代替“集线器”。
  交换机是工作在2层(链路层)的设备,能够理解链路层协议。当交换机从某个网线接口收到一份数据(链路层的“帧”),它可以识别出“链路帧”里面包含的目标地址(接收方的 MAC 地址),然后只把这份数据转发给“目标 MAC 地址相关的网线接口”。
  由于交换机能识别2层协议,它不光比集线器的性能高,而且功能也强得多。比如(稍微高级点的)交换机可以实现“MAC 地址过滤、VLAN、QoS”等多种额外功能。

  网桥/桥接器(network bridge)
  “交换机”通常用来连接【同一种】网络的设备。有时候,需要让两台不同网络类型的电脑相连,就会用到【网桥】。
  下面以“操作系统虚拟机”来举例(完全没用过虚拟机的同学,请跳过这个举例)。
  在这篇博文,俺介绍了虚拟机的几种“网卡模式”,其中有一种模式叫做【bridge 模式】。一旦设置了这种模式,Guest OS 的虚拟网卡,对于 Host OS 所在的外部网络,是【双向】可见滴。也就是说,物理主机所在的外部网络,也可以看见这块虚拟网卡。
  现在,假设你的物理电脑(Host OS)只安装了【无线网卡】(WiFi),而虚拟化软件给 Guest OS 配置的通常是【以太网卡】。显然,这是两种【不同】的网络。为啥 Guest OS 的以太网卡设置为“bridge 模式”之后,外部 WiFi 网络可以看到它捏?
  奥妙在于——虚拟化软件在内部悄悄地帮你实现了一个“网桥”。这个网桥把“Host OS 的 WiFi 网卡”与“Guest OS 的以太网卡”关联起来。WiFi 网卡收到了链路层数据之后,如果接收方的 MAC 地址对应的是 Guest OS,网桥会把这份数据丢给 Guest OS 的网卡。
  这种网卡模式之所以称作“bridge 模式”,原因就在于此。

◇链路层相关的【软件工具】


  嗅探抓包工具(Sniffer)
  要了解链路层的数据包结构,需要用到“嗅探工具”。这类工具能捕获流经你网卡的所有【链路层】数据包。前面聊“协议栈”的时候说过:下层数据包的载荷就是上层数据包的整体。因此,拿到【链路层】数据包也就意味着:你已经拿到2层之上的所有数据包的信息了。
  有些抓包工具自带图形界面,可以直接显示数据包的内容给你看。还有些只提供命令行(只是把获取的数据包保存为文件),然后要搭配其它图形化的工具来展示数据包的内容。
  抓包的工具有很多,名气最大的是 Wireshark(原先叫做 Ethereal)。

  ARP 命令
  首先,ARP 是“MAC 地址解析协议”的洋文名称。该协议根据“IP 地址”解析“MAC 地址”。
  Windows 自带一个同名的 arp 命令,可以用来诊断与“MAC 地址”相关的信息。比如:列出当前子网中其它主机的 IP 地址以及对应的 MAC 地址。这个命令在 Linux & Mac OS 上也有。


★网络层:概述


◇网络层的必要性


  路由机制(routing)
  在 OSI 模型中,链路层本身【不】提供路由功能。你可以通俗地理解为:链路层只处理【直接相连】的两个端点(注:这么说不完全严密,只是帮助外行理解)
  对于某个复杂网络,可能有很多端点,有很复杂的拓扑结构。当拓扑足够复杂,总有一些端点之间【没有直连】。那么,如何在这些【没有直连】的端点之间建立通讯捏?此时就需要提供某种机制,让其它端点帮忙转发数据。这就需要引入“路由机制”。
  为了避免把“链路层”搞得太复杂,路由机制放到“链路层”之上来实现,也就是“网络层”。

  基于【路由】的地址编码方式
  链路层已经提供了某种全球唯一的地址编码方式(MAC 地址)。但“MAC 地址”有如下几个问题:
其一,它是固定的(虽然可以用技术手段去修改 MAC 地址,但很少这么干)
其二,MAC 地址的编码是基于【厂商】,无法体现网络拓扑结构。或者说,“MAC 地址”对于“路由机制”是不够友好滴。
  因此,需要引入一种更抽象(更高层)的地址,也就是“网络层地址”。咱们常说的“IP 地址”,是“网络层地址”的实现方式之一。

  为了帮你理解,举个例子:
  每个人都有身份证号(这就类似于“MAC 地址”)。当某人加入了某个公司,公司会为此人再分配一个“员工号”(这就类似于“网络地址”)。既然有身份证号,为啥公司还要另搞一套“员工编号”捏?因为“员工编号”有额外的好处。比如说:可以把员工号划分为不同的区间,对应不同的部门。这样一来,只要看到员工号,就知道此人来自哪个部门。
  类似道理,每个网卡都有自己固定的 MAC 地址,当这个网卡接入到不同的网络,每次都可以再分配不同的“网络地址”。通过“网络地址”可以看出这个网卡属于哪个网络(对路由比较方便)。

  网际互联(internetwork
  引入“网络层”的另一个目的是:屏蔽不同类型的网络之间的差异,从而有利于【网际互联】(也就是建立“网络的网络”)。
  一般来说,要想联通【异种】网络,就要求每个网络中都有一台主机充当【网关】(gateway)。【网关】起到“中介/翻译”的作用——帮不同的网络翻译协议,使得不同的网络可以互相联通。
  假设【没有】统一的网络层,网关的工作就很难做。就好比说:如果全球没有某种通用的自然语言,就需要培养非常多不同类型的翻译人才(假设有30种主要语言,任意两种互译,就需要几百种不同的翻译人才)。
  反之,如果有了某种统一的网络层标准,问题就好办多了(还是假设有30种主要语言,只要选定某种作为通用语,然后培养29种翻译人才,就可以实现任意两种语言互译)。
  如今的互联网时代,【IP 协议】就是那个充当统一标准的网络层协议。

不见图 请翻墙
(互联网整合了各种类型的网络)

◇网络拓扑(network topology)


  网络的拓扑结构有很多种,有简单的,有复杂的。一般来说,再复杂的拓扑,也可以逐步分解为若干简单拓扑的组合。
  对拓扑的研究,有专门一个数学分支(拓扑学)。考虑到本文只是扫盲,俺不可能再去聊“拓扑学”。因此,只挑几种简单的拓扑结构,让大伙儿有个直观的印象。

不见图 请翻墙
(常见的网状拓扑结构:星形拓扑、环形拓扑、总线拓扑、网状拓扑、等等)

  如今的互联网,整体的拓扑结构超级复杂。但还是可以逐步分解为上述几种基本的拓扑结构。

不见图 请翻墙
(互联网的复杂拓扑,右下角是图中某个小点的放大。
为节省大伙儿的翻墙流量,俺贴的是缩小图。点“这里”看原始图)

◇互联网的拓扑——从“历史”的角度看其健壮性


  从上面那张图可以看出:互联网拓扑的【局部】有很多是“星形拓扑”(当然也有其它的)。但从【宏观】上看,更像是“网状拓扑”。
  在现实生活中,对于复杂结构,通常都会采用“树状层次结构”,以便于管理。比如:域名系统、公司组织结构、官僚系统 ...... 那为啥互联网的【宏观】拓扑结构是“网状”捏?这就要说到互联网的历史。

  在上世纪50年代(冷战高峰期),美国军方的指挥系统高度依赖于电信公司提供的电话网络。当时的电话网络大致如下——
在基层,每个地区有电话交换局,每一部电话都连入当地的交换局。
在全国,设有若干个长途局,每个交换局都接入某个特定的长途局(不同地区的交换局通过长途局中转)。
  简而言之,当时美国的电话网络是典型的【多级星形拓扑】。这种拓扑的优点是:简单、高效、便于管理;但缺点是:健壮性很差。从这个案例中,大伙儿可以再次体会到“效率”与“健壮性”之间的矛盾。俺写过一篇很重要的博文(这里)深入讨论了这个话题。
  话说1957年的时候,苏联成功试射第一颗洲际弹道导弹(ICBM),美国军方开始担心:一旦苏联先用洲际导弹攻击美国,只要把少数几个长途局轰掉,军方的指挥系统就会瘫痪。也就是说,“长途局”已经成为美国军方的【单点故障】(何为“单点故障”?参见这篇博文)。
  1960年,美国国防部找来大名鼎鼎的兰德公司进行咨询,要求提供一个应对核打击的方案。该公司的研究员 Paul Baran 设计了一个方案,把“星形拓扑”改为【网状拓扑】。采用【网状拓扑】的好处在于:即使发生全面核大战,大量骨干节点被摧毁,整个网络也不会被分隔成几个孤岛,军方的指挥系统依然能正常运作。

不见图 请翻墙
(左边:互联网诞生前——美国的电话网络  右边:兰德公司的“Baran 方案”)

  有了兰德公司的方案,美国军方找到当时最大的电信公司 AT&T,想要实现这个系统,结果被否决了。AT&T 高层认为:搞这样一种系统根本不切实际。于是 Baran 的方案中途夭折。
  为啥 AT&T 反对这个方案捏?一方面,成功的大公司总是有很强的思维定势(关于这点,参见这篇文章);另一方面,Baran 的设计方案确实很超前——其前瞻性不仅包括“拓扑结构”,而且把当时电信行业的几大核心观念完全颠覆掉了(具体如何颠覆,后续章节还会再聊)。
  时间一晃又过了好多年,到了60年代末,由于一系列机缘巧合,英国佬发现了“Baran 方案”的价值,并据此搞了一个小型的 NPL 网络(NPL 是“国家物理实验室”的缩写)。然后在某次 ACM 会议上,美国佬看到英国佬的论文,才意识到:Baran 方案完全可行。经历了“出口转内销”的命运之后,该方案重新被美国国防部重视。之后,(国防部下属的)“高级计划研究局”(ARPA)开始筹建“阿帕网”(ARPANET),才有了如今的互联网。

◇路由的大致原理


  聊完“拓扑”,再来聊“路由”。
  当主机 A 向主机 B 发送网络层的数据时,大致会经历如下步骤:
1.
A 主机的协议栈先判断“A B 两个地址”是否在同一个子网(“子网掩码”就是用来干这事儿滴)。
如果是同一个子网,直接发给对方;如果不是同一个子网,发给本子网的【默认网关】。
(此处所说的“网关”指“3层网关/网络层网关”)
2.
对于“默认网关”,有可能自己就是路由器;也可能自己不是路由器,但与其它路由器相连。
也就是说,“默认网关”要么自己对数据包进行路由,要么丢给能进行路由的另一台设备。
(万一找不到能路由的设备,这个数据就被丢弃,于是网络通讯出错)
3.
当数据到达某个路由器之后,有如下几种可能——
3.1
该路由器正好是 B 所在子网的网关(与 B 直连),那就把数据包丢给 B,路由过程就结束啦;
3.2
亦或者,路由器会把数据包丢给另一个路由器(另一个路由器再丢给另一个路由器) ...... 如此循环往复,最终到达目的地 B。
3.3
还存在一种可能性:始终找不到“主机 B”(有可能该主机“断线 or 关机 or 根本不存在”)。为了避免数据包长时间在网络上闲逛,还需要引入某种【数据包存活机制】(洋文叫做“Time To Live”,简称 TTL)。
通常会采用某个整数(TTL 计数)表示数据包能活多久。当主机 A 发出这个数据包的时候,这个“TTL 计数”就已经设置好了。每当这个数据包被路由器转发一次,“TTL 记数”就减一。当 TTL 变为零,这个数据包就死了(被丢弃)。

  对于某些大型的复杂网络(比如互联网),每个路由器可能与其它 N 个路由器相连(N 可能很大)。对于上述的 3.2 情形,它如何判断:该转发给谁捏?
  这时候,“路由算法”就体现出价值啦——
一般来说,路由器内部会维护一张【路由表】。每当收到一个网络层的数据包,先取出数据包中的【目标地址】,然后去查这张路由表,看谁距离目标最近,就把数据包转发给谁。
  上面这段话看起来好像很简单,其实路由算法挺复杂滴。考虑到本文是“扫盲性质”,而且篇幅已经很长,不可能再去聊“路由算法”的细节。对此感兴趣的同学,可以去看《计算机网络》的第5章。

◇路由算法的演变史(以互联网为例)


  (技术菜鸟可以跳过这个小节)
  由于互联网的 IP 协议已经成为“网络层协议”的事实标准,俺简单聊一下互联网的路由机制是如何进化滴。

  第1阶段:静态全局路由表
  (前面说了)互联网的前身是“阿帕网/ARPANET”。在阿帕网诞生初期(上世纪70年代),全球的主机很少。因此,早期的路由表很简单,既是“全局”滴,又是“静态”滴。简而言之,每个路由器内部都维护一张“全局路由表”,这个“路由表”包含了全球所有其它路由器的关联信息。每当来了一个数据包,查一下这张全局路由表,自然就清楚要转发给谁,才能最快到达目的地。
  早期的阿帕网,主机的变化比较少,也很少增加路由器。每当出现一个新的路由器,其它路由器的管理员就手工编辑各自的“全局路由表”。
  为了加深大伙儿印象,特意找来两张70年代初的阿帕网拓扑图(注:图中的 IMP 是“Interface Message Processor”的缩写,也就是如今所说的“路由器”)。

不见图 请翻墙
(1973年的阿帕网)

不见图 请翻墙
(1977年的阿帕网)

  第2阶段:动态全局路由表
  后来,“阿帕网/互联网”的规模猛增,路由器数量也跟着猛增,隔三差五都有新的路由器冒出来。再用“静态路由表”这种机制,(编辑路由表的)管理员会被活活累死。于是改用“动态路由表”,并引入某种“路由发现机制”。但“路由表”依然是【全局】滴。

  第3阶段:动态分级路由表
  再到后来,全球的路由器越来越多,成千上万,再搞“全局路由表”已经不太现实了——
一方面,“全局路由表”越来越大(查询的速度就越来越慢)
另一方面,由于互联网的流量越来越大,每来一个数据包都要查表,查询越来越频繁。
  于是,路由器开始吃不消了。为了解决困境,想出一个新招数:引入“分级路由”(hierarchical routing)。所谓的“分级路由”就是:把整个互联网分为多个大区域,每个大区域内部再分小区域,小区域内部再分小小区域 ...... 看到这里,熟悉“数据结构与算法”的同学就会意识到——这相当于构造了一个【树状】层次结构。
  有了这个层次结构,每个路由器重点关注:自己所在的那个最小化区域里面的网络拓扑。如此一来,每个路由器的“路由表”都会大幅度减小。

不见图 请翻墙
(全局路由表 VS 分级路由表)

◇互联网的路由——从“CAS”的角度看其健壮性


  去年(2020)俺写了一篇博文《“政治体制”与“系统健壮性”——基于“复杂性科学”的思考》,其中介绍了“CAS”(复杂自适应系统)的概念。互联网的路由机制,就是一个典型的 CAS。
  如果把互联网视作一个系统,每个公网上的路由器都是一个自适应的主体。假如某个地区的网络流量突然暴涨,骨干网路由器会自动分流;假如因为地震或战争,导致某个地区的骨干网路由器全部下线,周边地区的路由器也会自动避开这个区域 .....
  所有这些工作,【不需要】依靠任何最高指挥中枢,去进行协调。
  相反,如果互联网的路由系统中,设立了某种“中央委员会”进行实时调度,那互联网早就完蛋了,根本无法成长为今天这种规模。

◇网络层的两种交换技术——电路交换(circuit switching) VS 分组交换(packet switching


  (技术菜鸟可以跳过这个小节)
  前面聊“互联网诞生”,说到兰德公司的“Baran 方案”。该方案对当时的电信系统提出几大革命性的变化,其中之一就是“分组交换”技术(也称“数据包交换”or“封包交换”)。
  一般来说,网络层的设计有两种截然不同的风格:【电路交换 VS 分组交换】。有时候也分别称之为“有连接的网络层 VS 无连接的网络层”。此处所说的“连接”指的是某种“虚电路”(洋文叫做“virtual circuit”,简称 VC)。

  要理解“虚电路”,首先要从老式的电话系统说起。
  最早期的电话,既没有拨号盘也没有按键,全靠一张嘴。当你拿起电话,先告诉接线员你要打给谁,接线员会用一根跳接线,插入电话交换设备的某个插孔,从而把你的电话机与对方的电话机相连。于是建立了一条两人之间的电话通路,也就是“电路”。你可以把“接线员”想象成某种“人肉路由器” :)

不见图 请翻墙
(1900年法国巴黎的电话交换局,可以看到接线员在操作电话交换设备)

  后来发明了“自动电话交换机”,导致“接线员”全体下岗。虽然自动化了,但原理还是一样——当你在电话上拨了某人的号码,电话局的交换机会自动选择一条线路。只有当这条线路建立起来,对方的电话才会响。一旦双方开始通话,双方之间的语音都是通过这条线路传输。并且这条线路是独占的——只要通话不挂断,这条线路就不会再分配给其他人使用。

  前面提到“互联网诞生的历史”,当时军方推动的“Baran 方案”被 AT&T 断然拒绝。因为这个方案完全颠覆了传统的电话系统——
颠覆之1:把“模拟信号”颠覆为“数字信号”(这点比较好理解,俺就不解释了)
颠覆之2:把“星形拓扑”颠覆为“网状拓扑”(关于这点,前面的小节已经讨论了)
颠覆之3:把“电路交换”颠覆为“分组交换”(这就是本小节的重点)

  为了帮大伙儿理解上述第3点,举个例子:
  假设主机 A 要向主机 B 发送一大坨数据。因为数据太多,肯定要分成好几坨小一点的(分成多个数据包)。如何把这些数据包发送给对方捏?

  “电路交换”的实现方式
在发送数据之前,要先建立连接通道(通过路由算法,找出 A & B 之间的某条通路)。这条通路就是所谓的“虚电路/VC”。一旦 VC 建立,每一个数据包都是从这条拓扑路径进行路由。

  “分组交换”的实现方式
在发送数据之前,【不需要】建立通道,让每个数据包独立进行路由。这种情况下,这几个数据包可能会走【不同的】拓扑路径。因此,数据包到达的顺序与发送的顺序【不一定】相同。接收方收到所有数据包之后,还要自己进行排序。
  维基百科上有一个 GIF 动画(这个链接),比较直观地演示“分组交换/封包交换”的效果。由于这个动画稍微有点大(超过 1MB),俺就不贴到博文中了。

  当时的电话系统主要承载语音传输,“电路交换”显然性能更高。那为啥 Baran 的设计要采用“分组交换”捏?俺又要再次提到【效率 VS 健壮性】之间的矛盾与均衡。
  对于“电路交换”,一旦建立连接,同一个连接的所有数据都走相同的路径(会经过完全相同的路由器)。也就是说,传输的过程中,如果某个路由器挂掉了(网络掉线 or 硬件当机 or 软件崩溃)。那么,该路由器正在处理的 N 个连接全都要报废。而“分组交换”则更加灵活——即使某个路由器挂掉了,后续的数据包会自动转向另外的路由器,损失很小。
  “Baran 方案”之所以采用“分组交换”的设计,因为人家这个方案是提交给军方用来应对【全面核战争】滴,当然要考虑健壮性啦。

  话说这两种交换机制,各有很多支持者,并分裂为两大阵营,分别是:“电信阵营 VS 互联网阵营”。两大阵营的口水战持续了 N 年,都无法说服对方。到了后来设计 OSI 模型的时候,为了保持中立性与通用性,OSI 模型本身并没有强制要求网络层采用哪一种风格。
  经过几十年之后,咱们已经可以看出来:“互联网阵营”占据主导地位。如今,连电信系统都是架构在互联网之上。


★网络层:具体实例


◇网络层的【协议】


  网络层的协议有很多。由于“互联网”已经成为全球的事实标准,因此俺只列出属于“互联网协议族”的那些“网络层协议”:
IP 协议(含 IPv4IPv6
ICMP
IGMP
IPSec
......
(考虑到篇幅)俺不可能具体细聊这些协议,只是贴出每个的维基百科链接,感兴趣的同学自己点进去看。
  对上述这些协议,最重要的当然是 IP 协议。如果你想要深入了解 IP 协议,可以参考如下这本书。关于 IP 协议的书,此书的影响力最大。这本书共3卷,通常只需看第1卷。
TCP-IP 详解

◇网络层的【协议实现】


  对于电脑主机(含移动设备),网络层的协议实现通常包含在操作系统自带的网络模块中(也就是“操作系统协议栈”)。具体参见如下示意图。
  另外,还有一些专门的【3层】网络设备,也提供网络层的功能(参见本章节的后续小节)。

不见图 请翻墙
(OSI 模型中,不同层次的协议实现)

◇IP 地址的格式及含义


  当年设计阿帕网的时候,采用了【4字节】(32比特)来表示“网络层地址”(也就是 IP 地址)。
  “IP 地址”的含义很重要,俺有必要解释一下:
  咱们平时所说的 IP 地址,采用【点分十进制】来表示。就是把地址的4个字节,先翻译为十进制,然后每个字节用一个小数点分隔开(参见如下示意图):
不见图 请翻墙
(4字节 IP 地址:“二进制”与“点分十进制”的对照示意图)

  “IP 地址”的32比特,分为两部分:第1部分用来标识【子网】,第2部分用来标识该子网中的【主机】。
  这两部分各占用多少比特,是不确定的。在这种情况下,“操作系统协议栈”如何知道哪些比特标识“子网”,哪些比特标识“主机”捏?奥妙在于【子网掩码】。所以,大伙儿在给系统配置 IP 地址的时候,通常都需要再设置一个【子网掩码】,就这个用途。

◇IP 地址枯竭,及其解决方法


  前一个小节提到:IP地址包含【4字节】(32比特)。因此,最多只能表示【2的32次方】(42亿左右)的不同地址。考虑到还有很多地址保留给特殊用途,实际可用地址远远不到42亿。
  到了如今,全球网民都已经几十亿了,IP 地址开始枯竭。咋办捏?为了解决这个问题,发展出若干技术手段。简单说一下最常见的几种手段:

  IPv6
  名气最大(最多人知道)的技术手段,大概是 IPv6 了。这招想要一劳永逸地解决地址枯竭的问题,采用了16字节(128比特)来表示 IP 地址。
  设计 IPv6 的人自豪地宣称:即使给地球上的每一粒沙子分配一个 IPv6 地址,依然绰绰有余(确实没有吹牛,“2的128次方”是天文数字)。
  但 IPv6 的缺点在于,【无法】向下兼容原有的 IP 协议(原有的协议叫“IPv4”)。IPv6 的普及一直比较慢,这是主要原因。

  代理服务器(proxy)
  一看到代理,很多人就想到翻墙。其实它也可以用来解决“地址枯竭”的问题。
  比如说,某个公司有100人,100台电脑。如果每台电脑都分配公网 IP 地址,就要消耗100个公网地址(太浪费啦)。
  可以只申请一个公网 IP,然后在内网搞一个代理服务器,公网 IP 分配给它(代理服务器有两个网卡,一个接内网,一个接公网)。然后在其它电脑上设置代理,指向这台代理服务器,就都可以上外网啦。
  (注:在本文的末尾有一个 ★杂项 的章节,会专门聊一下“代理”这个话题)

  网络地址转换(NAT)
  前面 proxy 那招有个缺点:内网的每台电脑里面的每个上网软件,都要单独设置代理。实在太麻烦啦!
  后来就发明了某种更牛逼的招数——网络地址转换(洋文是“Network Address Translation”,简称 NAT)。
  用了这招,还是只要申请一个公网 IP,分配给内网的网关(网关有两个网卡,一个接内网,一个接公网)。然后在内网的网关配置 NAT 功能,自动就可以让内网的每台电脑访问外网。
  在这篇博文,俺介绍了虚拟机的几种“网卡模式”,其中有一种模式叫做【NAT 模式】,就是指这个玩意儿。
  采用了 NAT 技术之后,可能会对某些应用软件(尤其是 P2P 类型的)造成兼容性问题,于是又发明了一些“NAT 穿透技术”(NAT traversal)。这类技术有好几种,如果有空的话,俺会单独写教程介绍。

  其它解决方法
  关于“IPv4 地址空间耗尽”,解决方法肯定不止上面这几招。限于篇幅,就此打住。更多的讨论参见维基百科的“这个链接”。

◇网络层相关的【网络设备】


  路由器(router)
  (前面章节聊“路由原理”的时候,已经介绍过它;这里就不再浪费口水啦)

  3层交换机(Layer 3 switching)
  “3层交换机”是在“2层交换机”的基础上,增加了对网络层的处理。因此,它可以做到类似路由器的效果——在几个子网之间转发数据。
  与路由器的差别在于——“3层交换机”链接的几个子网是【同种】网络;而路由器可以连接【异种】网络。
  从上面这句话看,“3层交换机”的能力显然不如“路由器”。既然已经有“路由器”,为啥还要发明“3层交换机”捏?这就要说到【单臂路由器】的弊端。
  对于企业内网的“2层交换机”,通常都支持 VLAN 功能。通俗地说:可以在交换机中划分多个【虚拟子网】。其实这些子网的中所有的电脑,都还是接入这台交换机,只不过这些子网配置了不同的网络地址。对于同一个 VLAN 内部的通讯,“2层交换机”自己就可以搞定(只需要用到2层协议);但对于【跨】VLAN 主机之间的通讯,“2层交换机”就没戏啦(它没有路由功能)。因此,就必须在它旁边外加一个路由器,形成如下拓扑结构。在这个拓扑中,路由器只与单个设备(2层交换机)相连,所以称之为“单臂”。
  请注意:如下示意图只画了两台电脑,位于两个 VLAN。实际上可能有很多个 VLAN,每个里面有几十台电脑。于是,交换机与路由器之间的传输通道就会成为瓶颈——【跨】VLAN 的任意两台电脑通讯,数据包都要到路由器那里兜一圈。为了消除这种瓶颈,才发明了“3层交换机”——把路由功能直接集成到交换机内部。

不见图 请翻墙
(“单臂路由器”的拓扑结构)

  无线热点(Wireless Access Point)
  “无线热点”通常用来提供无线接入,使得某个【无线】设备能接入到某个【有线】网络中。一般来说,热点都内置了路由功能,那么它就是“无线路由器”,对应到“3层”(网络层)。反之,如果没有路由功能,它就是“网桥”,属于“2层”(链路层)。

◇网络层相关的【软件工具】


  ping
  这个命令,很多人应该都知道。早在 Win9x 就有这个命令了。它使用(网络层的)ICMP 协议来测试某个远程主机是否可达。
  提醒一下:
  如果 ping 命令显示某个 IP 地址不可达,有很多种情况。比如说:
这个 IP 地址对应的主机已经关机
这个 IP 地址对应的主机已经断线
这个 IP 地址对应的主机拒绝响应 ICMP 协议
从你本机到这个 IP 地址之间,有某个防火墙拦截了 ICMP 协议
......

  traceroute
  这是一个通用的工具,用来测试路由。很早以前的 Windows 就已经内置了它,命令是 tracert。在 POSIX(Linux&UNIX)上通常叫 traceroute
  你可以用这个命令,测试你本机与互联网另一台主机之间的路由(也就是:从你本机到对方主机,要经过哪些路由器)


★传输层:概述


◇传输层的必要性


  屏蔽“有连接 or 无连接”的差异
  (上一个章节提到)网络层本身已经屏蔽了【异种网络】的差异(比如“以太网、ATM、帧中继”之间的差异),而且网络层也屏蔽了路由的细节。但网络层本身还有一个差异,也就是网络层的两种交换技术:电路交换(有连接) VS 分组交换(无连接)。
  前面章节也提到了:上述两种交换技术各有很多支持者,并分裂为两大阵营。当年设计 OSI 模型的时候,为了保持中立性与通用性,并没有强制规定“网络层”必须采用何种交换机制。
  对于开发网络软件的程序员来说,当然不想操心“网络层用的是哪一种交换机制”。因此,需要对网络层的上述差异再加一个抽象层(也就是“传输层”)。

  从“主机”到“进程”
  前面介绍的“网络层”,其设计是面向主机(电脑)。“网络层地址”也就是某个主机的地址。
  而“传输层”是面向【进程】滴!因为传输层要提供给【网络软件】使用,而网络软件打交道的对象是【另一个网络软件】。因此,传输层必须在“网络层地址”的基础上,再引入某种新的标识,用来区分同一台主机上的不同【进程】。

◇传输层的特殊性


  在 OSI 7层模型中,传输层正好居中。这是一个很特殊的位置。
  OSI 模型最下面3层,与【网络设备】比较密切。这里面所说的“网络设备”,既包括那些独立的主机(比如“路由器、交换机、等”),也包括电脑上的硬件(比如“网卡”)。
  OSI 模型最上面3层,与【网络软件】比较密切(或者说,与“用户的业务逻辑”比较密切)。
  而中间的传输层,正好是承上启下。对于开发应用软件的程序猿/程序媛,“传输层”是他们能感知的最低一层。

◇传输层的【端口】


  刚才谈“传输层的必要性”,提到说——“网络层地址”只能标识【主机】,而传输层必须要能标识【进程】。为了达到这个目的,于是就引入了“传输层端口”这个概念(为了打字省力,后续讨论简称为“端口”)。
  在 OSI 模型中,“端口”的官方称呼是“传输服务访问点”(洋文缩写 TSAP)。但是作为程序员,俺已经习惯于“端口”这个称呼。后续介绍依然用“端口”一词。
  当程序员使用传输层提供的 API 开发网络软件时,通常把“端口”与“网络地址”一起使用(构成“二元组”),就可以定位到某个主机上的某个进程。


★传输层:具体实例


◇传输层的【协议】


  为了让程序员可以更爽地使用传输层来开发网络软件,传输层既要提供“有连接”的风格,也要提供“无连接”的风格。关于这两种风格的对比,前面已经聊过,这里不再浪费口水。
  具体到“互联网协议族”,有两个主要的传输层实现,分别是 TCP & UDP(前者是“有连接”,后者是“无连接”)。
  除了 TCP & UDP,“互联网协议族”还提供了其它一些传输层协议。因为比较冷门,俺就不介绍啦。

◇传输层的【协议实现】


  对于电脑主机(含移动设备),传输层的协议实现通常包含在操作系统自带的网络模块中(也就是“操作系统协议栈”)。具体参见如下示意图。
  另外,还有一些专门的【4层】网络设备,也提供传输层的功能(参见后续的小节)。

不见图 请翻墙
(OSI 模型中,不同层次的协议实现)

◇套接字(socket API)


  前面说了:传输层是面向程序员(让他们可以更方便地开发网络软件)。因此,就需要提供一些封装传输层的【库】(API)。程序员只需要调用这些【库】,就可以使用传输层的协议进行通讯啦。
  影响力最大的传输层封装库,当然是 socket API。它来自加州大学伯克利分校。
  在互联网诞生初期,伯克利分校开发了一个 UNIX 操作系统的的变种,叫做“伯克利 UNIX 发行版”(BSD Unix),也就是如今 BSD 操作系统的前身。伯克利发行版内置了一套用来进行网络编程的 API,当时叫做“伯克利套接字”(Berkeley sockets)。由于这套 API 用起来很方便,很多其它的 UNIX 变种也移植了这套 API,于是就逐渐成了业界的事实标准。到了上世纪90年代,Windows & Linux 也都提供了这套 API。
  由于大部分读者不是程序员,“套接字”这个话题就到此为止。如果你是个程序员,并且对网络编程感兴趣,可以参考俺的电子书清单,其中有一个分类目录是【IT 类 / 软件开发 / 网络相关】。

◇传输层相关的【网络设备】


  4层交换机(Layer 4 switching)
  前面已经介绍了“3层交换机”,“4层交换机”是其进一步的改良,可以识别传输层的协议,获取 TCP or UDP 的端口号。
  有了这个能力,网管就可以在这种交换机上配置一些管理策略。比如说:(根据传输层端口号)过滤掉某种流量,或者对某种流量设置转发的优先级。

  状态防火墙(stateful firewall
  网络防火墙分好几种,大部分属于这种。它能完全处理 TCP 协议的状态,显然它属于“4层”(传输层)。

◇传输层相关的【软件工具】


  netcat 家族——传输层的“瑞士军刀”
  关于 netcat,俺已经写过一篇比较详细的教程:《扫盲 netcat(网猫)的 N 种用法——从“网络诊断”到“系统入侵”》。看完这篇教程,你肯定能体会它功能的强大——很多与 TCP/UDP 相关的事情,都可以用 netcat 搞定。
  另外,netcat 还有很多衍生品(衍生的开源项目),构成一个丰富的 netcat 家族。在上述教程也有介绍。

  netstat & ss
  Windows 和 POSIX(Linux&UNIX)都有一个 netstat 命令,可以查看当前系统的 TCP/UDP 状态(包括当前系统开启了哪些监听端口)。
  另外,Linux 上还有一个 ss 命令,功能更强(但这个命令在 Windows 上默认没有)

  nmap
  这是最著名的开源的扫描器,可以扫描远程主机监听了哪些传输层端口(注:前面提到的“netcat 家族”也可以干这事儿)
  nmap 的功能很强,“端口扫描”只是其功能之一。


★业务层(OSI 上三层):概述


  一不小心,这篇教程已经写了这么长。为了照顾那些有“阅读障碍”的读者,俺要稍微控制一下篇幅,就把 OSI 的【上三层】合在一起讨论。
  前面的章节说过:【上三层】更接近于“网络软件”,对应的是应用软件的业务逻辑,因此俺统称为“业务层”。
  注:有些书(比如《计算机网络》)会把 OSI 的上三层统称为“应用层”。由于 OSI 模型中本来就有一个“应用层”,俺认为这样容易搞混(尤其不利于技术菜鸟),所以另外起了一个“业务层”的名称。

◇业务层的必要性


  业务层显然是必要滴。因为传输层位于操作系统,它不可能去了解网络软件的业务逻辑。为了让网络软件能够相互通讯,肯定要在传输层之上再定义更高层的协议。
  问题在于:网络软件千奇百怪,其业务逻辑各不相同,因此,“业务层如何设计”,【无】一定之规。有些软件只用一个协议来搞定所有的业务逻辑(只有一层);有些软件会参考 OSI,把业务逻辑的协议分为三层;还有些软件可能会分出更多的层次。
  再强调一下:业务层的协议如何分层,完全看具体的业务逻辑,不要生搬硬套任何现有的参考模型。

◇会话层 & 表示层 & 应用层


  对于大部分读者来说,【没必要】花时间去了解 OSI 最上面三层之间的区别。你只需把最上面三层视作【一坨】——他们都是与网络软件的业务逻辑密切相关滴。
  那么,哪些人需要详细了解“这三层的差异”捏?
  如果你是个程序员,并且你正好是开发【网络】软件,俺建议你了解一下 OSI 模型的最上面三层,有助于你更深刻地思考某些网络协议的设计。所谓的“更深刻”指的是:你不能光停留在 WHAT 层面,要提升到 HOW 甚至 WHY 层面(参见《学习技术的三部曲:WHAT、HOW、WHY》)


★业务层(OSI 上三层):具体实例


◇业务层的【协议】


  业务层的协议非常多。即使光把各种协议的名称列出来,也很费劲。所以俺就偷懒一下,只点评几个特别重要的协议。

  HTTP 协议
  如果让俺评选最重要的业务层协议,俺首推 HTTP 协议。互联网的普及推动了 Web 的普及,而 Web 的普及使得 HTTP 成为信息时代的重要支柱。当你上网的时候,你看到的网页(HTML 页面)就是通过 HTTP 协议传输到你的浏览器上。
  如今 HTTP 已经不仅仅用来展示网页,还有很多业务层的协议是建立在 HTTP 协议之上。比如说:如果你用 RSS 订阅俺的博客,RSS 阅读器需要调用 blogspot 博客平台提供的 RSS 接口,这些 RSS 接口就是基于 HTTP 协议传输滴。
  考虑到本文的篇幅,俺不可能在这里细聊 HTTP 协议的规格,有兴趣的同学可以去看《HTTP 权威指南》这本书。

  SSL/TLS 协议
  最早的 HTTP 协议是【明文】滴;为了强化安全性,后来又设计了 SSL 协议,用来【加密】HTTP 流量;再后来,SSL 升级为 TLS(这俩是同义词)。如今经常看到的 HTTPS 相当于“HTTP over TLS”。
  SSL/TLS 设计得比较优雅(很灵活),使得其它业务层的协议可以很方便地架构在 SSL/TLS 之上。这样的好处是:其它协议就不用自己再设计一套加密机制&认证机制。
  SSL/TLS 对于安全性很重要,因此俺专门写了一个系列教程(如下),详细介绍该协议的技术细节。
扫盲 HTTPS 和 SSL/TLS 协议》(系列)

  域名相关的协议(DNS 及其它)
  域名相关的协议,也很重要。因为域名系统是整个互联网的基础设施。最早的域名查询协议是“DNS 协议”,由于这个协议【没有】加密,导致了一些安全隐患。比如 GFW 就利用 DNS 的这个弱点,搞“域名污染/域名投毒”。因此,后来又设计了一系列新的域名协议,引入了加密的机制。
  关于这些协议的扫盲教程,可以参考如下几篇博文:
扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”
对比4种强化域名安全的协议——DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS

◇业务层相关的【网络设备】


  应用层防火墙(application firewall
  前面提到了:大多数网络防火墙处于4层(状态防火墙),另外还有少数处于7层,也就是“应用层防火墙”(有时候也称之为“7层防火墙”)。
  一般来说,这类防火墙具备了【深度包检测】(deep packet inspection,简称 DPI)的能力,可以分析应用层协议的【内容】。
  简单说一下“深度包检测”:
  如果某个网络设备,仅仅分析“应用层协议”本身,它还【不够格】称之为 DPI。为了做到 DPI,还要能理解应用层协议所承载的【内容】。
  比如说:某人通过【明文】的 HTTP 协议从网上下载了一个 zip 压缩包。对于这个下载行为,那些做得好的 DPI 设备不光能识别出“HTTP 协议的内容是 ZIP 压缩包”,而且还能从 ZIP 压缩包中提取出里面的文件。

  入侵检测(intrusion detection system
  一般来说,“入侵检测”如果不加定语,通常指“【网络】入侵检测”(洋文叫 NIDS);另外还有一种“【主机】入侵检测”(洋文叫 HIDS)。HIDS 与本文无关。
  “入侵检测”是一种网络安全设备,它通过嗅探(sniffer)的方式抓取网上的数据包,然后进行分析,尝试发现网络中是否存在黑客/骇客的入侵的行为。故名“入侵检测”。
  由于 IDS 需要理解【应用层】(7层)的内容,因此它与“应用层防火墙”有个共同点,需要具备某种程度的 DPI(深度包检测)能力。它俩的一大差异是【部署方式】。
  考虑到很多读者是 IT 外行,简单说一下“旁路部署”——
如果你学过中学物理,应该知道电路有“串联 & 并联”。所谓的“旁路部署”类似于电路中的【并联】。通俗地说:IDS 是【并联】部署,防火墙是【串联】部署。

  GFW(Great Firewall)
  本博客已经写了很多翻墙教程,大伙儿肯定都知道 GFW 了。
  由于“Great Firewall”中有“Firewall”字样,很多天朝网民【误以为】GFW 是防火墙,其实不然!GFW 本质上就是 IDS——其部署方式类似于 IDS(旁路部署),其工作方式有很大一部分也类似于 IDS(当然啦,GFW 的功能比 IDS 更多)。
  大约七八年前,就有热心读者建议俺写一篇技术博文,介绍 GFW 的工作原理。由于俺比较懒,拖到今年(2021)都没动手,很惭愧 :(


★杂项


  有些概念,并不属于某个特定的层次,单独放到这个章节。

◇VPN(virtual private network


  咱们天朝的网民使用 VPN,一多半是为了翻墙。其实 VPN 的本意(如其名称所示)是为了提供某种虚拟化的私有的网络,让身处异地的多个人,可以用 VPN 构建出一个虚拟的内网,从而能在这个内网中协同工作。
  VPN 的类型很多,使用的技术也各不相同,因此 VPN 对应的 OSI 层次很宽(“1层”到“6层”)。俺到维基百科剽窃了如下这张图,让你见识一下 VPN 的多样性。

不见图 请翻墙
(名目繁多的 VPN,分类示意图)

◇代理(proxy)


  那些经常翻墙的同学,对“代理”应该都很熟悉了。“代理”与 VPN 类似,一开始并不是用来翻墙滴,“翻墙”只是这俩的副业。

  代理服务器(proxy server)
  “代理服务器”部署在“客户端 & 服务端”之间,起到某种“中介”的作用。“代理服务器”的类型有很多,干的事情各不相同。

不见图 请翻墙
(“代理服务器”的简单示意图)

  代理客户端(proxy client)
  早期的代理服务器,【不】需要“代理客户端”。因为早期的“代理服务器”支持的是【标准协议】。比如“HTTP proxy server”支持的是标准 HTTP协议,而用户的电脑上,已经有浏览器(原生支持 HTTP 协议)。这种情况下,自然不需要再有“代理客户端”。
  后来,为了满足某些特殊需求(比如翻墙),“代理服务器”必须使用某种特殊的(非标准的)协议。因此,就必须在用户的环境中安装“代理客户端”。对于翻墙来说,你装的翻墙软件,相当于“代理客户端”。

  代理的层次
  “代理”也分不同的层次。比较常见的有如下几种:
TCP 代理(TCP 端口转发)——4层(传输层)
SOCKS 代理——5层(会话层)
HTTP 代理——7层(应用层)
......

◇网关(gateway


  前面的某些章节,已经稍微提及了“网关”这个概念,但还没有具体介绍它。
  严格来讲,“网关”是一个逻辑概念,【不要】把它当成具体的网络设备。充当“网关”的东东,可能是:路由器 or XX层交换机 or XX层防火墙 or 代理服务器 ......
  “网关”也分不同的层次。如果不加定语,通常指的是“3层网关”(网络层网关)。列几种比较常见的,供参考:
路由器充当网关——3层(网络层)
3层交换机充当网关——3层(网络层)
4层交换机充当网关——4层(传输层)
应用层防火墙充当网关——7层(应用层)
代理服务器充当网关——(取决于代理的层次,参见前一个小节)
......

◇隧道协议(tunneling protocol


  所谓的“隧道协议”,通俗地说就是:用某种协议包裹另一种协议,以满足某些特殊的需求。
  看到这里,估计某些同学会感到纳闷——因为俺在本文开头介绍“协议栈”的时候提到说:相邻的两层协议,下层会包裹上层。“隧道协议的包裹”与“上下层协议的包裹”,差别在哪捏?
  俺来解释一下:
  “隧道协议”可以做到更灵活的包裹——既可以对层次相隔很远的协议进行包裹,也可以对同一层的协议进行包裹,甚至可以“倒挂”——所谓的“倒挂”就是让【上】层反过来包裹【下】层。
  举例:
  俺曾经写过一篇《如何让【不支持】代理的网络软件,通过代理进行联网(不同平台的 N 种方法)》,其中介绍了“HTTP 代理”的两种模式:“转发模式 & 隧道模式”。对于“HTTP 代理”的隧道模式,可以实现【TCP over HTTP】(把 TCP 协议打包到 HTTP 协议内部),这就是刚才所说的“倒挂”。
  另外,VPN 小节的那张图中,有些类型的 VPN 就是用“隧道协议”的机制实现。

◇(其它杂项)


  可能还有一些杂七杂八的东东,没来得及聊。如果你觉得有些【网络相关】的概念,不太明白,欢迎到博客留言,进行反馈。
  俺会根据大伙儿的反馈,再对这篇教程进行补充。


★参考书目


  如下几本书,都在俺的网盘上分享了电子版。

中文书名英文书名作者
计算机网络《Computer Networks》Andrew Tanenbaum
David Wetherall
计算机网络——自顶向下方法《Computer Networking——A Top-Down Approach》James Kurose
Keith Ross
TCP-IP 详解《TCP-IP Illustrated》Richard Stevens
UNIX 网络编程《UNIX Network Programming》Richard Stevens
HTTP 权威指南《HTTP——The Definitive Guide》David Gourley
Brian Totty
Marjorie Sayer
Sailu Reddy
Anshu Aggarwal


俺博客上,和本文相关的帖子(需翻墙)
扫盲 HTTPS 和 SSL/TLS 协议》(系列)
扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”
对比4种强化域名安全的协议——DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS
如何隐藏你的踪迹,避免跨省追捕》(系列)
扫盲 netcat(网猫)的 N 种用法——从“网络诊断”到“系统入侵”
如何让【不支持】代理的网络软件,通过代理进行联网(不同平台的 N 种方法)
聊聊分布式散列表(DHT)的原理——以 Kademlia(Kad) 和 Chord 为例
扫盲操作系统虚拟机》(系列)
扫盲 Linux&UNIX 命令行——从“电传打字机”聊到“shell 脚本编程”
如何【系统性学习】——从“媒介形态”聊到“DIKW 模型”
学习技术的三部曲:WHAT、HOW、WHY

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者"编程随想"和本文原始地址。

翻墙工具

使用 BT sync 自动同步各种翻墙工具(BT sync 免翻墙可用), 同步密钥是 BTLZ4A4UD3PEWKPLLWEOKH3W7OQJKFPLG 如有其它问题,用program.think@gmail.com联系俺

How to VLAN

By: Erease
10 November 2019 at 08:00

介绍VLAN的基本概念和几种场景下的应用,而OpenWrt下VLAN处理机制和一般交换机有些不同,这里做了一个对比并给出了一种两台路由器之间的单线复用的方案

问题

计算机网络的教材对VLAN一笔带过,作业的却要用到交换机互联,之前看的VLAN的文章貌似都对应不到OpenWrt上去,也就很难有实践的机会;下面根据个人在宿舍组网上遇到的问题,一步步来探究VLAN的用法

后面又看到了N1盒子基于VLAN的单臂路由,又做了一些补充

多线接入

宿舍是上床下桌,每一张桌子下面有一个百兆的网口,通过负载均衡,很早就可以把网速跑到100Mbps了,这显然不够啊,因为宿舍WiFi是共用的,自然而然想到连接相邻的两个床位的网口,这样就有300Mbps了,这也是多线拨号的第一步

上图就是将LAN3与LAN4作双线接入,通过VLAN分别对应到eth0.3和eth0.4

此时LAN4与WAN是“直通”的,效果上来说,就是LAN4也可以插网线用电脑拨号了,如果是要给路由器做双线接入的话,则需要添加VLAN,再把一个LAN口添加到新VLAN中,最后建立接口拨号即可

交换

然而舍友还是需要网口拨号的,所以如果需要长期占用的话偶尔肯定是不太方便的,所以需要交换机来扩展一下网口,这一步已经可以通过简单的修改下OpenWrt路由器的Switch来实现,將LAN4和WAN划到同一个VLAN,两个接口就相当于在同一交换机下:

单线复用

然而,仅仅通过untagged只能实现多条线路的“汇聚”,能够达到100Mbps+的只有一台路由器而已,并没有实现“互通”,即每一台路由器都可以上到100Mbps+;不仅如此,还要实现相邻床位的路由器之间只用一根线连接就可以达到同样的网速,更具体的就是在一根网线传输不同的来源(网口)的数据

而VLAN的一个重要的功能恰好就是实现交换机之间的互通

单臂路由

这个需求源于有一台N1,之前看过VLAN的接入网络的方法,觉得网络结构更清晰,以此可以解决主路由算力不足的问题,但之前一直没有刷上OpenWrt,刷完之后发现居然没有交换机的Switch选项,赶紧翻出了之前看到的帖子:N1做主路由,新3做AP的最正统vlan连法教程,想起之前文档刚好有部分没看懂,刚好可以补充上

概念

首先还是OpenWrt的文档:VLAN,很早就读过,但是因为缺少具体的有解释的例子,当时没弄清楚VLAN tagged的机制

所以这里先结合华为的文档了解下基础的概念

VLAN Tag

首先需要理解VLAN标签是被添加到以太帧内部的一个4个字节的片段,其中VID也就是常说的VLAN ID

在一个VLAN交换网络中,以太网帧主要有以下两种形式:

  • 有标记帧(Tagged帧):加入了4字节VLAN标签的帧
  • 无标记帧(Untagged帧):原始的、未加入4字节VLAN标签的帧

常用设备中:

  • 用户主机、服务器、Hub只能收发Untagged帧(Linux系统可以通过安装软件实现收发Tagged帧)
  • 交换机、路由器和AC既能收发Tagged帧,也能收发Untagged帧
  • 语音终端、AP等设备可以同时收发一个Tagged帧和一个Untagged帧

VID & PVID

VID也就是数据帧中的12bit的VLAN ID,表示该数据帧所属VLAN的编号,而PVID(Port Default VLAN ID)又称为缺省VLAN,可以用于和VID做比较来判断Tag的情况

应用

最主要的应用是划分广播域,这部分可以参考图文并茂VLAN详解,然而和本文的关系不是很大

为了提高处理效率,设备内部处理的数据帧一律都是Tagged帧,例如在交换机内部的,在数据帧进入交换机的时候可能会按照一定的规则被打上VLAN Tag以方便下一步的处理,OpenWrt的Old Wiki的一张图很好地体现了这一点:

以太帧进入端口后被打上VLAN Tag,之后在传输的CPU的线路内(Port5-CPU),就同时传输带两种VLAN Tag的包

另外在交换机之间,可以在一条链路上使用两个VLAN也叫做Ethernet trunking,也有人称作单线复用,常见的应用:

  • 单臂路由(只有一个网口的路由器)
  • 使用一根网线同时传输IPTV和宽带的数据

交换机

这里参考的是上面的华为的交换机的文档,不同交换机可能有些不一样

Incoming & Outgoing

以收发的设备作为主体,指的是数据帧到达接口而没有完全进出交换机内部,举个例子:

  • 数据帧到达某一个接口时,路由器会对数据帧的VLAN情况做判断
  • 如果符合通过的规则,则放行做后续处理,不符合则丢弃
  • 后续处理可能就是剥离或者打上标签

链路类型和接口类型

配置VLAN:为了适应不同的连接和组网,设备定义了Access接口、Trunk接口和Hybrid接口3种接口类型,以及接入链路(Access Link)和干道链路(Trunk Link)两种链路类型,如下图所示

根据接口连接对象以及对收发数据帧处理的不同,以太网接口分为:

  • Access接口

Access接口一般用于和不能识别Tag的用户终端相连,只能收发Untagged帧,且只能为Untagged帧添加唯一VLAN的Tag

  • Trunk接口

Trunk接口一般用于连接交换机、路由器、AP以及可同时收发Tagged帧和Untagged帧的语音终端。它可以允许多个VLAN的帧带Tag通过,但只允许一个VLAN的帧从该类接口上发出时不带Tag(即剥除Tag)

  • Hybrid接口

Hybrid接口可以允许多个VLAN的帧带Tag通过,且允许从该类接口发出的帧根据需要配置某些VLAN的帧带Tag(即不剥除Tag)、某些VLAN的帧不带Tag(即剥除Tag)

Hybrid接口和Trunk接口在很多应用场景下可以通用,但在某些应用场景下,必须使用Hybrid接口。比如一个接口连接不同VLAN网段的场景(如图所示的Router连接Hub的接口)中,因为一个接口需要给多个Untagged报文添加Tag,所以必须使用Hybrid接口。

  • 接入链路只可以承载1个VLAN的数据帧,用于连接设备和用户终端
  • 干道链路可以承载多个不同VLAN的数据帧,用于设备间互连

处理机制

OpenWrt对VLAN Tag的处理机制见后文引用文档的加粗部分,此处暂作为理解的参考

  • Access端口

  • Trunk端口

  • Hybird端口

OpenWrt VLAN

OpenWrt的文档没怎么提及接口类型的概念,OpenWrt对VLAN设置的组织形式和普通的交换机有所不同,从机制介绍来看是比较接近Trunk端口的:发出的数据帧只有一个VLAN的数据帧不带Tag

OpenWrt文档所提到的:An untagged port can have only 1 VLAN ID 反映在:OpenWrt中的Switch设置VLAN时单个untagged Port无法再再其他VLAN上为Untagged,否则回提示:LAN 1 is untagged in multiple VLANs!

故抛开之前的端口类型,遵守VLAN的规则,兼容且实用就行

另外,不是所有OpenWrt设备都有Switch这个LuCI的配置选项,比如N1就没有,但是照样可以配置VLAN,位置在Interface的接口物理配置部分,由于无法像Switch那样有Tag之类的选项,

Tag机制

官方文档对Tag机制的介绍如下(散落在两处):

  • Tagged on “CPU (eth0)” means that the two VLAN ID tags used in this example (1, 2) are sent to the router CPU “as tagged data”. Remember: you can only send Tagged data to VLAN-aware devices configured to deal with it properly.
  • Untagged means that on these ports the switch will accept only the incoming traffic without any VLAN IDs (i.e. normal ethernet traffic). The switch will remove VLAN IDs on outgoing data in such ports. Each port can only be assigned as “untagged” to exactly one VLAN ID.
  • Off: no traffic to or from the tagged ports of this VLAN ID will reach these ports.

Ports can be tagged or untagged:

  • The tagged port (t is appended to the port number) is the one that forces usage of VLAN tags, i.e. when the packet is outgoing, the VLAN ID tag with vlan value is added to the packet, and when the packet is incoming, the VLAN ID tag has to be present and match the configured vlan value(s).
  • The untagged port is removing the VLAN ID tag when leaving the port – this is used for communication with ordinary devices that does not have any clue about VLANs. When the untagged packet arrives to the port, the default port VLAN ID (called pvid) is assigned to the packet automatically. The pvid value can be selected by the switch_port section.

特别指出,但是一般也用不上,在LuCI界面上看不到的PVID设置,设置具体在uci network switch_port部分:

Port PVID; the VLAN tag to assign to untagged ingress packets

无Switch配置

官方文档的位置在 Creating driver-level VLANs 一节,配置方式是通过在接口设置,选择自定义接口,在名称在做文章:如在物理网卡eth1上,通过自定义eth1.2接口的方式建立一个VLAN ID为2的接口,在使用Switch设置VLAN,如添加VLAN ID为3的VLAN之后,接口处也会出现eth0.3,逻辑上还是统一的;下面来看下文档对处理机制的描述:

If the incoming packet arrives to the interface with software VLANs (incoming packet to eth1) and has a VLAN ID tag set, it appears on the respective software-VLAN-interface instead (VLAN ID 2 tag arrives on eth1.2) – if it exists in the configuration! Otherwise the packet is dropped. Non-tagged packets are deliveded to non-VLAN interface (eth1) as usual.

即处理流入的包:接口只接收有相应Tag的包,相当于Switch中的VLAN在该接口设置为Tag

这样一来,一个物理网口可以同时收发带Untagged帧和Tagged帧,故使用VLAN来实现单臂路由也就很好理解了,配置的方式也不唯一

解决方案

回到本文开头提到的问题,仿照上面的Switch内部VLAN机制的图的形式,画了一张两台OpenWrt路由器通过VLAN互通,进而实现让两台路由器可以得到宿舍三个网口合计300Mbps的接入

需要说明的是:

  • 因为所有的VLAN都需要为拨号服务,所以这里略去了VLAN到CPU的一段
  • 格式为了照顾LuCI的设置界面显示,可能看起来有些不寻常
  • VLAN ID的外层意义就是接入的网口的标识,中间的TRUNK链路如何并不重要
  • 对WAN Interface的命名就相对随意了,例如Router 1的WAN_1应该命名为WAN_21更合适一点

最后的在宿舍的书桌背后的路由器如图

路由负载均衡:ECMP

By: Erease
3 November 2019 at 08:00

介绍了Linux系统中等效多径路由(ECMP)及其在网络负载均衡上的应用,给出了OpenWrt下的启用的方法

参考

因为偶然发现了Linux内核中的ECMP这种负载均衡的方法,然后查了些资料,这里整理下(业余水平);文末留下了当时发现ECMP的记录

ECMP在工程方面用的很多,能找到的多是说明文档,介绍特性和成套的解决方案,但是基础的材料并不是那么好找,个人也是刚刚接触到ECMP,水平有限,这里先给出本文的主要参考文献

关于负载均衡,[译] 现代网络负载均衡与代理导论(2017)有一个较为全面的介绍,其中作者提到

关于现代网络负载均衡和代理的入门级教学材料非常稀少(dearth)。我问自己:为什么会这样呢?负载均衡是构建可靠的分布式系统最核心的概念之一。因此网上一定有高质量的相关材料?我做了大量搜索,结果发现信息确实相当稀少。 Wikipedia 上面负载均衡 和代理服务器 词条只介绍了一些概念,但并没有深入 、这些主题,尤其是和当代的微服务架构相关的部分。Google 搜索负载均衡看到的大部分都 是厂商页面,堆砌大量热门的技术词汇,而无实质细节。本文将给读者一个关于现代负载均衡和代理的中等程度介绍,希望以此弥补这一领域的信息缺失。

对此个人在经历一番搜索之后也是感同身受,所以才有了总结的想法;如果觉得上文过于“导论”(和本文的关系不大),华为的文档更贴近本文的主题一些,尽量看英文:Introduction to Load Balancing

Jakub Sitnicki’s Blog的系列博文:对Linux内核中的ECMP的实现深入浅出地做了介绍,如果感兴趣的话可以看看

最后是一篇相对详尽的中文资料,重点是ECMP在内核中的变更历史:ECMP在Linux内核的实现

原理及概念

ECMP也就是下面的路由表的情形,就是到某一个目的地址可以有多个下一跳路径可选

root@K2P:~# ip r
default metric 1
        nexthop via 10.170.72.254 dev pppoe-VWAN21 weight 1
        nexthop via 10.170.72.254 dev pppoe-VWAN22 weight 1
        nexthop via 10.170.72.254 dev pppoe-VWAN31 weight 1
        nexthop via 10.170.72.254 dev pppoe-VWAN32 weight 1
root@K2P:~# ip -6 r default
default metric 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN21 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN22 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN31 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN32 weight 1 pref medium

看起来很简单,要弄清楚这个具体能做到什么程度就需要了解下具体的实现,这里一步一步来看

Packet/Flow

Packet对应的是IP分组(数据报、数据包),是数据在L3上传输的单元

对路由器而言,流(Flow)是共享某些特性的packet序列,比如同一个请求(连接)的packets有相同的路由路径

根据负载均衡的对象分:有Per-Packet和Per-Flow两种方式,文档中的两张图对此有个直观的对比

自然而然的会想到L4 Per-Packet负载均衡:每一个的Flow的Packets会被分流,可以实现多拨对看直播都可以加速的效果,然而本文并不会涉及:

Existing Multipath Routing implementation in Linux is designed to distribute flows of packets over multiple paths, not individual packets. Selecting route in a per-packet manner does not play well with TCP, IP fragments, or Path MTU Discovery.

故默认下文都是Per-Flow负载均衡,这就需要利用Packet的header fields信息把一个个的Packet和Flow联系起来,再进行下一跳的路由选择:

  • IPv4 L3 hash

     { Source Address, Destination Address }
    
  • IPv4 L4 hash

    { Source Address, Destination Address, Protocol, Source Port, Destination Port }
    
  • IPv6 L3 hash

    { Source Address, Destination Address, Flow Label, Next Header (protocol) }
    

    IPv6分组因为有Flow Label的存在,IPv6即使只用到L3 Hash也可以实现L4负载均衡

IPv6 Flowlabel IPv6数据报(packet)中有一个20字节的字段:流标号(流标签);进而可以用流标号取代路由表来处理流的路由,加速路由器对分组的处理;在ECMP中却提供了Flow的信息,故IPv6 ECMP是比较容易做的

L3/L4

更关键的还是负载均衡的层级,比如在多拨的情况下使用策略路由也可以做“负载均衡”,下面的命令往往提高BT的速度,这属于L3 Per-Flow负载均衡(左图):只在IP地址层级分流

ip rule add table 916
ip route add 10.173.0.0/16 via 10.170.72.254 dev pppoe-VWAN31 table 916
ip route add 10.170.0.0/16 via 10.170.72.254 dev pppoe-VWAN32 table 916

类似的方法对HTTP多线程下载并没有加速作用,对连接分流,需要L4负载均衡:多线程下载的请求之间source port不同,故L4 hash值基本不同,故会被分到不同的路径上,这样一来L4负载均衡是面向连接的就很好理解了,而内核在IPv4/IPv6上实现到一步有一段很长的历史:

Linux内核中ECMP

Linux内核的Git Commit,对发展历程感兴趣的还可以参考博文Celebrating ECMP in Linux,其中还讨论了设备的出站流量和转发流量的ECMP效果的不同,这里把ECMP的变更历史整理到一张表格中,以及对应时间的OpenWrt的内核版本信息:

Linux Kernel OpenWrt 内核版本 ECMP变更 ECMP形式
1997 | 2.1.68   IPv4 ECMP 加入内核 L3 Per-packet + route cache -> L3 Per-flow
2007 | 2.6.23   IPv4 multipath cached 移除 L3 Per-packet + route cache -> L3 Per-flow
2012.9 | 3.6   IPv4 route cache 被移除 L3 Per-packet -> L3 Per-packet
2012.10 | 3.8   IPv6 ECMP 加入内核 IPv6 Flowlabel -> IPv6 L4 Per-flow
2015.9 | 4.4 15.05 | 3.18 IPv4 ECMP:使用L3 Hash L3 Per-packet + L3 hash -> L3 Per-flow
2016.4 | 4.7   IPv4 ECMP: 增加邻居健康检查  
2017.2 17.01 | 4.4    
2017.3 | 4.12   IPv4 ECMP: 增加 L4 Hash L3 Per-packet + L3/L4 hash -> L3/L4 Per-flow
2017.11 | 4.14   IPv6 ECMP: ICMPv6 修复  
2018.1 | 4.16   IPv6 ECMP: 支持指定权重  
2018.4 | 4.17   IPv6 ECMP: 增加 L4 Hash  
2018.7 18.06 | 4.9/4.14    
2018.10 | 4.19      
2019.11 19.07 | 4.14.151    

这里可以推出(实际早期版本我也没有测试过),在默认的编译选项和内核版本下,较为实用的L4负载均衡,IPv4需要在18.06及之后的版本

IPv6由于使用了Flowlabel作为Hash的对象,根据表格,OpenWrt在15.05之后的版本就可以启用L4负载均衡

本文考虑更多的还是OpenWrt中的应用,更多信息参考本博客中的Speed_Up

启用ECMP

准备部分是从排查问题的角度来看的

在启用之前可以确认下编译内核时的下面选项,即IP: equal cost multipath,ECMP支持,较新版本的OpenWrt默认是打开的

  • CONFIG_IP_ROUTE_MULTIPATH=y

暂时不清楚使用下面的多个nexthop命令添加ECMP路由的依赖,只知道命令ip route的源于iproute2,如果出现如下报错:

Error: either “to” is a duplicate, or “nexthop” is a garbage.

可以尝试:

  • 安装ip-full再尝试,OpenWrt默认是ip-tiny,某些情况下也能使用多个nexthop命令添加ECMP路由
  • 使用route命令多次添加静态路由,可以启用IPv6的ECMP(详见文末的后记),实测在原版的OpenWrt可行
    route -A inet6 add 2000::/3 gw fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN2
    route -A inet6 add 2000::/3 gw fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3
    

添加ECMP路由

这里直接引用iproute2的user Guide的Multipath routing部分:

ip route add ${addresss}/${mask} nexthop via ${gateway 1} weight ${number} nexthop via ${gateway 2} weight ${number}

Multipath routes make the system balance packets across several links according to the weight (higher weight is preferred, so gateway/interface with weight of 2 will get roughly two times more traffic than another one with weight of 1). You can have as many gateways as you want and mix gateway and interface routes, like:

ip route add default nexthop via 192.168.1.1 weight 1 nexthop dev ppp0 weight 10

Warning: the downside of this type of balancing is that packets are not guaranteed to be sent back through the same link they came in. This is called “asymmetric routing”. For routers that simply forward packets and don’t do any local traffic processing such as NAT, this is usually normal, and in some cases even unavoidable.

If your system does anything but forwarding packets between interfaces, this may cause problems with incoming connections and some measures should be taken to prevent it.

可以补充的是如果用的多个等带宽的PPPoE Interface的话,可以使用多个nexthop dev ${pppoe-dev}

修改内核运行参数

仅仅是上一步的话,可以见到在使用P2P下载时已经有负载均衡了,但是对HTTP的多线程下载并没有加速效果,因为一些Linux内核对IPv4的ECMP默认设置到L3 Hash,而且也没有开启邻居健康检查,所以需要修改下内核的运行参数,相关的具体的参数说明如下:

fib_multipath_hash_policy - INTEGER Controls which hash policy to use for multipath routes. Only valid for kernels built with CONFIG_IP_ROUTE_MULTIPATH enabled. Default: 0 (Layer 3) Possible values: 0 - Layer 3 1 - Layer 4 2 - Layer 3 or inner Layer 3 if present

fib_multipath_use_neigh - BOOLEAN Use status of existing neighbor entry when determining nexthop for multipath routes. If disabled, neighbor information is not used and packets could be directed to a failed nexthop. Only valid for kernels built with CONFIG_IP_ROUTE_MULTIPATH enabled. Default: 0 (disabled) Possible values: 0 - disabled 1 - enabled

echo "net.ipv4.fib_multipath_hash_policy=1" >> /etc/sysctl.conf
echo "net.ipv4.fib_multipath_use_neigh=1" >> /etc/sysctl.conf
sysctl -p

其他相关的内核运行参数(IPv6 Flowlabel等)可以参考ip-sysctl.txt

OpenWrt上启用ECMP

熟练的话完全根据上面的方法做了,以下是在校园网PPPoE接入下实践的,如果PPPoE拨号多播数量较多可以参考如何提高网速

准备

  • 在启用之前可以确认下编译内核时的选项CONFIG_IP_ROUTE_MULTIPATH=y(OpenWrt 18.06之后的版本默认已经开启)
  • IPv6 ECMP只在IPv6 NAT下测试过,受限于当前OpenWrt正式版的内核版本,未对内核参数做进一步测试
  • 加速的前提是下多拨可以加速(ISP限制)

添加虚拟网卡

OpenWrt安装kmod-macvlan后就可以添加虚拟网卡到不同的VLAN上

opkg update && opkg install macvlan

路由器上的RJ45网口是绑定到VLAN上的,如果是添加虚拟网卡到一个VLAN上就是单线多拨,添加到多个VLAN上就可以做多线多拨了

这里的eth0.2对应于WAN口(在Interface -> Switch可以看到WAN绑定在VLAN 2上),不同的设备可能有些许不同,这里在eth0.2上添加两个虚拟网卡

for i in  `seq 1 2`
do
  ip link add link eth0.2 name veth$i type macvlan
done

拨号

还是用脚本省事,填上用户名和密码即可,拨数为2,填下账号密码

#!/bin/sh
username=
password=
for i in  `seq 1 2`
do
  uci set network.VWAN$i=interface
  uci set network.VWAN$i.proto='pppoe'
  uci set network.VWAN$i.username="$username"
  uci set network.VWAN$i.password="$password"
  uci set network.VWAN$i.metric="$((i+1))"  
  uci set network.VWAN$i.ifname="veth$i"
  uci set network.VWAN$i.ipv6='1'
done
uci commit network

添加所有PPPoE接口到wan zone(担心影响到其他的网络环境的话手动也可以)

for i in `uci show network | grep pppoe | awk -F. '{print $2}'`
do
  uci add_list firewall.@zone[2].network=$i
done
uci commit firewall

添加ECMP路由

只用nexthop dev ${pppoe-dev}:

#IPv4
ip route replace default metric 1 nexthop dev  pppoe-VWAN1 nexthop dev  pppoe-VWAN2
#IPv6
ip -6 route replace default metric 1 nexthop dev  pppoe-VWAN1 nexthop dev pppoe-VWAN2

做完这一步就可以使用ip rip -6 r命令检查下路由表

修改内核运行参数

echo "net.ipv4.fib_multipath_hash_policy=1" >> /etc/sysctl.conf
echo "net.ipv4.fib_multipath_use_neigh=1" >> /etc/sysctl.conf
sysctl -p

测试

通过东北大学IPv6测速以及IPv4测速测试负载均衡的速度叠加效果,或者使用iftop命令查看各个接口上路由的实时速率

传入连接的问题

添加ECMP路由之后传入连接偶尔连的上,偶尔连不上,但是PT的上传之类的貌似又没有问题(可能因为上传也可以是主动发出的连接),如果有这方面需求的话需要添加策略路由,为某一接口上的地址指定路由规则,下面是IPv4的,完成之后可以从外部访问之类的,但是对其他的影响就不太清楚了,IPv6部分暂时没有测试条件…

ip rule add perf 20 from IP table 20
ip route add default table 20 dev INTERFACE

此处参考自Linux 平台上之 Multipath Routing 應用,非常难得的详细的文章,还是2001年的

后记:偶然发现的ECMP

这里保留当时的发现过程:(当时发现了这个功能非常开心,现在来看部分内容不准确,但是文末的脚本的效果要好于ECMP默认的方法)

只在K2P OpenWrt 18.06上面实践过,对LEDE 17.01无效

下面是在操作一番之后的路由表,对IPv6的测速显示网速翻了四倍

root@OpenWrt:~# ip -6 route | grep pppoe
default from 2001:250:1006:dff0::/64 via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN4 proto static metric 512 pref medium
2000:::/3 dev pppoe-VWAN4 proto static metric 256 pref medium
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-wan weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN2 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN4 weight 1

大致可以看出这已经是做了负载均衡,需要的只是安装好luci-app-mwan3,简单操作一下路由表,这里的网关地址和dev需要看具体情况

2000::/3 就是IPv6的单播(Unicast)地址了,在不做任何操纵的情况下,无PD的路由表(单拨)

default from 2001:250:1006:dff0::/64 via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3 proto static metric 512 pref medium
2001:250:1006:dff0::/64 dev pppoe-VWAN3 proto static metric 256 pref medium
...

之后通过下面两条常规的添加路由表条目的命令:

route -A inet6 add 2000::/3 gw fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN2
route -A inet6 add 2000::/3 gw fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3

发现路由表就出现了nexthup和负载均衡中的weight标记

root@OpenWrt:~# ip -6 route | grep pppoe
default from 2001:250:1006:dff0::/64 via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3 proto static metric 512 pref medium
2000::/3 dev pppoe-VWAN3 proto static metric 256 pref medium
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN2 weight 1
        nexthop via fe80::96db:daff:fe3e:8fcf dev pppoe-VWAN3 weight 1
...

类似的网关添加过程对IPv4效果并不好,这里稍后再细说

之后还需要修改一下防火墙,这里用的还是NAT6中的那条命令

因为对路由表的修改在路由器重启之后会重置,所以还是要添加到开机的启动脚本或者添加到自定的防火墙规则之中,如果已经在NAT6配置过程中配置好了的话这一步就可以忽略了

ip6tables -t nat -I POSTROUTING -s `uci get network.globals.ula_prefix` -j MASQUERADE

实测的峰值速度可以到达双网口的满速,但是一样的问题,在UT,IDM,Thunder这种多线程下载软件下轻松满速,而在YouTube视频应用下,只有半速(甚至包括用IDM下载的情况下)

目前最新版本的mwan3也开始支持IPv6多拨了,但是个人还是觉得日常使用的话用以上的方法更加快捷,不过需要对网络有一定的了解,下面是一段针对IPv6 NAT的多拨hotplug脚本,用了一些OpenWrt开发时推荐的写法,比较实验性

#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
ifaces=$(ubus call network.interface dump | jsonfilter -e '$.interface[@.proto="dhcpv6" && @.up=true].interface')
for iface_6 in $ifaces
do
  [ "$INTERFACE" = $iface_6 ]  || continue
  devices=$(ubus call network.interface dump | jsonfilter -e '$.interface[@.proto="dhcpv6" && @.up=true].device')
  ipv6_gw=$(ifstatus $iface_6 | jsonfilter -e '$.route[1].nexthop')
  for ipv6_dev in $devices
  do
    status=$(route -A inet6 add 2000::/3 gw $ipv6_gw dev $ipv6_dev 2>&1)
    logger -t NAT6 "Gateway: $ipv6_dev: Done $status"
  done
  exit 0
done

关于PT站的零零碎碎

By: Erease
17 October 2019 at 08:00

遇到的问题,读过的文章,一点总结,希望能节约些时间的同时把事情做好

前言

初次接触到PT的概念是在初中,EACDY论坛的站长在115网盘链接失效后毅然决定要开办PT站,但是因为那是家里的带宽极为有限,没能提供多少的上传量;之后偶然在东南大学的虎踞龙盘PT见识到了教育网PT的繁荣,于是定了一个之后要去一所有PT的大学的目标,最后如愿以偿,却发现IPv6才是打通教育网和公网PT的关键;之后又是一次偶然的机会,接触到了PT站的一些技巧后…决定把本文放到博客上(仅涉及国内的PT站)

个人的PT站账号不多,数据仅仅是咸鱼水平,对公网PT知之甚少,内容多是引用以及摸索的经验,仅供参考

引用与推荐

文章

rhilip对国内的PT站数据有一个详细的统计分析,可以作为发展PT的参考:

PT实用工具&脚本分享:感谢给我发过邀请的yezi1000,顺着简介找到了博客,下面这篇文章介绍了搭建PT盒子的一些经验(和普通的娱乐用户关系不大)

torrentinvites.org:据说是一个卖PT邀请码的网站,该网页有PT站的数据统计及站点的分析,可以为进入某个公网PT提供了部分参考

ipv6 NAT后配置端口转发:使用IPv6 NAT的可以看下,说不定可以改善连接性,进而大大提高上传速度

这里还有一个用得上但是有些古老的软件,v6speed,类似于某种P2P点播软件:使用种子利用P2P传输就可以观看电影,一时半会还真的没找到同类型的软件,据说有解码能力有限的问题,最后一次更新在2015年

工具

PT站最关注的点:保种以及搜索下载

reseed:方便的跨站辅种工具,进到新的PT站,一个个搜索辅种往往需要花掉相当多的时间,这个几分钟就解决了,天津大学的同学开发的,注册账号需要北洋的Passkey,国内的部分站点可用

PT-Plugin-Plus:支持Chrome和Firefox的插件,提供站点数据概览,搜索聚合以及辅助下载功能;向往PT的一大原因就是简单且高质量,这个插件对此贡献也很大,比如在网页上看到有人推荐某个纪录片,右键搜索,下载一气呵成

如果要发电影(转种可能也用得上),PT Gen可以帮助生成信息

遇到的问题

PT的生存性

如果网络通畅的话下载热门的种子即可,但是如果上传速度很糟心的话,还是选择大量的保种路线,使用保种得到的积分换上传量比较好,所以打听好PT站点的生存策略和弄清楚自身的网络状况是很关键的

资源的发布时间

首先要搞清楚0day资源的概念,自行搜索,这里说下蓝光电影的发布时间的一个参考:blu-ray.com中的电影详情页面中可以看到蓝光碟片的发布时间,一般PT站可以提前一点点发出资源,不同的站点的一个区别就在于首发的速度,但顶级站点往往转种都是很快的

至于更普遍的WEB版或者TV版资源,看首播的时间就好,可以留意的是:

  • 有WEB录制组的站点,可以查看历史资源确定是否有录制计划
  • 电影录制比较特殊的地方在于版权,有些站点可能不让发
  • Auto Seed的存在,主要是对欧美剧集,可以第一时间转种,具体那些站点有可以参考Pt-Board

特别一点的是动漫,动漫资源的发布往往依赖于字幕组,就我所在的大部分PT站动漫更新都不是很及时,BT站 动漫花园,部分动漫字幕组出资源会第一时间放出来

代理与盒子

因为学校往往带宽比较贵,学生购置大容量硬盘也不太划算(刷数据和看电影是两回事),随意挂代理和购置盒子可以提高速度和节约流量,需要注意的事部分站点是限制这种方式的,尤其是刚进入站点的时候,如果一不小心被识别为盒子(挂代理的VPS供应商有时候会被识别),可能上去下载免费资源就会出现分享率爆炸的情况,所以此处需格外谨慎(尤其是路由器上挂透明代理)

NAS

因为电脑上没有安装3.5寸盘的空间,在经历过路由器挂BT的初等玩法后,还是组建了一台NAS用于个人的数据存储和下载管理

下载软件

NAS自带的下载软件源于Transmission:

  • 有配套的APP:DS Get,但是不太好用…
  • 支持订阅,规则也比较好写
  • 结合上Download Station Extension可以在Chrome,safari,Opera浏览器中使用右键直接下载,缺点是最多只能显示100个种子
  • 缺点之一就是默认是强制校验资源的完整性的,以至于添加资源特别麻烦
  • 缺点之二,种子太多容易卡顿

于是就转而使用了Docker的linuxserver\qBittorrent

  • 终于可以跳过校验了,结合之前的reseed工具,可以迅速添加几百个种子
  • 开源软件,自带开源的气质,各种选项,信息都会呈现出来
  • 需要结合后面的FlexGet实现订阅
  • 轻量化的Web界面反而成为了远程跨平台访问的优势

默认设置需要修改的主要是下载任务数量和连接数

IPv6问题

docker如果使用桥接网络是默认不支持IPv6的,个人安装网上的修改参数之类的方法最终也失败了,最后还是使用了hosts网络多尝试了几次成功了

订阅

比如说在0day资源出来之前可以先写好订阅,待到资源出种就可以第一时间自动下载好,查看下载列表就可以得知已经出种而不需要再去反复的检索

RSS

一般的NexusPHP架构的PT站都在搜索栏的右侧有个订阅的icon,设置好筛选就可以通过RSS获取种子的信息进而实现自动的下载

FlexGet

主要是弥补自带RSS的设置自由度不足以及给Docker的qBittorrent提供自动下载支持,为了省事,采用了Docker:wiserain-flexget,挂载一个qbittorrent可以访问的文件夹作为qbittorrent的种子监测文件夹,运行后就可以从网页打开FlexGet的界面,填写config即可

网络

若是用户之前都是公网IP且防火墙规则开放的情况就不多说了,主要是做种的时候看到有人在下载而本地的种子又没有上传就很折磨

传入连接

Tracker是PT用户都可以访问,用于上传BT客户端的IP及端口信息以方便用户之间的相互连接,试想一下这样的一个过程,当一个客户端A,得知客户端B正在做种,于是A直接向B发起了一个连接请求,也就是对B而言,该连接是一个传入连接,然而残酷的现实是:

  • 防火墙默认阻止了传入连接,在以校园网的IPv6防火墙和设备的默认防火墙策略为代表
  • 路由器的NAT类型默认阻止了传入连接

阻止传入连接不会影响正常的上网,因为日常的上网连接都是由内网的设备发起或是请求,好比开门发快递和收快递,而PT的传入连接呢?就好比一个陌生的快递突然送了过来,现实中可能是“来者不拒”,但是网络的世界往往要危险的多

至于防火墙这一级,如果可以管理的话,开放UT的监听端口即可,如果不行的话可以尝试设置uPnP做自动端口转发

PT站上显示的“可连接”仅仅是可以连接到Tracker服务器,实际的效果可以靠UT、qbittorrent的用户标识(Flag)判断

Flag所代表的意义:

D = 当前正在下载 (感兴趣且没有被阻塞)
d = 本级客户端需要下载, 但是对方没有发送 (感兴趣但是被阻塞)
U = 当前正在上传 (感兴趣且没有被阻塞)
u = 对方需要本机客户端进行上传, 但是本机客户端没有发送 (感兴趣但是被阻塞)
O = 开放式未阻塞
P = 使用μTP协议连接,兼具TCP的可靠性及UDP的连接性
S = 对方被置于等待状态
I = 对方为一个连入连接
K = 对方没有阻塞本机客户端, 但是本机客户端不感兴趣
? = 本机客户端没有阻塞对方, 但是对方不敢兴趣
X = 对方位于通过来源交换获取到的用户列表中 (PEX)
H = 对方已被通过 DHT 获取.
E = 对方使用了协议加密功能 (所有流量)
e = 对方使用了协议加密功能 (握手时)
L = 对方为本地/内网用户 (通过网络广播发现或位于同一网段中)

NAT类型

NAT类型概述以及提升NAT类型的方法对NAT类型做了简要的介绍

NAT对PT的影响是很大的,如基于OpenWrt的Linux路由使用netfilter的MASQUERADE实现的NAT的默认类型是Symmetric NAT,或者称为NAT4,是对传入连接最不友好的一种NAT,IPv4的解决办法:

Chion82/netfilter-full-cone-nat写了从DNAT到netfilter内核子系统,浅谈Linux的Full Cone NAT实现,而LGA1150为OpenWrt做了Netfilter and iptables extension

然而,教育网主要还是IPv6,IPv6的Full Cone NAT还没见过,暂时只有ipv6 NAT后配置端口转发

从WiFi速率到无线通信

By: Erease
9 September 2019 at 08:00

各种WiFi的速率是怎么来的?WiFi的速度靠什么提高?如何理解和应用相关理论来改善网络质量?业余理解

缘起于Win10显示的图书馆的WiFi信息

1568137490504

5GHz,165信道,WiFi 4???这个是什么情况呢,是不是有哪里显示错了?然后就是速率最高只有144MHz,这个速率又是怎么来的?

从网络协商速率开始

tnext wifi linkspeed

这里以802.11AC 1T1R MCS9 HT80 带宽Short GI为例计算网络连接速率,由上面的公式以及下面的引用可以知道:

\[Rate HT80 = (234MHz* 8bit *5/6 )/(3.2us + 0.4us)= 433.33Mbps\]

这个也就是最常见的单天线的5G WiFi速率,大概的解释如下

80MHz中一个符号有234个数据子载波,使用256QAM时每个子载波每次传输8bits数据,编码率为5/6,而传输时间等于符号持续时间加上保护间隔

802.11ax子载波带宽

从OpenWrt主页的Associated Stations右侧的字段的含义又是什么呢?

650.0 Mbit/s, 80MHz, VHT-MCS 7, VHT-NSS 2, Short GI
650.0 Mbit/s, 80MHz, VHT-MCS 7, VHT-NSS 2, Short GI

我按照个人理解的通信流程整理下,水平有限…

通信部分的概念

把速率计算公式根据后面的原理部分化简一下: \(\begin{align}Rate & =(N_{sub}\times log(N_{QAM}) \times R_{coding})/(N_{sub}/N_{HT}+GI) \\& =\frac{log(N_{QAM}) \times R_{coding}}{1/N_{HT}+GI/N_{sub}}\end{align} \\\) 其中$N_{sub}$为子载波数,$N_{HT}$为频宽

提高网络速率的方法可以粗略的归结到各个子项上面

物理层

频段与频宽

WiFi所用的频段主要是三个,下图也列出了不同的频宽下选择某个信道对频段的占用情况

802.11n: 2.4G频段

img

每相邻的2个信道之间的频宽就是5Mhz,最大频宽为40MHz,对于国内的2.4G只有1-13信道可以用,用1信道,频宽为20Mhz,则信道2,3,4,5都被占用了;如果是40Mhz,侧信道2,3,4,5,6,7,8,9也被占用了,当然只在传输数据时才会占用的。这就为什么在家附近因有大量wifi造成网络堵塞缓慢的原因了。

802.11ac: 5G频段

1568145613985

中国WIFI设备在5GHz下可以使用的信道有36,40, 44, 48, 52, 56, 60, 64, 149,153, 157, 161, 165。而每个信道频宽为20Mhz,如果信道为149,当要用80Mhz时,则153,157,161都要被占用了

802.11ad: 60G频段,近距离高速无线传输专用,现在基本上见不到了

802.11ax: WiFi 6的频段依然是之前的2.4G和5G频段,主要是把最大频宽定在了160MHz

比较有趣的是某个WiFi对频宽的占用越大,有效的传输距离越短,对环境的干扰越小,最后又作用与可以占用更大的频宽来做近距离的高速传输,故各种规格的WiFi是可以和谐共处的

MIMO技术

通过多条通道来发送数据,常用 nTnR,或者 n x n 来表示,比如说2T2R也就是2x2 MIMO,以及OpenWrt上用的NSS:Number of spatial streams后接数字表示空间流的数目

看起来是最简单粗暴的提高无线速率的方式,然而实际上会遇到多径效应导致高误码率,最终还是采取了一系列的措施来尽量克服多径效应

FEC:QAM

FEC (Forward Error Correction):按照无线通信的基本原理,为了使信息适合在无线信道这样不可靠的媒介中传递,发射端将把信息进行编码并携带冗余信息,以提高系统的纠错能力,使接收端能够恢复原始信息。

正交幅度调制QAMQuadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制调制方式。这两个载波通常是相位差为90(π/2)的正弦波,因此被称作正交载波,这种调制方式因此而得名

802.11n所采用的QAM-64的编码机制可以将编码率(有效信息和整个编码的比率)从3/4 提高到5/6。所以,对于一条空间流,在MIMO-OFDM基础之上,物理速率从58.5提高到了65Mbps(即58.5乘5/6除以3/4)

QAM编码是用星座图(点阵图)来做数据的调制解调,实际应用中是2的N次方的关系。比如说16-QAM ,16是2的4次方,一次就可以传输4个bit的数据;802.11n是64-QAM ,是2的6次方,因此在64个点阵的一个星座集合里面,用任意一个点可以携带六个bit的数据信息

到了802.11ac,就变成了256-QAM,是2的8次方,802.11ac相对于802.11n在编码上面的速率提升了33%。802.11ax之后引入了更高阶的编码,就是2的10次方,1024-QAM

我们都知道从8到10的提升是25%,也就是相对于802.11ac来说,802.11ax的性能又提高了25%,变成了1024-QAM,一个符号可以携带10个bit的数据

img

MIMO-OFDM

在室内等典型应用环境下,由于多径效应的影响,信号在接收侧很容易发生(ISI),从而导致高误码率。OFDM调制技术是将一个物理信道划分为多个子载体(sub-carrier),将高速率的数据流调制成多个较低速率的子数据流,通过这些子载体进行通讯,从而减少ISI机会,提高物理层吞吐。

用于Wi-Fi通信的有OFDM和OFDMA技术:802.11a/g/n/ac无线电当前使用正交频分复用(OFDM)用于802.11频率上的单用户传输,将比特串流对应到QAM调制的符号

子载波的分类

OFDM有三种类型的子载波,如下所示:

数据子载波:这些子载波将使用与802.11ac相同的调制和编码方案(MCS)以及两个新的MCS,并添加1024-QAM

导频子载波:导频子载波不携带调制数据;它们用于接收器和发射器之间的同步

未使用的子载波:剩余的未使用的子载波主要用作保护载波或空子载波以抵抗来自相邻信道或子信道的干扰

例如:20 MHz 802.11n/ac 信道由64个子载波组成——52个子载波用于承载调制数据; 4个子载波用作导频载波;8个子载波用作保护频带;每个OFDM子载波的宽度是20MHz/64=312.5KHz。

TNEXT 802.11 OFDM

不同频宽的数据子载波的数量(第三列)关系见下表

802.11ac 子载波数参数

OFDM符号持续时间

把每个子载波传输的内容是一个符号(比如QAM调制的结果),由于把一个载波分为了多个子载波并行处理,符号持续时间隔也就是处理单个子载波的时间, 为实现最大频谱效率,一般取符号持续时间=1/子载波间隔 ,对802.11 n/ac,符号持续时间为 3.2us=1/312.5

保护间隔

Short Guard Interval (GI),由于多径效应(即使单路传输也存在)的影响,信息符号(Information Symbol)将通过多条路径传递,可能会发生彼此碰撞,导致ISI干扰。为此,802.11a/g标准要求在发送信息符号时,必须保证在信息符号之间存在800 ns的时间间隔,这个间隔被称为Guard Interval (GI)。802.11n仍然使用缺省使用800 ns GI

当多径效应不是很严重时,用户可以将该间隔配置为400ns(=0.4us即Short GI),对于一条空间流,可以将吞吐提高近10%,即从65Mbps提高到72.2 Mbps。对于多径效应较明显的环境,不建议使用Short Guard Interval (Short GI)

预设的调制和编码方案

HT/VHT/HEW

分别对应802.11 n/ac/ax,指的是高、超高吞吐,高效无线网络(High-Efficiency Wireless - HEW),后接数字指示频宽

MCS

MCS (Modulation Coding Scheme)调制和编码方案

在802.11a/b/g时代,配置AP工作的速率非常简单,只要指定特定radio类型(802.11a/b/g)所使用的速率集,速率范围从1Mbps到54Mbps,一共有12种可能的物理速率。

到了802.11n时代,由于物理速率依赖于调制方法、编码率、空间流数量、是否40MHz绑定等多个因素。这些影响吞吐的因素组合在一起,将产生非常多的物理速率供选择使用。比如基于Short GI,40MHz绑定等技术,在4条空间流的条件下,物理速率可以达到600Mbps(即4*150)

为此,802.11n提出了MCS的概念。MCS可以理解为这些影响速率因素的完整组合,每种组合用整数来唯一标示,于是就有了下表

ieee-802-11n-ac-modulation-coding-schemes

至于802.11ax暂时作为上面的补充,添加了MCS10,11

TNEXT 802.11ax速率表

回到最开始的问题

把本文最开始的OpenWrt的截图中的VHT-MCS 9对应过来就可以很方便的查到是866.7Mbps的速率

对于斐讯K3的5G速率可以由 256-QAM 4ss 80MHz SGI来计算1024QAM的速率,即由8bit到10bit,增加25%的速率,大约2100Mbps

144Mbps的由来,可以在Spatial Streams = 2的几行中找到对应的HT20-MCS 15 SGI以及VHT20-MCS 7 SGI,也就是说两种都有可能,后面我还是拿专业点的软件测试了下,确实是5G的WiFi,参考下表就有该5G WiFi不符合WiFi 5的标准,降为WiFi 4情有可原,只是后面那个802.11n就有些尴尬了

1568200987531

学校的AP是双频的,因为AP数量比较多,组网的时候几乎全频段都有,所以每个频段的频宽都设置的比较低以避免互相干扰,144Mpbs的协商速率对单设备限制50Mbps的情况足够了

另外有了上面的一些基础概念之后,方便选择合适的路由器和网卡,尤其是在当前这个向WiFi 6 过渡的阶段

WiFi 6的新特性

img

▲802.11ax技术构成模块示意图

TP-LINK的官网已经有比较简洁美观的介绍了,本文就接着上文提到的部分加以延伸

MU-MIMO

MU-MIMO 即Multi-User Multiple-Input Multiple-Output 的缩写,直译为“多用户 多输入 多输出”, 是最新Wi-Fi技术标准802.11ac Wave 2(即802.11ac 2.0标准)的最重要特性之一

802.11ax设备借鉴了802.11ac的部署经验,将使用波束成形技术同步将数据包发送至不同空间的用户。 换言之,AP会计算每个用户的信道矩阵,并同时将波束导向不同的用户——每路波束包含针对其目标用户的特定数据包。 802.11ax一次可支持8个多用户MIMO传输包的发送,而802.11ac一次可支持4个MIMO数据包。 而且,每次MU-MIMO传输都可能有自己的调制和解码集(MCS)和不同数量的空间串流。 以此类推,当使用MU-MIMO空间复用时,接入点会与以太网交换机进行比较,将冲突域从大型计算机网络缩小至单个端口。

作为MU-MIMO上行方向的新增功能,AP将通过一个触发帧从每个STA发起上行同步传输。 当多个用户及其数据包同时响应时,AP将信道矩阵应用于所接收的波束并将每个上行波束包含的信息分开, 同时它还可能发起上行多用户传输,从而接收来自所有参与STA的波束形成反馈信息

img

至于MU-MIMO的实际情况可以参考有关的测试:ACWIFI

OFDMA

802.11ax无线电可以利用正交频分多址(OFDMA) ,其是OFDM数字调制技术的多用户版本。OFDMA将信道细分为较小的频率分配,称为资源单元(RU)。

OFDM和OFDMA都通过称为逆快速傅立叶变换(IFFT)的数学函数将信道划分为子载波。子载波的间隔是正交的,因此尽管它们之间缺少保护带,它们也不会相互干扰。

img

通过细分信道,可以同时发生小帧到多个用户的并行传输。每个资源单元内的数据和导频子载波在OFDMA信道内都是相邻且连续的

802.11 OFDMA

802.11ax引入了更长的12.8μs的OFDM符号时间,这是传统符号时间3.2μs的四倍。子载波间隔等于符号时间的倒数。由于符号时间较长,子载波大小和间隔从312.5KHz降低到78.125KHz。窄子载波间隔允许更好的均衡并因此增强信道鲁棒性。

上面提到的OFDMA规格对理论速率提升约为10%

MU-OFDMA

802.11ax标准借鉴4G蜂窝技术的技术进步,在相同信道带宽中服务更多用户的另一技术是: 正交频分多址(OFDMA)。 基于802.11ac已经使用的现有正交频分多路复用(OFDM)数字调制方案,802.11ax标准进一步将特定的子载波集分配给个体用户, 即,它将现有的802.11信道(20、40、80和160MHz频宽)分为带有预定义数量的副载波的更小子信道。 802.11ax标准还借用现代LTE术语,将最小子信道称为资源单元(RU),最少包含26个副载波。

密集用户环境下,许多用户通常无力争夺信道的使用机会,现在正交频分多址使用更小巧——但更具专用性的子信道同时服务多个用户,因此提升了每个用户的平均数据吞吐量。 802.11ax系统可能通过不同的资源单元规模实现信道的多路复用。注意,对于每20MHz带宽,信道的最小部分可容纳9个用户

img

imgimg

AP依据多个用户的通信需求决定如何分配信道,始终在下行方向分配所有可用的资源单元。 它可能一次将整个信道仅分配给一个用户——与802.11ac当前功能相同——或者它可能对其进行分区,以便同时服务多个用户。

img

BSS Color

BBS(Base Service Station) Color, 基于色码的空间复用,为了改善密集部署场景中的系统层级性能以及频谱资源的使用效率,802.11ax标准实现了空间重用技术。 STA可以识别来自重叠基本服务集(BSS)的信号,并根据这项信息来做出媒体竞争和干扰管理决策。

这部分和速率关系不大

信号质量与无线速率

信号的衡量标准

一般我们都会有个信号强弱的标准,比如常用的WiFi和Cellular的Icon上被填满的图标面积,然而打开一些调试工具看到的是dbm这个单位,例如在OpenWrt的Wireless详情中有: Tx-Power: 23 dBm Signal: -64 dBm | Noise: 0 dBm Tx-Power指的是路由器信号的发射功率,无线功率一般以mw为单位,但是因为WiFi信号的能量通常为mw级,因此业界将WIFI信号大小表示为与1mw的强度比,用dbm来表示,对应关系是 \(signal=10log(\frac{P}{1mw})\) 这就有个非常方便的计算方式:

降低3dBm,是指信号强度降低到原先的1/2(二分之一)。

降低10dBm,是指信号强度降低到原先的1/10(十分之一)。

降低30dBm,是指信号强度降低到原先的1/1000(千分之一)。

有了这个之后,可以对信号的强度做一个大致的判断: 下图来自RSSI等级和信号强度

使用上图来源的网站提供的软件可以绘制出一个大致的信号强度分布图,可以参考来的调整AP的位置

除了dbm表示无线的收发功率之外,还要考虑到信道中的信噪比(SNR),噪声也可以使用dbm为单位,所以计算dbm为SNR单位的时候把二者相减即可

与无线速率的关系

首先是会影响到协商速率,在发射端的信号到接收端,中间存在衰减和损失,其对通信的影响就是会产生高误码率,故为了达到可靠通信的需求需要采取高纠错性能的编码和调制方式,也就是影响到MCS,进而影响到协商速率和实际传输速率,而调整的标准就看设备的厂商的调教了

应用

有了上述的铺垫,就有了一些改善无线网络质量的途径,但是最重要的还是认清现实,理性对待

频段

因为某一个频段内的信道容量有限,在拥挤的时候噪声也多,故在选择频段的时候,尽可能的避开当前区域拥挤的信道,可以使用路由器的无线桥接功能(wireless scan)工具,查看路由器附近的信道占用的情况,或者用Netspot工具检测当前区域网络情况

特别说明的是2.4G频段已经相当的拥挤了,对于有高可靠性网络环境要求的情况,建议还是网线或者使用5G频段

提高发射功率

这里可以说是个经验上的技巧,首先,路由器的发射功率是受到国家标准的严格限制的,但是对于某些可以切换无线地区的路由器来说,可以通过该途径来提高发射功率,或者使用某些频段进而提高发射功率

使用高增益的天线,使用内置信号放大器的AP也是同样的逻辑

增加AP

Mesh,信号放大器,主路由+AP,无线漫游都是类似的途径,高端的设备往往配备了更好的硬件和算法,这点也是毋庸置疑的

参考

802.11 WiFi协议浅析

802.11ax高效率无线标准介绍-National Instruments

第七代无线技术802.11ax详解

02.11ax 11ac 11n WiFi全速率表

简说各种wifi无线协议的传输速率

IEEE 802.11理论速率计算

❌
❌