记得我们上一章节说过, 浏览器发给服务器一个约定格式的数据包, 服务器回给浏览器一个约定格式的数据包. 这章节我们来讲讲这个 **约定格式的数据包 **.
为什么本章叫轻度解释, 因为如果重度解释, 可能要花3 4百页去解释, 我们首先对他要有个必要的基本了解就好啦. 轻度加比较口语化的方式, 让菜菜同学对Http有个宏观的了解, 对以后编程不走弯路是十分有用滴.
上述的 约定的数据包 中的 ** 约定 ** 二字, 本质就是 Http 协议. 通俗讲, 协议就是双方约定好的事儿. 我们约定了, 浏览器怎么请求, 服务器怎么响应.
简述 Http 请求报文 (报文就是那个数据包的意思啦)
我随便抓了一个请求报文, 长这个样子:
解释下这个报文
第一行是说
- 获取资源的方式, 叫GET(浏览器基本有GET和POST两种方式, 区别后续会讲解)
- 我要获取这个资源! 路径是是/
- 让我们使用 HTTP 1.1 版本愉快的通信吧 (因为协议是有升级迭代的, 新旧版本可能有些许不同, 所以通信前要约定一下)
从第二行到结束, 整个部分都叫 请求头
- Accept : 我浏览器支持这些类型的资源显示
- Referer(可能会有, 图中没有) : 这个请求是在哪个来源页面发起的. 比如我通过A页面链接a, 点到了B页面, 那么获取B页面的请求头就是A页面的URL
- Accept-Language: 我浏览器支持什么语言
- User-Agent: 我浏览器叫什么名字
- Accept-Encoding 是说, 我支持怎么样的内容编码. 这个例子写的gzip 就是说, 你服务器可以把网页内容用 gzip(一种压缩算法)压缩, 我可以解压滴
- Host 是说, 请求的主机(可以是域名, 或者IP, 如果请求的不是80端口这里的格式就会变成 xxx.com:8080)
- Connection: Keep-Alive 是告诉服务器, 我们通信完以后, 你可以别立刻断开(因为断开再连接会消耗资源: 具体解释要看TCP协议了, 我们暂时不讲它, 后面用到了详细讲解)
- Cookie: 是一个重要的东西, 他是服务器通过响应报文存在浏览器的一些数据. 这个我们实战用到时再讲啦
上述的是一个GET请求, POST请求还会有 请求体 部分, 请求头后有\r\n\r\n四个字符(这是特殊的看不见的字符), 字符后就是请求体. 而每个请求头之间, 是 \r\n 两个字符区分.
\r\n展开讲又是一章字符集特辑. 不过我们暂时简单理解, \r是一个特殊字符, 看不见的, \n也是一个特殊字符看不见的.
扩展 1. 这两个字符来自在古老的打字机时代, 打字员打字换行, 是要按两个键的, 一个\r(表示回到行首), 一个\n(表示去下一行) .
扩展 2. 后面的三大系统 Windows Linux Mac, 他们储存文本时候, 默认的换行符都不同. Windows秉持了打字机的 \r\n, Linux用了\n, Mac用了\r
-
** 简述 Http 响应报文 **
抓个响应报文瞧瞧
来解释一下这个报文
第一行是说
- 本报文遵循Http1.1协议
- 这次响应的状态码是200 (查看详细Http状态码定义)
- 状态码描述是 OK
从第二行开始一直到\r\n\r\n处是响应头 (俺挑主要的描述下, 其他有兴趣可以Google)
- Date: 服务器时间
- Server: 服务器类型(Apache是一种Web服务器)
- Last-Modified: 这个资源上次变更时间
- ETag : 每次资源变更, 都会生成的一个字符串
Last-Modified 和 ETag 是和响应状态码304有密切关系的, 后面讲到再说. - Content-Encoding: 编码类型. 前面请求头果说了, 俺支持GZip, 响应时服务器就可以把内容GZip压缩, 然后用这个头表示, 内容是GZip过的. 浏览器看到这个头信息, 就用UnGZip方式去解压响应体的内容, 然后展示.
- Content-Length: 响应体有多大
- Connection: Keep-Alive : 我服务器没关闭连接, 连接还能继续复用.
- Content-Type: 资源的类型. 比如一张图片, 响应头就应该是 image/jpeg之类的, 如果你给成了 text/html, 那浏览器就把你给的响应体内容, 当成网页的方式去渲染啦, 结果肯定乱掉.
\r\n\r\n 之后, 就是响应体内容. 可能是个网页, 或者是个图片等等
-
关于整个网络上的资源
- 你打开浏览器访问网页, 看到的内容可以称为网络上的资源. 这些资源都有自己的一个唯一标识, 这个标识就是我们所说的URL(统一资源定位符)
- 现在我们再讲一下网页显示的过程
- 我们打开一个网页的URL, 浏览器发了一个请求
- 服务器接收到这个请求, 给出响应内容
- 浏览器进行网页解析&&渲染(这时候的网页是一个骨架)
- 浏览器在解析的同时, 发现网页里的代码又要去请求图片呀, 样式表(css)呀等等的资源, 于是浏览器一边发这些请求, 一边进行解析渲染.
- 整个过程完成了, 也就页面终于显示正常了
- 在这个过程中, 万一网络问题, 某些资源没加载成功, 页面就可能乱掉, 或者功能不可用, 这个我们在上网过程种会经常见到吧 :)
这里按比较口语的方式讲解的, 便于理解, 比较学术范儿的, 有篇不错的文章, 如果菜菜还没有晕掉, 在心情好的时候, 可以看看
HTTP协议详解
如果这篇看不全懂也不用着急, 后面用到时候再讲就OK啦