1. 建立连接
Web服务器和客户端通信最常用的方式是通过遵循传输控制协议(TCP)的连接。基本上,使用TCP时,通过一系列来回检查在客户端和服务器机器之间建立连接。一旦连接建立并打开,数据就可以在客户端和服务器之间发送。这个连接也可以称为会话。
还有用户数据报协议(UDP),它具有稍微不同的通信方式和自己的一套优缺点。我相信最近一些浏览器可能已经开始使用两者的组合以获得最佳结果。
这里还有很多要说的,但除非你要编写浏览器(或成为黑客),否则这不应该超出基础知识的范围。
2. 发送数据包
一旦建立了客户端-服务器连接,数据包就可以在两者之间发送。 TCP数据包包含各种信息,以帮助两个端口之间的通信。对于Web程序员来说,数据包最重要的部分将是包含HTTP请求的部分。
HTTP(超文本传输协议)是另一种描述客户端-服务器通信构成/格式的协议。
从客户端发送到服务器的数据包的相关部分的最基本示例如下:
GET /index.html HTTP/1.1
Host: www.example.com
这里的第一行被称为响应行(Response line)
。 GET
描述了要使用的方法(其他方法包括POST、HEAD、PUT、DELETE等),/index.html
描述了所请求的资源,最后,HTTP/1.11
描述了正在使用的协议。
第二行在此情况下是请求中唯一的报头字段(header field)
,并且在此情况下它是HOST
字段,该字段是服务器IP地址的别名,由DNS提供。
[既然您提到了它,那么GET
请求和POST
请求之间的区别仅在于,在GET
请求中,参数(例如表单数据)包含在响应行(Response Line)
中,而在POST
请求中,参数将包括在消息主体(Message Body)
中(见下文)。]
3. 接收数据包
根据发送到服务器的请求,服务器会思考您请求了什么,并相应地进行响应(也就是您编程让它做的任何事情)。
以下是从服务器发送的响应数据包示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
...
<html>
<head>
<title>A response from a server</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
这里的第一行是“状态行”,它包括数字代码以及简短的文本描述。“200 OK”表示成功。“404 Not Found”也是大家可能熟悉的例子。
第二行是“响应头字段”的第一个。通常还会添加其他字段,例如日期(date)、内容长度(Content-Length)和其他有用的元数据。
在头部和必要的空行之后是可选的“消息主体”。当然,这通常是响应中最令人兴奋的部分,因为它包含了像 HTML 这样的内容,供我们的浏览器显示,还有 JSON 数据,或者基本上你可以在 return 语句中编码的任何东西。
基于这些,AJAX 是相当容易理解的。实际上,发送和接收的数据包看起来与非 AJAX 请求的数据包完全相同。
唯一的区别在于浏览器何时以及如何决定发送请求数据包。通常情况下,当页面刷新时,浏览器会向服务器发送请求。但是,在发出 AJAX 请求时,程序员只需告诉浏览器立即向服务器发送数据包,而不是在页面刷新时发送。
然而,鉴于 AJAX 请求的性质,消息主体通常不会包含整个 HTML 文档,而是请求更小、更具体的数据,例如从数据库中查询的数据。
随后,调用 Ajax 的 JavaScript 代码也可以根据响应做出相应的操作。由于 Ajax 调用只是另一个 JavaScript 函数,因此您可以使用任何 JavaScript 方法。因此,您可以使用 innerHTML 将一些 HTML 插入/替换页面上的内容,该内容是 Ajax 调用返回的结果。或者,您也可以做一些简单的 Ajax 调用,只需要返回真或假,然后可以通过 if else 语句调用某个 JavaScript 函数。希望您能看到 Ajax 与 HTML 本质上无关,它只是一个 JavaScript 函数,用于从服务器请求数据,并返回响应,无论响应是什么。
“HTTP 协议”是“无状态协议”的一个例子。基本上,这意味着每个请求和响应对(如我们所描述的)都是独立处理的,与其他请求和响应无关。因此,服务器不必跟踪所有正在等待服务的用户。相反,它可以逐个响应每个请求。
但是,有时我们希望服务器记住我们。如果每次我想查看 Gmail 邮件时都必须重新登录,那该有多烦人啊!
为了解决这个问题,服务器可以发送
Cookies,以存储在客户端的设备上。服务器可以发送响应来告诉客户端存储Cookie并指定其内容。客户端的浏览器负责将这些Cookies存储在客户端的系统上,因此这些Cookies的位置会因浏览器和操作系统而异。然而,重要的是要认识到这些只是存储在客户端机器上的小文件,实际上任何知道如何查找和理解它们的人都可以读取和写入它们。正如您可以想象的那样,这会带来一些潜在的安全威胁。其中一个解决方法是加密存储在这些Cookies中的数据,以便恶意用户无法利用您提供的信息。(由于您的浏览器正在设置这些Cookies,所以通常有一个浏览器设置可以修改,用于接受、拒绝或为Cookies设置新位置。)
这种方式,当客户端向服务器发出请求时,可以在
请求头字段
之一中包含Cookie,告诉服务器:“嘿,我是经过身份验证的用户,我的名字是Bob,在我的笔记本电脑死机之前,我正在撰写一篇非常吸引人的博客文章,”或者,“我已经在我的购物车中挑选了3套设计师西装,但我还打算在您的网站上搜索第4套。”
6. 本地存储
HTML5引入了
本地存储作为Cookie的更安全的替代方案。与Cookies不同,使用本地存储时数据实际上不会发送到服务器。相反,浏览器本身跟踪状态。
这种替代方案也允许存储更大量的数据,因为没有要在客户端和服务器之间通过Internet传递数据的要求。
7. 继续研究
这应该涵盖了基础知识,并清楚地说明了客户端和服务器之间正在发生什么。每个点都有更多可以说的内容,您可以通过简单的Google搜索找到大量信息。