单元三 做一个网络服务 · 第 10 课

网站是怎么跑起来的

接下来我们要做一个自己的网站。动手之前,先用十分钟弄明白:在浏览器里输入网址、按下回车之后,到底发生了什么。

本课目标

  • 看懂一个网址由哪几部分组成。
  • 理解域名、IP、端口、DNS 的关系。
  • 知道 HTTP 请求、响应和状态码是什么。
  • 明白 localhost 指的是哪里。

先懂概念:寄一封信

访问网站,很像给一家公司寄信:

网络里的词寄信的类比例子
域名公司名称,好记xairouter.com
DNS查号台:把公司名称查成地址把 xairouter.com 查成一串数字
IP 地址大楼的门牌号,机器认这个203.0.113.10
端口大楼里的房间号,一台电脑上可以有很多服务443、3000
HTTP 请求你寄出的信“请把首页给我”
HTTP 响应对方的回信首页的内容

服务器就是大楼里一直有人值班的房间:它24小时开着,等着有人来信,收到就回信。我们要做的“服务端程序”,就是这个值班的人。

网址的组成

https://report.example.com:443/api/report
└─┬─┘   └───────┬────────┘ └┬┘ └───┬────┘
 协议          域名         端口   路径
  • 协议:https 是加密的 HTTP,http 是不加密的。
  • 域名:report.example.com 中,example.com 是买来的域名,report 是你自己起的子域名。
  • 端口:https 默认是 443,http 默认是 80,默认时可以省略不写。我们自己的程序在开发时常用 3000。
  • 路径:要找的是这个网站里的哪一页、哪个功能。

HTTP:一问一答

浏览器发出请求,服务器回复响应。请求有不同的“动作”:

  • GET:取东西,比如打开一个网页;
  • POST:交东西,比如提交一个表单。

每个响应都带一个三位数的状态码,告诉你结果如何:

状态码意思
200成功
301 / 302 / 308搬家了,请去新地址
401需要登录
404找不到这个页面
429请求太频繁
500服务器内部出错
502 / 503服务器暂时不可用

后面调试时,看到状态码就能大致判断问题出在哪一边:4 开头多半是请求的问题,5 开头多半是服务器的问题。

localhost:自己这台电脑

localhost(也写作 127.0.0.1)是一个特殊的地址,意思是这台电脑自己。在自己电脑上运行的服务,用 http://localhost:3000 就能访问。

别人的电脑能不能访问,取决于服务监听的地址:只监听 127.0.0.1 的服务,只有本机能访问;监听所有网卡(0.0.0.0)的服务,同一个网络里的其他电脑也可能访问到。这门课在自己电脑上开发时,都让服务只监听 127.0.0.1。下一课你就会用到它。

跟着做

1. 用浏览器看请求

打开浏览器,访问本站首页,按 F12(macOS 按 Command + Option + I)打开开发者工具,切换到“网络(Network)”标签,再按一次刷新。

你会看到一长串请求,每一行是浏览器向服务器要的一样东西:网页、图片、样式表……“状态(Status)”那一列就是状态码,大部分是 200。

2. 用终端发请求

curl 是终端里的“浏览器”,可以直接发 HTTP 请求。

curl.exe -I https://xairouter.com
curl -I https://xairouter.com

Windows PowerShell 里的 curl 其实是另一个命令的别名,用法不同,所以要写成 curl.exe。

-I 表示只看响应的“信封”(响应头),不看正文。第一行会显示协议和状态码,比如 HTTP/2 200。

3. 查一查 DNS

nslookup xairouter.com

Windows 和 macOS 都有这个命令。输出的 Address 就是这个域名对应的 IP 地址,这就是“查号台”的结果。

你应该看到

  • 开发者工具里有很多状态码为 200 的请求。
  • curl 的第一行是 HTTP/2 200 或 HTTP/1.1 200 OK。
  • nslookup 输出了一个或几个 IP 地址。

常见问题

curl 报错说参数不对? Windows 上要用 curl.exe,不是 curl。

nslookup 显示很多行看不懂? 只看最后的 Name 和 Address,前面几行是你电脑用的 DNS 服务器。

自检

  • 我能指出一个网址里的协议、域名、端口和路径。
  • 我能用寄信的类比解释域名、DNS、IP、端口。
  • 我知道 200、401、404、500 分别是什么意思。
  • 我知道 localhost 指的是自己这台电脑。