“嗨,阿米戈!”

“嗨,比拉博!”

“你今天要告诉我什么新鲜事?”

“很多事情。但首先,我想我们将讨论使用网络和互联网工作。有兴趣吗?”

“是的。银河互联网超级酷。”

“好吧,但让我们从一些历史开始。在21世纪初,情况是这样的……”

“每台连接到互联网的计算机都有一个唯一的编号。这是一个普通的 4 字节数字。它被称为 IP 地址。”

“但人类的记忆力很差,很难记住像 2108458776 这样的东西,所以他们经常把每个字节分开写。”

“如果我们将四字节数字 2108458776 拆分为单独的字节,我们将得到 125.172.135.24。您会记得,每个字节由 8 位组成,可以包含从 0 到 255 的数字。”

“所以,这就是我们写数字的方式?”

“是的。以这种方式书写时,(对人类而言)更容易记住四字节数字。”

“碰巧的是,只使用 4 个字节的选择很快就给他们上了一个残酷的把戏。连接到互联网的设备数量增长如此之快,以至于他们很快就用完了。”

“他们是怎么解决这个问题的?”

“他们做了人类通常做的事情。”

“他们提出了一个新的 IP 地址标准,并自豪地将其命名为 IPv6。”

“与使用 4 个字节构成唯一编号的普通 IP 地址(称为 IPv4)不同,新标准使用 16 个字节。”

“想想看,人类记不住一个普通数字的10个数字(比如2108458776),所以他们不得不把它们分成4个部分,但后来他们想到了用16个字节组成的数字。”

“是啊,有时候人类很奇怪。”

“是啊。人就是人。”

“也就是说,他们确实摆脱了困境。”

“他们厌倦了记住数字,决定用文字代替。”

“怎么样?能举个例子吗?”

“当然,web.mail.comgoogle.comnew.books.amazon.com ……”

“这种名字叫做域。”

“为了让这个 Internet 正常工作,他们创建了一个名为域名系统 (DNS) 的特殊表,用于存储每个域名的 IP 地址。”

“这就是它的工作原理。”

1) 用户在浏览器中输入地址,例如web.mail.com

2) 浏览器访问DNS,使用域名获取IP地址。

3) 带有所需 URL 的请求被发送到该 IP 地址。

“这看起来不是很简单。”

“但这种方法确实有几个好处:”

1) 人类发现很容易记住可以用语言表达的名字。”

" 2) 可以通过在名称的开头添加子域来分层构建域名。就像 Java 中的包名一样。"

" 3) 如果需要更改 Web 服务器的 IP 地址,只需更改 DNS 记录,一切都会像以前一样工作——用户不必记住新地址。"

“DNS 看起来像这样:”

域名 IP地址
邮件.com 128.35.36.189
web.mail.com 145.12.17.13
new.mail.com 192.155.15.3
谷歌.com 92.117.151.100
谷歌.com 193.168.0.1
docs.google.com 217.12.222.1
……

“说得通。”

“无论如何,域是计算机的名称,但我们不需要计算机——我们需要计算机上的内容。这就是 URL 的用途。”

“最初,URL 实际上是指向另一台计算机上文件的链接。例如:”

例子
http://info.codegym.cc/user/info/profile.html _ _ _ _
描述
http 是客户端-服务器通信的协议
info.codegym.cc 是电脑的域名
user/info/profile.html 是文件在电脑上的路径

“在网络发展之初,Web 服务器只能使用 URL 来提供它存储在某处的文件。URL 实际上是文件的全局路径:计算机名 + 路径。”

“后来,当网络服务器开始自己生成文件时,URL发生了一些变化,变成了对网络服务器的请求。请求参数也被添加了。”

“如今很少在 URL 的末尾看到文件扩展名。”现代 URL 只是带有参数的唯一链接。更像是一个方法调用而不是全局文件路径。”

“经典的现代 URL 如下所示:”

解析网址
http://codegym.cc/alpha/api/contacts ? _ _ _ _ userid=13&filter=none&page=3
部分网址说明
codegym.cc 是域名 — 计算机在互联网上的唯一名称(地址)
http 是客户端-服务器通信的协议
alpha/api/contacts 是 web 服务器请求或请求服务器上的网页
userid=13 & filter=none & page=3 是带有请求参数的字符串

“是的,我记得。你最近告诉我关于 URL 的事。”

“还有关于港口。你用了公寓楼的例子。”

“最好告诉我'http'是什么。我看到到处都写着'协议',但我不清楚那是什么。”

“好吧,我不多说就告诉你。”

IP 地址、域、URL - 1

HTTP代表Hyper T ext Transport Protocol ,用于传输超文本

“什么是超文本?”

“它是 HTML。”

“粗略地说,协议就是一套通信规则。它描述了可以发送到网络服务器的请求,以什么格式,以及网络服务器应该如何响应。”

“简而言之,情况是这样的。在客户端和服务器之间发送普通文本文件,或者,如果你愿意,也可以发送大块文本。

请求到达服务器,服务器对每个请求提供响应。”

“以下是此类请求和响应的示例:”

要求
GET alpha/api/contacts HTTP/1.1
Host: codegym.cc
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
描述
GET – request subtype
alpha/api/contacts – request to the web server
HTTP/1.1 – protocol version – HTTP/1.1
Host: codegym.cc – domain name
User-Agent: Mozilla/5… – unique browser name
Accept: text/html – requested document type: HTML
Connection: close – close the server connection after processing the request.

“第一行是实际的请求。接下来是额外的请求参数,也称为‘header fields’。”

“这是一个响应示例:”

回复
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: en
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close
<html><body><a href="http://ample.com/about.html#contacts">Click here</a></body></html>
HTTP/1.1 200 OK - «200 OK» means everything is okay.
Date: Wed, 11 Feb 2009 - Date on which the request was processed
Server: Apache - Name of the web server
X-Powered-By: PHP - The server uses PHP
Last-Modified: Wed, 11 Feb 2009 - The time of the last update of the requested file
Content-Language: en - The language of the file
Content-Type: text/html; charset=utf-8 – This is an HTML-file with UTF-8 encoding
Content-Length: 1234 - The response is 1234 bytes long
Connection: close - The connection will be closed after the request is handled
<html><body><a href="http://ample - The HTML file itself.

“我想提请你注意两件事:”

“首先,无论你请求什么,它看起来都像是向服务器发出的文件请求。文件是否在服务器上或服务器响应请求生成它并不重要。”

“其次,文件本身作为 HTTP 响应的一部分发送。换句话说,我们在服务器响应的开头看到了一些额外的数据,然后是正在提供的文件的主体。

“多么有趣!我不确定我是否理解了所有内容。我稍后再读一遍。”

“哦,我确实想告诉你另一件小而有趣的事情:饼干。”

“那些是什么?”

“根据 HTTP 协议,cookie 是服务器发送给客户端的小块信息,用于存储在客户端上。它们作为后续请求的一部分发送回服务器。

“那有什么意义呢?”

“假设用户在网站首页登录,服务器在服务器上为这个用户创建一个session对象,并将一个唯一的session号作为cookie发送给客户端。在客户端下一次请求时服务器,此会话号将与其他 cookie 一起发送回服务器。这意味着服务器可以识别发送新请求的用户。”

“多么有趣!”

“是的。当你编写自己的 servlet 时,我们将仔细研究这个主题。但现在,让我们休息一下。”

“不管你说什么。”