(http协议是什么?有什么用?)
一、输入 www.baidu.com 访问百度,浏览器做了哪些事情(Chrome为例)
1、首先 Chrome 搜索自身的 DNS 缓存。(如果 DNS 缓存中找到百度的 IP 地址,就跳过了接下来查找 IP 地址步骤,直接访问该 IP 地址。)
2、搜索操作系统自身的 DNS 缓存。(浏览器没有找到缓存或者缓存已经失效)
3、读取硬盘中的 host 文件,里面记录着域名到 IP 地址的映射关系,Mac 电脑中位于 /etc/hosts。(如果前1.2步骤都没有找到)
4、浏览器向宽带运营商服务器或者域名服务器发起一个DNS 解析请求,这里服务器有两种方式解析请求,这在稍后会讲到,之后浏览器获得了百度首页的 IP 地址。
5、拿到 IP 地址后,浏览器就向该 IP 所在的服务器建立TCP 连接(即三次握手)。
6、连接建立起来之后,浏览器就可以向服务器发起HTTP 请求了。(这里比如访问百度首页,就向服务器发起 HTTP 中的 GET 请求)
7、服务器接受到这个请求后,根据路径参数,经过后台一些处理之后,把处理后的结果返回给浏览器,如果是百度首页,就可以把完整的 HTML 页面代码返回给浏览器。
8、浏览器拿到了百度首页的完整 HTML 页面代码,内核和 JS 引擎就会解析和渲染这个页面,里面的 JS,CSS,图片等静态资源也通过一个个 HTTP 请求进行加载。
9、浏览器根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
10、如果浏览器没有后续的请求,那么就会跟服务器端发起TCP 断开(即四次挥手)。
二、DNS 解析请求的两种处理方式
1、递归名称解析
用户直接向根名称服务器发送请求,如图中为访问网址为 ftp.cs.vu.nl ,之后就不用管后续的请求了,根名称服务器知道 nl 服务器地址,并向其询问其子域 ftp.cs.vu 的地址,之后不断递归,最终返回给用户最终的 IP 地址。
![](https://img.haomeiwen.com/i7288368/d27011e214bb66a2.png)
2、迭代名称解析
客户端向根名称服务器发送查询 ftp.cs.vu.nl 的地址时候,根名称服务器只知道 nl 地址,它并不管后续的请求,而是将该地址直接返回给用户,而用户在获得地址后继续向 nl 结点服务器询问 ftp.cs.vu 的地址。相当于后续查询需要自己用户来完成,最后拿到 ftp.cs.vu.nl 的 IP 地址。
![](https://img.haomeiwen.com/i7288368/e990134b1926b30e.png)
三、HTTP基本概念—HTTP特性
HTTP,全称为 HyperText Transfer Protocol,即为超文本传输协议。是互联网应用最为广泛的一种网络协议,所有的 www 文件都必须遵守这个标准。
-
HTTP 是无连接无状态的
-
HTTP 构建于 TCP/IP 协议之上,默认端口号是 80
-
HTTP 可以分为两个部分,即请求和响应。
四、HTTP基本概念—HTTP 请求
-
常用四种方法:GET,POST,PUT,DELETE
-
一个 URL 地址,对应着一个网络上的资源,而 HTTP 中的 GET,POST,PUT,DELETE 就对应着对这个资源的查询,修改,增添,删除4个操作
-
HTTP 请求由 3 个部分构成:状态行,请求头(Request Header),请求正文。
GET.png
1、状态行
由请求方式,路径、协议等构成,各元素之间以空格分隔。对应到图中即为 GET、/books/?sex=man&name=Professional、 HTTP/1.1
2、请求头
提供一些参数比如:Cookie,用户代理信息,主机名等等。(图中即从第二行到最后一行)
3、请求正文
存放一些发送的数据,一般 GET 请求会将参数放在 URL 中,也就是在请求头中而请求正文一般为空,而 POST 请求将参数放在请求正文中。请求正文可以传一些 json 数据或者字符串等等。
4、GET请求和 POST 请求的区别
-
GET大小限制,安全低,POST则相反
-
GET请求需考虑缓存问题,POST无需关心
-
POST请求必须设置Content-Type值为application/x-form-www-urlencoded
-
GET请求的参数写在url里,所以send函数发送的参数为null,而POST请求的数据需要写在send中
五、HTTP基本概念—HTTP响应
HTTP 响应是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。
1、状态码
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息–表示请求已接收,继续处理。
- 2xx:成功–表示请求已被成功接收、理解、接受。
- 3xx:重定向–要完成请求必须进行更进一步的操作。
- 4xx:客户端错误–请求有语法错误或请求无法实现。
- 5xx:服务器端错误–服务器未能实现合法的请求。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或
HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来
进行以后的请求。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回
网页内容。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
![](https://img.haomeiwen.com/i7288368/6df4acc73268a53d.png)
2、响应报头
常见的响应报头字段有: Server, Connection...。
3、响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
4、完整流程
-
由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。
-
HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
六、 HTTP 头信息
1、HTTP请求头
以请求百度首页为例
![](https://img.haomeiwen.com/i7288368/3d4158f3dd18af8c.png)
Accept:指定客户端能够接收的内容类型,如text/html ,返回的百度首页就是个 HTML 文件
// gzip是 GNU zip 的缩写,是一个 GNU 自由软件的文件压缩程序
// gzip也经常用来表示 gzip 这种文件格式
// deflate: 同时使用 LZ77 算法和哈夫曼编码(Huffman Coding)的一个无损数据压缩算法
Accept-Encoding:表示浏览器有能力解码的编码类型。
Accept-Language:表示浏览器所支持的语言类型。(这里指中文、简体中文和英文)
Cache-Control:指定请求和响应遵循的缓存机制。(这里表示不需要缓存)
// HTTP 1.1 : 默认进行持久连接, 即为 keep-alive
// HTTP 1.0 : 默认为 close
Connection:表示是否需要持久连接。
Cookie:用于会话追踪,在本文后面就继续介绍。
Host:表示请求的服务器网址
User-Agent:用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的
操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Content-Length: 请求的内容长度
Referer: 先前访问的网页的地址,当前请求网页紧随其后,说明你是先前是从哪个网址点击
访问到该页面的,如果没有则不填。
// GET 请求无该字段
// POST: application/x-www-form-urlencoded 普通的表单提交
// POST: multipart/form-data 文件上传
Content-Type:内容的类型
2、HTTP 响应头
以百度举例:
![](https://img.haomeiwen.com/i7288368/6b989d9e4b17d5fe.png)
前一个是自定义字段,HTTP 请求头中的字段是可以自定义的。Connection, Content-Encoding, Content-Type 和请求头的内容差不多,不再赘述。
Date:原始服务器消息发出的时间。
Last-Modified:请求资源的最后修改时间。
Expires:响应过期的日期和时间,如果下次访问在时间允许的范围内,可以不用重新请求,
直接访问缓存。
Set-Cookie: 设置Http Cookie,下次浏览器再次访问的时候会带上这个 Cookie 值。
Server:服务器软件名称,常见的有 Apache 和 Nginx。
七、会话追踪
1、基本概念
-
会话:客户端向服务器端发起请求到服务端响应客户端请求的全过程。
-
会话跟踪:会话追踪指的是服务器对用户响应的监视。
2、为什么需要会话跟踪:
-
浏览器与服务器之间的通信是通过 HTTP 协议进行通信的,而HTTP 协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才有会话跟踪技术来实现这种要求。
-
比如你在访问淘宝登录之后会持续追踪你的会话,记录你的购物车记录等等
3、会话跟踪常用方法
-
URL 重写:URL 重写技术就是在 URL 结尾添加一个附加数据以标识该会话,把会话 ID 通过 URL 的信息传递过去,以便在服务器进行识别不同的用户。
-
隐藏表单域:将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示。
-
Cookie:Cookie 是 Web 服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送给服务器端,进而进行用户的识别,对于客户端的每次请求,服务器都会将 Cookie 发送到客户端,客户端保存下来,以便下次使用。
-
Session:在服务器端会创建一个 session 对象,产生一个 sessionID 来标识这个 session 对象,然后将这个 sessionID 放入到 Cookie 中发送到客户端,下一次访问时,sessionID 会发送到服务器,在服务器端进行识别不同的用户。
4、Cookie
-
客户端可以采用两种方式来保存这个 Cookie 对象,一种方式是保存在客户端内存中,称为临时 Cookie,浏览器关闭后这个 Cookie 对象将消失。
-
另外一种方式是保存在客户机的磁盘上,称为永久 Cookie。以后客户端只要访问该网站,就会将这个 Cookie 再次发送到服务器上,前提是这个 Cookie 在有效期内,这样就实现了对客户的跟踪。
-
Cookie 是可以被禁止的,当你打开 Chrome,在设置里面关闭 Cookie,那么你将再也无法登录淘宝页面。
5、Session
-
每一个用户都有一个不同的 session,各个用户之间是不能共享的,是每个用户所独享的,在 session 中可以存放信息。
-
Session的实现依赖于Cookie,如果Cookie被禁用,那么session也将失效。
八、持久连接
HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。HTTP 是一个无状态无连接的协议,那么这是不是与 Keep-Alive 冲突?
-
Keep-Alive 与无连接的特性冲突,而对于无状态的特性两者并无矛盾,HTTP 无状态无连接是在 1.0 版本中就规定的,而 Keep-Alive 则是在 1.1 版本中才被添加入规范。
-
无连接的意思是限制每个连接只有一个请求的意思,在服务器处理完客户的请求,并收到客户的反应,即断开。通过这种方式可以节省传输时间。
-
Keep-Alive 确实破坏了这一特性,而无状态协议则意味着每个请求都是独立的,互不干扰的,互相没有记忆的。所以才需要有会话跟踪这种机制来识别用户。
网友评论