一个网络请求的冒险之旅
文 寒食君 | 图 《true detective》
这是「编程迷踪」系列的第二篇文章。
对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑、手机、电视这些设备到底是如何被“连接”起来的。
人们动动手指,点点鼠标,图片、视频便顺理成章地即时显示在屏幕上。只是,这一切并非理所应当,五光十色的互联网世界之下,是我们在夜以继日地工作。
我是一个普通的网络请求。我很渺小,但始终都在履行责任——寻找被指定的资源,再将它们交付到我的主人手中。就像这座城市中成千上万而又默默无闻的快递小哥,穿梭在大厦与楼宇之间,完成使命。
不同的是,真正的网络环境可不像现代化城市那么光鲜亮丽。它阴暗、潮湿,充满了未知的危险,如同一座黑暗森林。而我要做的,就是一场不折不扣的冒险。
1 URL与IP到底是什么?
我的冒险,要从一张“羊皮卷”说起。那天,浏览器大叔神秘兮兮招呼我过去,告诉我CPU下达了一个命令:派遣使者访问外邦。而我是大叔最得力的门生,也是这类任务最合适的人选。大叔为我准备了一张羊皮卷,上面记录了我这次冒险需要用到的必要信息。
当仁不让地,我接过了它,即刻启程。
我缓缓展开羊皮卷,第一行赫然写着:URL: https://mail.google.com
什么是“URL”?我在脑中快速回忆着,对了!URL即 Uniform Resource Locator的缩写,翻译成中文便是“统一资源定位符”。因为互联网世界存在着不计其数的资源,每一处资源都需要有一个标记来定位它,正如人类城市中的门牌号。
有人可能会认为,既然有了门牌号,找到指定地点不是轻而易举吗?朋友们,我也希望如此,但现实往往没有这么简单。
即使有了URL,恕我愚笨,我还是无法直接理解它所指向的目的地。因为这是人类的语言,我无法翻译解读。(其实是人类太笨了,记不住IP地址,需要用方便记忆的域名来代替)
对我来说,IP地址才是唯一的坐标。什么是IP?IP即Internet Protocol的缩写,中文译为“互联网协议”,一个如雷贯耳的名字,互联网的基石之一,一切依赖互联网通信的软件都得遵循这个协议。
那么,如何才能将域名转换为IP地址呢?
浏览器大叔在平日工作之余,十分细心,他将用户访问过的站点整理了一份“域名-IP对应清单”。假如是一个已被记录的IP地址,那么他会直接告诉我,我可以立即向着目标IP地址出发,这就是浏览器缓存的作用。
假如用户输入的URL不在浏览器的记录范围之内,那么操作系统会查找一个名为“hosts”的文件。它是一份文本,记录了域名和IP地址的映射。如果“hosts”能够告诉我目标IP地址,那也能节省我不少工夫。这就是系统缓存。
此外,还有路由器缓存,相信不用我多介绍了,即保存在路由器中的域名-IP映射。
这些缓存都能有效帮助我以最快的速度找到相应的IP地址。但是,互联网世界日新月异,各种资源层出不穷。在很多情况下,用户会想要访问一个全新的,任何缓存都没有记录过的域名。
为此,人类专门设计了DNS。在这次任务中,我的第一站,就是赶往DNS。为了更短的响应时间与更好的用户体验,我快马加鞭。
2 关于DNS劫持的记忆
DNS是什么?全称Domain Name System,是一个将域名和IP相互映射的分布式数据库。
全球有很多家DNS服务中心,假如你关心过你的计算机,你会发现,在你的网卡上,有着一项“DNS服务器”的配置项,它设定了我将要抵达的目的地。
一转眼的工夫,我来到了114.114.114.114DNS中心。
这个地方我来过很多次,表面上风平浪静,实则暗流涌动。我小心翼翼地来到办事大厅,不禁想起了我第一次被DNS劫持的经历。
那天,我来到办事窗口,柜员热情地接待了我。
“先生,请问你想要查询哪个地址?”当时我还是一位新晋的网络请求,涉世尚浅,不知晓一些不可说的条例,于是毫不避讳地回答:“你好,我要去大名鼎鼎的mail.google.com!”
柜员的表情一下子凝固了,他上下打量了我一番,然后硬挤出一丝微笑,“好的先生,请稍等。”说完,他便向旁边的同事使了个眼色。我正纳闷呢,突然两边窜出身材魁梧的警卫,架着我强行往一处拖拽。
我这才意识到大事不妙,“这是怎么回事?!你们凭什么劫持我?”我发疯了一般嘶吼着。
“你好,根据本ISP(电信运营商)颁布的条例,世界上不存在你所说的站点,现怀疑你是一个不合规的网络请求,将把你转发至baidu.com的IP地址。你有权保持沉默!”警卫冷漠地望着我。
我知道,现在无论如何解释、挣扎都没有用了,只怪自己太年轻。无奈,我只好乖乖就范。
还好当时正在使用计算机的用户有一些网络知识,当他发现自己输入的是google,返回的是baidu的页面时,并没有怪罪于我,大概是他心中已经猜到了原因。于是他将网卡的DNS配置为:8.8.8.8,这是一个国际上“不存在”的公司提供的DNS服务中心。
仅仅这样就能畅通无阻地访问互联网了吗?经历了被DNS劫持,我依然不敢放松。
3. 我遇到过DNS投毒
还未休息片刻,浏览器大叔再一次地给我分配了任务:继续尝试请求mail.google.com的资源。
人类出国要坐飞机,要办护照。我们网络请求也是这样,全国只有在几个主要城市才会部署国际出口,所有访问境外资源的网络请求,都得经过这儿接受检查。
与上次不同,因为这次我要访问的DNS服务器位于海外,所以我首先来到了大中华局域网的上海国际出口。
我一路奔波到上海真的是又累又乏,正当我火急火燎地准备过安检,通道附近有一位穿着制服的小伙迎了上来。
还没等我开口,他热情地迎了上来:“欧~ 远道而来的朋友,一定是十分疲惫了吧?天气这么热,先喝杯水吧!”我悄悄地打量着他,看他的打扮应该是一位服务人员。
“国际出口就是不一样啊,服务真到位!”由于确实是太渴了,我放松了警惕。“啊,真清凉,谢...”我一边感叹着,一边接过了小伙递给我的水。
可当我第二个“谢”字还没说出口,立即感到一阵头晕目眩。
“不好!遇上了黑客,这是DNS投毒!”我的视线渐渐模糊,小伙的微笑也渐渐似乎变成了狞笑。我尽力搜索着脑海中和这一切有关的知识,想要知道寻求的办法。
DNS投毒,英文叫DNS cache poisoning,也叫做DNS污染。从客户端向DNS服务器发出查询IP的请求,到响应返回到客户端的这段时间里,如果有黑客或者其他一些不可说的设施伪造返回了一个错误的DNS应答,那么用户将不能访问到真正的资源。
想到这里,我已经明显感觉难以控制自己的身体了,眼前一黑,就什么都不知道了。
3 DNS正常解析
以前发生过的险情历历在目,如今想起来,我依旧心有余悸。这次,为了确保万无一失,我打起了十二分精神。
这次,我已经顺利来到8.8.8.8 DNS服务中心。
“你好亲,有什么可以帮到您的嘛”办事窗口内传来了软妹子的声音。
“我想查询域名mail.google.com的IP地址。”我试探性地问,依然不敢松懈。
“好的呢亲,这边通过树状检索,在顶级域名com
下,查询到google
目录,在google
目录下查询到mail
,IP地址是xx.xxx.xx.xx呢。”
我松了口气,谢天谢地,终于拿到了结果。可我知道作为一次完整的网络请求,这刚刚开始,这才是万里长征第一步,我得赶紧将这个解析结果带回去,等会还得马不停蹄往返三次建立连接。
推荐阅读:
1、50 道网络面试题及答案(上)
2、50 道网络面试题及答案(下)
3、推荐十款Linux网络监视工具
4、Linux基础网络设置及搭建DHCP服务
5、计算机网络基础知识总结
6、玩转 Linux 环境下日期的语法
7、Linux 性能监控、测试、优化工具
8、面试Linux运维工作至少需要知道哪些知识?
资源分享:
T级技术资源大放送!包括但不限于:Linux、Python、Java、前端、测试、大数据、人工智能等,具体获取方式请点击下方链接进行查看~资料大放送①期 | 这份资料很特别!
一个网络请求的冒险之旅相关推荐
- 一个网络请求的历险之旅
本文来自公众号 "寒食君" 的投稿 对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑.手机.电视这些设备到底是如何被"连接"起来的. 人们动动手指,点点鼠 ...
- Android:面试官死亡问答,如何优化一个网络请求?大牛多个网络优化方案帮你解决!
面试官:小萧啊,我好想你啊,你都好久没来找我面试了呀. 小萧:emmmmmmm,这不是怕被你打击吗. 面试官:ok,看来是有备而来,那么我们今天聊聊网络优化咋做吧. 小萧:我大意了,没有闪.老头子,你 ...
- Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架
Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架 公司里的老代码用的网络请求框架技术都比较老,为了快速搭建一个网络请求框架,提高工作效率,记录一下用jetp ...
- 04、用浏览器显示一个网页时,是否只发了一个网络请求给服务器?
目录 服务器 思考 服务器 用户量.数据访问量越大,对服务器的性能要求越高 当我们在浏览器上输入网址的时候,比如baidu.com,那就会发送请求给这个服务器,如果同时有一亿个用户在浏览器输入百度网址 ...
- 如何独立开发一个网络请求框架
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 目录: 前言 准备工作 开发模式 开发原则 线程 高并发 TCP/UDP 本类介绍 开发选择 功能列表 ...
- EvolvingNetLib,嗯,一个网络请求库而已
Evolving,取为进化之意,仍然是一个新生儿,愿景是提供尽可能多的通用网络业务处理,同时留给开发人员更多的可定制型,减少捆绑,使得开发人员能够将更多的精力放在具体业务逻辑,无需对网络请求处理耗费过 ...
- 模仿Retrofit封装一个使用更简单的网络请求框架
本文已授权微信公众号:郭霖 在微信公众号平台原创首发.会用Retrofit了?你也能自己动手写一个! 前言 想封装一套网络请求,不想直接上来就用别人写好的,或者说对项目可以更好的掌控,所以自己模仿着 ...
- java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...
轻量级网络请求框架MyHttputils 一.前言 本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高.效率显著提升.(但是使用风格基本没变哦) 2.0.2版 ...
- vue 网络请求 axios vue POST请求 vue GET请求 代码示例
QQ技术交流群 173683866 526474645 欢迎加入交流讨论,打广告的一律飞机票 1.安装 axios 和 vue-axios 和 qs (qs是为了解决post默认使用的是x-www-f ...
最新文章
- Maven3.x 插件开发入门
- 调试了半天,全都是复制代码惹得祸!
- 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你
- GNU/CPIO 学习小结
- Cookie和会话Session
- python中变量名后的逗号_深入浅析python变量加逗号,的含义
- 设计模式学习笔记一——开篇
- 确认! Python再次夺冠,老码农:崩溃!
- 三位数倒序数C语言,C语言求助!一个三位数的逆序数,总是编不对
- 数据结构拾遗(1) --红黑树的设计与实现(上)
- BuddyPress安装指南
- 大数据开发笔记(一):HDFS介绍
- mac电脑更新后,如何解决mac在文件夹中无权限新建文件?
- 继续SecureString
- 【MySQL】新闻发布系统数据库设计
- SCARA机械臂逆运动推导
- 百度编辑器ueditor-在线图片管理,想修改下默认的排序管理
- linux操作系统安全防护
- windows平台查看CPU支持的指令集 代码:__cpuid,__cpuidex
- 软件系统的服务器环境,服务器软件环境操作系统