一、B/S架构
1. 原理
客户端(浏览器)接收输入,发送请求,服务器端进行数据处理,服务器向客户端发送响应,由浏览器解释html,渲染页面。
2. 优点
-
开发成本低;
-
管理维护简单;
-
产品升级便利;
-
用户使用方便。
3. 缺点
-
安全性不足;
-
客户端不能随心变化,受浏览器限制。
二、HTTP
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在Web中传输数据的协议。它是Web客户端(例如Web浏览器)和Web服务器之间通信的基础。HTTP使用TCP/IP协议来传输信息,常用于在Web浏览器和Web服务器之间传输HTML页面、图片、音频、视频等资源。
1. 版本
-
HTTP/0.9:最初的版本,只能传输纯文本内容,请求和响应都只有一行。
-
HTTP/1.0:引入了多个请求和响应头部信息,支持多种MIME类型的文档传输,但每个TCP连接只能处理一个请求。
-
HTTP/1.1:引入了持久连接和管线化等技术,使得多个请求可以在同一个TCP连接中进行,提高了性能,同时支持分块传输编码(chunked transfer encoding)等技术,能够有效地传输大文件。
-
HTTP/2:基于Google的SPDY协议开发,引入了二进制分帧、流、多路复用等技术,进一步提高了性能和安全性。
-
HTTP/3:基于QUIC协议开发,与TCP/IP协议栈有较大不同,通过使用UDP协议传输数据,同时支持多路复用、流量控制等技术,进一步提高了性能和安全性,同时降低了延迟。
目前,最广泛使用的HTTP版本是HTTP/1.1。虽然HTTP/2和HTTP/3都提供了更好的性能和安全性,但由于一些旧的网络设备和浏览器不支持这些新协议,因此HTTP/1.1仍然是互联网上使用最广泛的协议。不过,随着时间的推移和新技术的普及,HTTP/2和HTTP/3的使用也将越来越普遍。
2. HTTP/1.1
2.1 请求构成
请求行(请求方式大写+URL+请求协议及版本号)、请求报头(存放请求参数,格式为“参数名:参数值”)、空白行(分离请求头和请求正文)、请求正文(存放请求还携带的参数及值)。
例:
GET /example.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: some_cookie=value
在这个例子中,请求行指示使用GET方法请求/example.html资源,HTTP协议版本为HTTP/1.1。请求头部包含了Host、User-Agent、Accept等字段,表示客户端的一些信息和偏好。最后,请求体为空。
2.2 响应构成
状态行(协议及版本号、状态码、状态描述信息)、响应报头(存放各种响应参数及值,格式为“参数名:参数值”)、空白行(用于分离响应报头和相应正文)、响应正文(响应数据所形成的HTML文件内容)。
例:
HTTP/1.1 200 OK
Date: Tue, 11 May 2023 12:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Type: text/html;charset=UTF-8
Content-Length: 1234
Connection: close
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is an example page.</p>
</body>
</html>
在这个例子中,状态行指示响应状态码为200,表示成功,响应头部包含了Date、Server、Content-Type、Content-Length等字段,表示服务器和响应内容的一些信息。最后,响应体包含了一个简单的HTML页面,其中包含一个标题和一段文字。
3. 状态码
-
200:请求成功
-
400:由于语法错误,当前请求无法被服务器理解
-
401:当前请求需要用户验证
-
403:服务器已经理解请求,但是拒绝执行它
-
404:请求失败,请求的资源在服务器上找不到
-
500:服务器内部错误
-
503:由于临时的服务器维护或过载,服务器当前无法处理请求
4. 请求方式
-
GET:获取指定资源的表示形式。GET请求通常用于请求静态资源,例如HTML页面、图片、CSS文件等。
-
POST:向指定资源提交数据,数据被包含在请求体中。POST请求通常用于提交表单数据、上传文件、执行修改操作等。
-
PUT:将请求的表示形式存储到指定的URI。PUT请求通常用于更新资源,例如修改文本文件、更新数据库记录等。
-
DELETE:删除指定的资源。DELETE请求通常用于删除资源,例如删除文件、删除数据库记录等。
-
HEAD:获取指定资源的元数据,而不传输实际数据。HEAD请求通常用于获取资源的元信息,例如资源的大小、类型、最后修改时间等。
-
OPTIONS:获取指定资源支持的HTTP方法。OPTIONS请求通常用于检查服务器支持哪些请求方式,以及了解资源的一些信息,例如CORS策略等。
-
TRACE:回显服务器收到的请求,用于测试和诊断。TRACE请求通常用于测试和排查HTTP请求相关的问题,例如请求头部被修改、代理服务器的行为等。
GET和POST是当前最常用的HTTP请求方式,它们分别用于获取和提交数据。
5. GET请求和POST请求的区别?
-
参数传递方式不同:GET请求将参数包含在URL的查询字符串中,而POST请求将参数包含在请求体中。由于URL的长度有限制,GET请求传递的参数数量和大小都有一定限制,而POST请求则没有这样的限制。
-
请求语义不同:GET请求用于获取资源,因此不应该对服务器的状态产生任何影响;而POST请求用于提交数据,通常会对服务器的状态进行修改或添加新的资源。
-
安全性不同:GET请求的参数会被包含在URL中,因此可能被恶意软件或黑客截获和窃取,造成安全问题;而POST请求的参数则被包含在请求体中,相对安全一些。
-
可缓存性不同:GET请求可以被缓存,由于GET请求的语义是不会对服务器状态进行修改的,因此可以将响应结果缓存下来以提高性能;而POST请求则不应该被缓存。
-
响应结果不同:GET请求的响应结果应该是幂等的,即对于相同的请求应该返回相同的结果;而POST请求的响应结果不应该是幂等的,因为每次请求都可能会对服务器状态进行修改。
三、扩展
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
- DNS解析:浏览器首先会解析输入的域名,将域名解析成服务器的IP地址。如果该域名没有被解析过,则会向本地DNS服务器发出查询请求,如果本地DNS服务器缓存中没有该域名的解析结果,则向根域名服务器发出查询请求,根域名服务器返回该域名对应的顶级域名服务器的地址,本地DNS服务器再向该顶级域名服务器发出查询请求,如此往复,直到获取到对应域名的IP地址。
- 建立TCP连接:浏览器通过获取到的IP地址和端口号,与服务器建立TCP连接。TCP是一种面向连接的、可靠的传输协议,它保证了数据传输的可靠性和有序性。
- 发送HTTP请求:建立TCP连接后,浏览器会向服务器发送HTTP请求,请求中包含了要获取的资源的URL、请求方法、请求头等信息。
- 服务器处理请求:服务器接收到HTTP请求后,会根据请求中的信息进行处理,如查询数据库、生成动态内容等。
- 返回HTTP响应:服务器处理完请求后,会将处理结果封装成HTTP响应,响应中包含了响应状态码、响应头和响应体等信息。
- 浏览器渲染页面:浏览器接收到HTTP响应后,会对响应进行解析,并根据HTML、CSS和JavaScript等资源进行渲染,最终将页面展示给用户。
整个过程涉及了DNS解析、TCP连接建立、HTTP请求和响应、页面渲染等多个步骤,其中每个步骤都需要一定的时间,整个过程的耗时取决于网络速度、服务器响应速度和页面复杂度等因素。