(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 地址。
2、迭代名称解析
客户端向根名称服务器发送查询 ftp.cs.vu.nl 的地址时候,根名称服务器只知道 nl 地址,它并不管后续的请求,而是将该地址直接返回给用户,而用户在获得地址后继续向 nl 结点服务器询问 ftp.cs.vu 的地址。相当于后续查询需要自己用户来完成,最后拿到 ftp.cs.vu.nl 的 IP 地址。
三、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),请求正文。
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 (服务器内部错误) 服务器遇到错误,无法完成请求。
2、响应报头
常见的响应报头字段有: Server, Connection...。
3、响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
4、完整流程
由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。
HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
六、 HTTP 头信息
1、HTTP请求头
以请求百度首页为例
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 响应头
以百度举例:
前一个是自定义字段,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 确实破坏了这一特性,而无状态协议则意味着每个请求都是独立的,互不干扰的,互相没有记忆的。所以才需要有会话跟踪这种机制来识别用户。