惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
博客园 - 【当耐特】
D
Docker
Y
Y Combinator Blog
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
B
Blog
The GitHub Blog
The GitHub Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
爱范儿
爱范儿
A
About on SuperTechFans
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测
可以在家学会的网络技术(一):HTTP
韩大 · 2024-05-11 · via 机核

前言

上大学的时候,为了能在宿舍电脑之间架个局域网打“红色警戒”,硬着头皮自己去买网卡、同轴电缆、集线器、双绞线。那个时候上网还很困难,网络知识的资料非常少。那个时候的网卡附带的说明书,上面记载了双绞线的排布方法,当时的我一直收藏着这只有一页的说明书,如获至宝。时隔多年,现在网上的资料非常多了,但是网络知识的入门教程,特别是可以立刻动手尝试一下的教程,还是不很多。所以我想从我自己的学习过程作为依据,整理一下整个知识体系,帮助后来者减少中间走的弯路。

很多介绍网络知识的书籍,一上来就会给出上面这个图,初学者一看就懵逼了,这里面的字眼,没一个是知道啥意思的。所以我希望通过大家日常使用的软件,来一一介绍,希望看完本文,最后再回过头看这个图,能理解这个图是啥意思。我会根据这个图,从上往下来介绍。

浏览器和网站

我们日常使用网络最常见的过程,就是打开一个浏览器,然后输入一个网址。我们可以通过稍微深入一点点的去观察这个过程,来学习一部分网络知识。这次我们可以学到以下技术的关系:

HTTP\MIME\HTML

让我们用 Chrome 浏览器在电脑上打开一个网站,但在此之前,稍微做一点点准备。我们需要先打开浏览器的“开发者工具”:右上角三个点 → 更多工具 → 开发者工具。

在打开的窗口中,找到Network标签,需要注意看一下,左边是否有一个红色的圈圈里面有一个红色的正方形。这个状态表示“开发者工具”会记录从网络上首发的数据原文,也是我们得以探索网络知识的来源。

现在在浏览器的地址栏输入这个地址:https://www.lua.org/,这是我在网上找的一个相对简单的页面,以便观察学习用。

你应该能看到以上两个图的内容。一个是日常浏览器我们常见的显示内容;另外一个开发者工具中,会显示打开本次网站,网络上到底发生了什么事情的信息——浏览器从网站上下载了好几个文件:

  • www.lua.org:这是一个 HTML 的文档,包含了这个页面的文字内容和整体图文排版

  • lua30.gif:这是页面中左边蓝色写着“Lua”的那个图片

  • puc.jpg:页面右边灰色的写着“PUC”的图片

  • lua.css:一个控制页面字体等格式的文件

  • favicon.ico:出现在浏览器标签页左边的图标

在上面的表格里面,还记录了下载的耗时、下载的文件的大小。譬如www.lua.org这个页面,下载的大小就是 219 个字节,耗时 474 毫秒。现在我们知道了浏览器打开页面,是会下载几个文件的,但是具体是怎么下载的呢?我们可以进一步深入探索一下。

我们点击一下www.lua.org,可以看到右面出现了一个窗口,上面分为 Headers/Preview/Response 等分页。其中 Headers 分页,就包含了“如何下载文件”的信息,而这套下载文件的方法,有一个特别的名字,称为 HTTP (Hypertext Transfer Protocol),分页这里的 Headers 指的正是 HTTP 协议中的“头部信息”,这些信息详细描述了下载一个文件的方法。为了更清晰的看到这个过程,我们需要把Response HeadersRequest Headers旁边两个Raw的框框勾选上,查看最原始的网络报文。

当我们在浏览器的地址栏输入一个网址后,浏览器就会向网站服务器发出一个请求,请求的内容就是这里Request Headers所显示的内容。这些内容完全就是以文本形式(和你用记事本里面写的文字的格式一样),一行行的组织起来,发给服务器。

需要注意的有以下两行:

  • GET / HTTP/1.1 这一行表示需要下载一个路径为 "/" 的文件。如果我们输入的地址是 www.lug.org/index.html,那么这里发送的请求将会是 GET /index.html HTTP/1.1

  • Host: www.lua.org 这一行表示我们请求的网站域名是 www.lua.org,这个是在地址栏输入来确定的。(由于一个网站服务器可以承担多个域名的请求,所以请求的具体哪个域名,是需要明确的在请求报文中写出来的)

对于服务器网站的返回,是比较复杂的。这种返回一般分为“头部”(Header)和“身体”(Body)两个部分,“头部”是纯文本的,一行行的发回来;“身体”则是跟具体下载的文件内容有关。现在我们请求的是一个网站页面,所以也是文本的。

响应的 Header 表示了下载文件的情况、类型、大小:

  • HTTP/1.1 200 OK:这里的 200 被成为“响应码”,代表这次下载是否成功,200 这个数字就是成功的意思。另外一个广为人知的响应码是 404,表示你要下载的文件在服务器上找不到。(可能是网页文件被删除了,但是指向这个页面的链接还在)当然还有很多其他的响应码,譬如 500 表示服务器程序出错了,304 表示有缓存等等……

  • Content-Type: text/html:这个表示本次下载的文件内容的类型,浏览器是一个强大的软件,支持显示各种格式的文件,除了 html 格式网页以外,也支持多种图片、音乐、视频等等,如果服务器返回了一个浏览器不认识的格式,譬如 application/unknown 之类的,浏览器会提示用户是否要“下载这个文件”,让用户自己找其他程序去打开这个文件。当然我们这里的例子,是一个页面,text 是主类型,表示是文本文件,html 是子类型,表示是一个网页。

  • Content-Length: 2799:这个表示下载的文件的长度,2799 表示需要 2799 字节。由于网络下载是需要时间的,所以浏览器会一直等待,从网络上下载了 2799 字节的数据之后,才认为这个文件下载完成了,否则浏览器的地址栏会一直有一个“转圈”的图标表示正在下载。

除了上面提到的 Header 以外,其他的 Header 也各自有不同的功能,这些功能很多是不会被显示在网页内容上的,但也是非常重要的。

下面我们来看看响应的“身体”部分:

这部分内容是一个文本文件,以 HTML 这种格式编写的网页。这些文本会确定网页要显示什么内容,里面也会包含其他网页的跳转链接,还有图片的链接等等。浏览器读取到图片的链接的时候,就会再次向服务器发起一次下载请求。因此我们才看到除了 www.lua.org 的下载记录以外,还有 lua30.gif 和 puc.jpg 的下载记录。我们可以看到下载图片的地址写的是 images/lua30.gifimages/puc.jpg。我们还可以看一下这两个文件的下载记录,可以看到和上述类似的过程。

下载的图片也可以在开发者工具查看到:

从 Header 里面看到 GET /images/lua30.gif HTTP/1.1 里面的文件路径,和之前 HTML 中写的图片地址 <IMG SRC="images/lua30.gif ...>的文件路径一致。而响应的 Header 中,用image/gif来告诉浏览器,这个文件的主类型是 image,子类型是 gif。浏览器就根据这个类型信息来决定如何处理,在这里就是显示这个图片。决定浏览器如何显示文件的指令,并不是根据文件名的后缀 .gif,而是根据响应的 Content-Type 的 Header 的内容。根据响应 Header 中的 Content-Length: 187020,浏览器会下载后续的 187020 个字节的数据,作为 gif 格式图片的内容,然后显示这个图片。

对于 Content-Type 的内容,有一个专门的术语来代表:MIME(Multipurpose Internet Mail Extensions),意思是多用途互联网邮件扩展。这套描述数据内容格式的标准,同时也在电子邮件系统中使用,我们可以在电子邮件中插入各种格式的文件附件。

至此,我们大体的了解了 HTTP 协议的内容。总结一下,就是:

  1. 浏览器和网站服务器是通过一个请求,对应一个响应进行通信的。不同于 QQ、微信、网络游戏这类软件,它们可以同时进行数据的收、发,而无需请求后等待一个响应。

  2. 请求和响应都由一系列的文本文字,一行行的组成 Header 部分,用于指定要下载的文件,以及返回文件的类型、大小。Header 还被用于其他很多功能,譬如缓存控制、Cookies 跟踪等等。

  3. 响应的 Body 部分直接是下载文件的数据内容,很多时候并没有进行其他编码。最常见的是文本的 HTML 内容。

但是,我们还有一个问题没有提及,就是我们去请求的网站服务器,到底是一个什么东西?为什么输入一个域名,就可以联系到一个具体的网站服务器了呢?

这个问题下篇介绍,由此我们可以进入 TCP/IP 的世界。