轻度解释 Http 协议

2016-03-25  本文已影响0人  菜菜学编程

记得我们上一章节说过, 浏览器发给服务器一个约定格式的数据包, 服务器回给浏览器一个约定格式的数据包. 这章节我们来讲讲这个 **约定格式的数据包 **.

为什么本章叫轻度解释, 因为如果重度解释, 可能要花3 4百页去解释, 我们首先对他要有个必要的基本了解就好啦. 轻度加比较口语化的方式, 让菜菜同学对Http有个宏观的了解, 对以后编程不走弯路是十分有用滴.

req.png

解释下这个报文

第一行是说

  1. 获取资源的方式, 叫GET(浏览器基本有GET和POST两种方式, 区别后续会讲解)
  2. 我要获取这个资源! 路径是是/
  3. 让我们使用 HTTP 1.1 版本愉快的通信吧 (因为协议是有升级迭代的, 新旧版本可能有些许不同, 所以通信前要约定一下)

从第二行到结束, 整个部分都叫 请求头

  1. Accept : 我浏览器支持这些类型的资源显示
  2. Referer(可能会有, 图中没有) : 这个请求是在哪个来源页面发起的. 比如我通过A页面链接a, 点到了B页面, 那么获取B页面的请求头就是A页面的URL
  3. Accept-Language: 我浏览器支持什么语言
  4. User-Agent: 我浏览器叫什么名字
  5. Accept-Encoding 是说, 我支持怎么样的内容编码. 这个例子写的gzip 就是说, 你服务器可以把网页内容用 gzip(一种压缩算法)压缩, 我可以解压滴
  6. Host 是说, 请求的主机(可以是域名, 或者IP, 如果请求的不是80端口这里的格式就会变成 xxx.com:8080)
  7. Connection: Keep-Alive 是告诉服务器, 我们通信完以后, 你可以别立刻断开(因为断开再连接会消耗资源: 具体解释要看TCP协议了, 我们暂时不讲它, 后面用到了详细讲解)
  8. 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

来解释一下这个报文

第一行是说

  1. 本报文遵循Http1.1协议
  2. 这次响应的状态码是200 (查看详细Http状态码定义)
  3. 状态码描述是 OK

从第二行开始一直到\r\n\r\n处是响应头 (俺挑主要的描述下, 其他有兴趣可以Google)

  1. Date: 服务器时间
  2. Server: 服务器类型(Apache是一种Web服务器)
  3. Last-Modified: 这个资源上次变更时间
  4. ETag : 每次资源变更, 都会生成的一个字符串
    Last-Modified 和 ETag 是和响应状态码304有密切关系的, 后面讲到再说.
  5. Content-Encoding: 编码类型. 前面请求头果说了, 俺支持GZip, 响应时服务器就可以把内容GZip压缩, 然后用这个头表示, 内容是GZip过的. 浏览器看到这个头信息, 就用UnGZip方式去解压响应体的内容, 然后展示.
  6. Content-Length: 响应体有多大
  7. Connection: Keep-Alive : 我服务器没关闭连接, 连接还能继续复用.
  8. Content-Type: 资源的类型. 比如一张图片, 响应头就应该是 image/jpeg之类的, 如果你给成了 text/html, 那浏览器就把你给的响应体内容, 当成网页的方式去渲染啦, 结果肯定乱掉.

\r\n\r\n 之后, 就是响应体内容. 可能是个网页, 或者是个图片等等

上一篇下一篇

猜你喜欢

热点阅读