URL\DNS\TCP\IP\Port
我们先来研究一下我们在浏览器输入栏填写的“网址”:
https://www.lua.org/
技术上来说,这串字符被称为 URL:统一资源定位符(Uniform Resource Locator)。 上面这个 URL,我们可以分为几段:
https ,这部分被字符 :// 与其他部分隔开。这部分叫做 Scheme ,表示浏览器使用什么方法和服务器通信(也就是协议)。除了 https,浏览器支持的还有 http/ftp/mailto。
www.lua.org ,这部分被字符 / 与其他部分隔开。这部分叫做 Domain Name ,中文称为“域名”,它代表了服务器的地址,浏览器通过这个地址去互联网上找到对应的服务器。这部分也是随后我们需要进一步探索的部分。
/ 后面的部分,虽然啥都没有,也是个一个部分。这部分称为 Path To File ,就是要访问的文件路径。作为网站首页,一般不写的话,会默认为访问 /index.html ,不过这个配置是网站服务器控制的。
我们做的第一个实验,是玩一下 URL:请把 mailto://2740168@qq.com 输入到 Chrome 浏览器的地址栏中,看看会发生什么?
弹出了让你打开邮件客户端,如果你有配置好一个电子邮件账号,就可以直接给 2740168@qq.com 发邮件了。以前好多网站,会把“联系我们”的链接,就写成这种 mailto://xxxx@xxxx.com 的形式,让用户点击之后直接给预设的邮箱地址发邮件。不过现在电子邮件已经很少人用了,所以现在比较少见这样的链接了。
URL 的定义除了我们上面说的三个部分,实际上还有更丰富的含义:
域名部分,有些浏览器还支持直接在 URL 中填入用户名和密码,用来快速进入一个有账号控制的地址,类似: https://username:password@www.xxxxxx.com/ 。
端口 Port 部分(上图写的是 80),是服务器上一个特定的通信参数,这个数字范围 0-65535 的。这个参数控制了浏览器建立 TCP 连接的时候,使用的端口参数,这也是我们下一步要谈论到的一个知识:TCP 协议的通信地址。
路径 Path to the file 部分,一般看起来好像一个文件路径,常用的 Web 服务器软件也会依次作为下载路径的一部分,在设置好的文件路径下开始寻找。如果找不到,就会返回常见的 404 页面。
Parameters 部分,也有叫 Query String 的,这个部分是以问号 ? 开头,用 = 号和 & 号组成的一组字符串。这个往往被一些 Web 应用程序用来作为“动态参数”输入,以前有些在网页上填写的输入框都是以这个方式传到服务上的。
Anchor锚部分,这个部分可以在长长的网页上定位一个位置,让浏览器快速的跳转到那个页面上,大家如果写 html 的话,就可以加入这种“锚点”的标签,让用户点一下跳过去。常见于网页的“回到开头”的链接上。
以上的部分,如果要做个实验来具体的体验,都是可以的,但是有点偏离本文的学习路径,咱们暂时跳过,如果有兴趣的读者可以给我留言,我后面贴一下这些实验的做法也可以。
URL 作为一种广泛应用的互联网资源描述方式,除了用于浏览器以外,很多别的软件也会用,譬如版本管理软件 SVN,我们就能看到类似这样的地址: svn://xxxx.xxxx.xxxx/path/
下面我们专注于“域名”部分。我们今天所使用的互联网,所使用的技术被称为“TCP/IP”网络,而每个网站的域名,都必须要至少对应上 TCP/IP 网络上的一个通信地址。这种通信地址,被称为“IP 地址”(Internet Protocol Address)。我们可以通过一个小工具来看看,刚刚访问的网站,它的 IP 地址是啥。
首先,我们需要调出一个命令行窗口 cmd.exe ,我们可以在 windows 下按快捷键 Win+S,打开"开始菜单"的搜索栏,输入 cmd.exe ,并且启动这个程序。
然后我们可以在那个黑黑的窗口中输入我们的命令行工具,来探索网络了。首先,我们输入命令: ping www.lua.org ,把上面浏览器实验中的网站域名 www.lua.org 作为 ping 命令的参数输入进去,然后按回车。
ping 这个工具,是用来检测 TCP/IP 网络上,某个特定服务器是否能访问的一个小工具。当我们输入了域名或者 IP 地址作为参数,这个工具就会尝试向所指定的互联网地址服务器,发出一些网络数据包。如果目标服务器支持 ping 功能的响应,会原封不动返回 ping 工具发来的数据包,这个时候 ping 软件就能统计这一来一回的时间,并且打印出来。这样我们就能直到,访问目标服务器的延迟时间大概是多少了。上面的例子中,延迟是 162 毫秒(网速还行)。
我们可以发现,在输出的文字中,出现了一串特别的字符: 46.175.8.47 ,这就是 IP 地址。那么,ping 这个软件,是如何知道 www.lua.org 这个域名要转换成 46.175.8.47 这个 IP 地址的呢?——这是通过操作系统(windows)来实现的:操作系统会把 www.lua.org 这个字符串,发到配置好的某个互联网服务器上,查询到对应的 IP 地址。这个过程称为“域名解析”,而提供这个解析的服务,称为 DNS (Domain Name System)。
我们可以通过一些方法,来看一下,我们的 DNS 服务器的 IP 地址是什么。我们找到 windows 的设置面板,然后找到“网络和 Internet”,在“状态”这一栏,找到你上网功能的“属性”部分。
在窗口中一直往下滚动,你就可以看到 DNS 的部分了。
这里显示的 DNS 服务器是: 10.93.128.1 这个地址。实际上,你也可以自己手动去设置不同的 DNS 地址,现在网上也有很多“公益”“开源”的 DNS 服务供大家免费使用,譬如:8.8.8.8,或者中国电信位于广州的 DNS 服务:202.96.128.86。手工设置的截图我也贴一下,不过,如果大家能正常上网玩耍,一般不需要手工修改这个配置。
现在我们上网的路由器一般都提供了自动配置这个参数的功能,避免用户自己去填这个地址填错,导致无法正常上网。
我不厌其烦的贴出上面的截图。是因为后续我们可能需要频繁的打开 windows 操作系统的“网络设置”界面,来做一些有意思的测试。所以先热身一下。
现在我们知道网站域名实际上会被转换成一个 IP 地址,而浏览器本身也是支持直接输入 IP 地址进行访问的,所以我们可以尝试自己做一个简单的 web 服务器,来验证一下上面我们的 HTTP 知识是否正确。
网络服务器除了需要有一个 IP 地址以外,还需要一个程序,使用所谓 TCP(Transmission Control Protocol)协议,来提供网络服务。TCP 协议的能力,我们的 windows 操作系统已经具备了,程序员可以写个程序来使用这个能力。所以我们在开始之前,也需要一个工具,来帮我们做个简单的 TCP 服务。至于什么是 TCP 协议,我们可以在实验中慢慢体会,现在先下载这个叫 NetAssist 的软件,可以从下面的网盘下载,或者网上搜索一下(注意别下载到木马软件了)。
https://pan.baidu.com/s/15m-dzhuRVM3K9qlob8JmEw?pwd=tzmc
这个软件不需要安装,直接双击就可以运行了。然后在软件左上角的“网络设置”中如下填写:
协议类型:TCP Server
本地主机地址:127.0.0.1
本地主机端口:8899
然后点击下面的按钮“打开”。点击之后,可能 windows 会弹出一个你见过的提示窗口,说是有程序要获得什么网络权限之类的,你的“允许”就好了。
以前你可能不知道,为啥有的程序运行的时候会弹出这个窗口,现在可以告诉你,如果有个程序试图启动一个网络服务,也就是监听某个网络端口,windows 出于安全考虑,会用这种方式告诉你。
至此,你就已经启动了一个网络服务。这个网络服务程序就是 NetAssist 这个软件,它使用了 windows 操作系统的网络功能,在 IP 地址 127.0.0.1 上,监听了 8899 端口。
这里的 IP 地址 127.0.0.1 是一个特殊的网络地址,你就算没上网,这个地址也是可以用,而且不需要你配置的,这个地址就是表示当前本地主机,也就是中文的“自己”,或者英文的“me”的意思。你可能发现还可以选择 0.0.0.0 或者另外的一些 IP 地址,这些我们后面会提到都是些啥,现在我们可以先简单的用 127.0.0.1 这个地址。
这里的 8899 端口,是操作系统为了让一台电脑上,多个程序都能使用网络,而编出来的一个号码。任何程序,在使用 TCP/IP 网络功能的时候,都要向操作系统申请一个这样的号码,称为“端口号”。一旦申请成功后,操作系统会检查收到的每个 TCP/IP 协议网络包,通过端口号来确定,把这个网络信息包发给申请的程序。一个程序可以申请一个端口号,也可以申请多个;但一般情况下,不可以多个程序共用一个端口号。端口号的可用范围为 0-65535 我们这里填写的 8899,因为这个数字没其他程序使用,所以操作系统很爽快的让我们申请成功了。——因此 NetAssist 程序,就可以在 127.0.0.1 这个 IP 上,监听所有发往 8899 端口的 TCP 数据了。
下面,我们来准备一段文本数据,作为我们的手搓 WEB 服务器的返回内容。内容就是上面我们分析的 HTTP 协议的报文:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 59
<body>hello <a href="http://www.gcores.com/">fun</a></body>
这个报文构造了一个简单的网页,上面显示了 hello fun 这样一行字,并且 fun 这个词还是个链接,点击会跳去一个有意思的网站。注意这个上面的 Content-Length: 59 是经过计算的,刚好是下面网页内容的长度,如果你修改了下面网页的内容,需要数一下多少个字符,然后修改这个 59 为你真正的内容长度。
接下来,我们打开一个浏览器,譬如 Chrome,在地址栏上输入: http://127.0.0.1:8899 ,然后你会看到浏览器并没返回什么内容,标签页有个转圈的动画,好像正在载入的样子。这个时候,请麻利的拷贝上面我们准备的那段 HTTP 报文,然后麻利的切换到 NetAssist 软件,在右下角“数据发送”窗口,把内容粘贴过去,然后点“发送”。
此时,你就会看到浏览器窗口中,出现了一行字 hello fun ,至此,我们手搓的 Web 服务器实验成功了。你可以在 NetAssist 的窗口中,看到之前我们讨论的 HTTP 请求报文(Headers)。 我们这里使用了 IP+Port 的方式填写 URL 地址,浏览器也是支持。一般情况下,很多网站并不需要填写 Port 端口数据,如果你不填写,在地址以 http 作为 scheme 的情况下,浏览器默认会访问 80 这个端口,如果是 https 作为 scheme,浏览器则会访问 443 端口。至于 https 和 http 的差别,也是一个很有意思的知识,以后有机会聊。
总之,我们现在知道了,所谓网页浏览,基本的过程就是:
有一个软件程序,在连接了 TCP/IP 网络的电脑上运行,监听了某个 IP 和 某个端口
另外一个软件,通过网络,和上面这个软件所运行的 IP 和端口,建立了一个“连接”
发起连接请求的软件(称为客户端,一般是浏览器),向“网络连接”发送了一堆 HTTP 的请求报文信息。
接收到请求的软件(称为服务器端,著名的有 IIS、nginx、apache 等),查看了客户端发来的信息,然后把对应的数据,以 HTTP 响应报文的方式,回写到当前的“网络连接”里面。
我们上面提到的,HTTP 协议里面的各种 Header 所对应的功能,都是客户端和服务器端,互相之间通过建立的 TCP/IP 连接,进行数据传输行为的一些约定。譬如客户端会要求 GET 某个路径(PATH)的文件,服务器就通过传过来的 GET 的文件路径信息,在服务器磁盘的某个地方查找这个文件,然后把文件内容发给客户端。而我们手搓的服务器,不管你要求什么路径的文件,都是返回同样的内容,大家可以尝试修改浏览器的地址栏信息,加上一些如 http://127.0.0.1:8899/aaa/bbb.html 这样的内容进行测试,返回的还是同样的页面内容。
至此,我们大体的体会了一下 TCP/IP 网络功能,和网页功能之间的关系。但是 TCP/IP 并不仅仅可以用于网页浏览服务,我们玩的网络游戏、微信等等很多网络功能,都是使用 TCP/IP 功能的。这些都是通过一些应用程序,使用操作系统的 TCP/IP 功能来实现的。
在刚刚的例子当中,有一个重要的问题没有被讨论:为什么我们知道了 IP 地址,就可以把数据通过网络发到对应的电脑上?所以我们下一篇,通过操作系统的 TCP/IP 设置,来看看它具体是如何运作的。
评论区
共 9 条评论热门最新