seegongsik
网络

HTTP 怎么工作

在地址栏输入网址,按下回车,过一会儿页面就出现在屏幕上。这中间,在看不见的地方有一段简短的对话。浏览器说“请把这个页面给我”,服务器就说“给你”,把页面递过来。这一请一递背后的约定,就是让 Web 运转起来的 HTTP。

01

请给我,给你

前面我们看到,靠着 TCP,数据能一个不少、按顺序到达。那么,浏览器和服务器用这些运过来的数据在说什么呢?
网上的对话非常简单。浏览器对服务器说“请把这个页面给我”,服务器回答“给你”,把页面递过来。提出的要求叫请求,递回来的东西叫响应。HTTP 就是规定请求和响应以什么样子来往的约定。

浏览器
GET 请求
>
<
响应 200
服务器
点一下浏览器发出请求

点一下浏览器,向服务器发出请求。服务器送回响应,一对就完成了。

一个请求,一个响应。Web 就靠这种简单的配对运转。先开口的总是浏览器,服务器只回答收到的请求,从不主动来搭话。
所以服务器只要依次接收无数浏览器的请求,一个个回答就行。不过,请求并不只有“请给我”这一种。每个请求都带着一个动作,说明它想做什么,接下来就看看这些动作。

02

请求里的动作

每个请求都带着一个动作,说明想做什么。最常见的是 GET,意思是“请把这个给我”,用来取回东西。每次打开页面,浏览器发出的请求就是 GET。
另一边是 POST,意思是“请收下这个”,用来把东西发给服务器,比如发帖,或者登录时发送用户名和密码。取回用 GET,发出用 POST。

点一下 GET 和 POST 来选

点一下动作来选。GET 是取回的一方,POST 是发出的一方。箭头会显示每个动作的数据往哪个方向走。

只要知道 GET 和 POST,网上做的事大多能说清楚:打开页面阅读用 GET,写点东西发出去用 POST。
响应也会带一个简短的标记。它是一个叫状态码的三位数字:处理成功是 200,找不到这个页面是 404。一个数字就能告诉你请求成功了还是失败了。现在记住这两个就够了。

03

每次都像第一次见面的客人

HTTP 有个古怪的脾气。处理完一个请求,它就把刚才谁要了什么忘得一干二净。同一个人来两次,它每次都当成第一次见面的客人。
它没有“您刚才来过吧?”这样的记忆。像这样不记得以前请求的性质,叫作“没有状态”,英语叫 stateless。

第 1 次到访
同一个人>服务器
第 2 次到访
同一个人>服务器
用同一个人发请求

以同一个人的身份发两次请求。第二次,服务器还是像初次见面一样打招呼。HTTP 不记得以前的请求。

第二次来还被当成初次见面,看起来有点让人着急。但这是故意这样设计的。服务器不用记住每一位客人,工作就轻松,也就能同时应付大量请求。
作为代价,要让服务器认出“刚才那个人”,每个请求都得带上一个标记。这个标记就是稍后在“会话和 Cookie”那一课会遇到的 Cookie。

04

把碎片凑成一页

一个网页并不是一次请求就全部到齐。浏览器先用 GET 取回装着文字和骨架的文档。读了文档才知道,还需要图片文件和决定样式的文件。
于是浏览器再发请求:请给我图片,请给我样式。这样来回交换好几次请求和响应,把碎片一块块凑齐,一个页面才算完成。

一片一片点着去请求

一块块点着去请求碎片。文字、图片、样式作为响应陆续到达,页面一点点被填满。

碎片凑齐了,原来空着的地方都填满了。在我们眼里,它好像是一下子出现的,其实是许多次请求和响应汇集的结果:骨架一个、图片一个、样式文件一个,各自分别请求、分别取回。
大一点的页面,这样的请求可能有几十次,多的时候超过一百次。好在网速快,一眨眼就全部完成,我们只觉得页面出来了。

05

小结

用一句话概括:Web 靠请求和响应一对对运转,请求里带着 GET(取回)或 POST(发出)这样的动作,响应里带着说明成功还是失败的数字。
一个页面靠多次请求和响应把碎片凑齐而成。HTTP 不记得以前的请求,所以把每个请求都当成第一次见面的客人。正因为这么简单,服务器才能轻松应付大量请求。这就是叫作 HTTP 的约定。

依次点这一讲给的东西来收尾

依次点要点回顾一下。(请求和响应 → GET·POST 动作 → 记性差得很 → 把碎片凑成页面)

现在你知道网页是怎么来来往往的了。浏览器请求,服务器响应,这就是 Web 的基础。
不过,用 HTTP 对话的不只是人用的浏览器。就像天气应用从服务器取回今天的天气那样,程序之间也用 HTTP 交换数据。下一课讲程序请别的程序办事的窗口:API。至于怎么记住购物车和登录状态,会在再下一课“会话和 Cookie”里讲。

一句话总结Web 靠请求和响应一对对运转。浏览器说“请给我这个”(请求),服务器就说“给你”(响应)并递过来。请求里带着 GET(取回)或 POST(发出)这样的动作,说明想做什么。一个页面通常要靠多次请求和响应,把文字和图片碎片凑齐才完成。而且 HTTP 不记得以前的请求,所以把每个请求都当成第一次见面的客人。怎样补上这个空缺,会在“会话和 Cookie”那一课讲。
← 网络
如果有帮助,请支持我们