zoukankan      html  css  js  c++  java
  • HTTP 协议入门-笔记

    原文参考http://mp.weixin.qq.com/s/czx0AHaItrJ-c49XDboIUg
     HTTP是基于TCP/IP协议的应用层协议,规定了客户端和服务端之间的通信格式,默认使用80端口

    1.0版请求格式如下
    GET/HTTP/1.0 // 请求命令,必须在尾部添加协议版本(HTTP/1.0)
    User-Agent:Mozilla/5.0(Macintosh;Intel Mac OS X 10_10_5) // 描述客户端情况
    Accept:*/* // 客户端声明可以接受数据格式
    Accept-Encoding: gzip,deflate //客户端说明自己可以接受哪些压缩方法
    Connection: keep-alive // 要求服务端不要关闭TCP连接,非标准

    回应格式如下
    HTTP/1.0 200 OK // 协议版本 状态码 状态描述
    Content-Type: text/plain //告诉客户端数据的格式
    Content-Length: 139099
    Expires: Thu,05 Dec 1997 16:00:00 GMT
    Last-Modified: Wed,5 August 1996 15:55:28 GMT
    Server: Apache 0.84
    Content-Encoding:gzip // 数据压缩方法
    Connection: keep-alive // 告诉客户端不关闭TCP连接,非标准

    Content-Type的值常见如下
    text/plain
    text/html
    text/css
    image/jpeg
    image/png
    image/svg+xml
    audio/mp4
    video/mp4
    application/javascript
    application/pdf
    application/zip
    application/atom+xml
    总称为MIME type,每个值包括一级类型/二级类型
    厂商可以自定义类型
    MIME type可以在尾部加参数,如下
    Content-Type:text/html;charset=utf-8 // 发送的是网页编码是UTF-8
    MIME type可以写在网页中如下
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

    Content-Length: 3456 // 告诉浏览器本次回应的长度,后面属于下一个回应
    区分数据包属于哪一个回应,声明本次回应的长度

    主要缺点:每个TCP连接只能发送一个请求,发送完毕就关闭

    HTTP1.1
    引入持久连接,即TCP连接默认不关闭,可以被多个请求复用,在一段时间没有活动后,主动关闭连接。
    规范做法客户端在最后一个请求时发送Connection: close,明确告诉服务器关闭连接
    大多数浏览器允许同时建立6个持久连接

    管道机制在同一个TCP连接里面,客户端可以同时发送多个请求

    Transfer-Encoding: chunked // 表明回应将由数量不定的数据块组成
    每个非空的数据块之前会与一个16进制的数值表示块的长度,最后一个大小为0表示本次回应数据发送完成
    例子:
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Transfer-Encoding: chunked

    3
    con
    2
    wo
    0

    增加了动词方法:PUT,PATCH,HEAD,OPTIONS,DELETE
    客户端请求头信息增加Host字段
    Host: www.example.com // 指定服务器的域名

    缺点:数据通信是按次序进行的,如果碰到回应特别慢后序请求要排队等着,这就是"队头堵塞"
    解决方法一减少请求数
    方法二多开持久连接

    HTTP/2
    是一个二进制协议,头信息和数据体都是二进制,统称为帧(frame)包括头信息帧和数据帧

    多工:在一个连接里客户端和浏览器同时发送多个请求或回应,不用按照顺序一一对应。(即服务器同时受到a,b两个请求,先回应a请求发现过程非常耗时,会发送给a已经处理好的部分,然后回应b请求完成后,在发送a剩下部分)

    将每个请求或回应的所有数据包称为一个数据流(stream),都有一个独一无二的编号,客户端发出的数据流ID统一为奇数,服务器发出的ID为偶数
    客户端可以指定数据流的优先级,优先级越高服务器越早回应

    引入了头信息压缩机制(header compression),一方面头信息使用gzip或compress压缩后发送,另一方面客户端和服务端同时维护一张表,所有字段会存在表里生成一个索引,只发送索引号

    允许未经请求主动向客户端发送资源即:服务器推送(server push)
    场景:客户端请求一个网页里面包含很多静态资源,服务器预期到客户端请求页面后会再请求静态资源,就主动把这些静态资源和网页一起发给客户端了 
  • 相关阅读:
    Python3输入输出
    Python3文件
    Python3OS文件/方法
    makefile通用版本(一)
    C语言正则表达式
    正则表达式
    sed、awk工具
    shell编程
    Sqlite3-安装使用
    Powershell-获取命令和帮助
  • 原文地址:https://www.cnblogs.com/victory820/p/6911353.html
Copyright © 2011-2022 走看看