图解http阅读笔记

[toc]

书籍链接:https://weread.qq.com/web/reader/3da32b505dd9f43da9a1acakc81322c012c81e728d9d180


1、基本概念

1.1 TCP/IP协议族

  • 计算机两个网络实体之间需要相互通信,就必须基于相同的规则,这种规则称呼为协议
  • TCP/IP协议族广义概念代表与互联网相关的所有协议
  • TCP/IP协议可分层为应用层、传输层、网络层、链路层
    • 应用层向用户提供应用服务的通信能力,例如HTTP,FTP,DNS
    • 传输层提供两台计算机之间的数据传输(TCP和UDP)
    • 网络层处理流动的数据包,定义了数据包通过怎样的路径在两台计算机间传输
    • 链路层处理网络连接的硬件部分
  • 在两个web应用交互信息的时候,请求方从上层到下层,每层都会封装新的首部信息,接收方从下层到上层一层层拆解最后得出原始信息

1.2 IP协议

IP协议位于网络层,指定了节点被分配到的地址。MAC地址是网卡所属的固定地址,一般不会变,可与IP地址进行配对。知道了对方的IP地址后,可以采用
ARP(Address Resolution Protocol)解析到对方的MAC地址。

1.3 TCP

TCP位于传输层,提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。

1.4 DNS

DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务

1.5 URI和URL的区别

URI是Uniform Resource Identifier,URL是Uniform Resource Locator。

URI是一个,用于标记互联网资源的规则。URL是其中的一个实现方式。

不仅可以用URL的方式标记资源http://xxx.com/1123/aa.jpg,也可以用其他URI实现方式标记资源,例如http://1233456.jpg, URL方式更为通用和 使用广泛

2 HTTP是一个设计简单的协议

  • http协议规定,两台设备一定有一台是客户端,一台是服务端
  • http通过请求和相应交换数据
  • HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理
    • HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了

HTTP方法:
- OPTIONS:查询服务端对指定URI的资源支持。服务端只会返回首部,不会返回报文实体
- CONNECT:要求用SSL/TLS等安全隧道协议链接代理

HTTP/1.1支持定义 keep-alive或connection reuse方法,进行持久链接。只要一端没有明确提出断开链接,则保持TCP链接状态

管线化:支持同时并行发送多个请求,不需要一个一个等待相应

Cookie:

Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值(通常是一个用户唯一id)后发送出去。服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

3 HTTP报文结构

CR Carriage Return 回车
LF Line Feed 换行

  • 报文是HTTP通信的基本单位,实体是请求或相应的有效载荷数据(补充项)

    • 在传输不进行编码的时候,报文主体=实体主体,当传输进行编码的时候,将实体信息压缩,此时实体主体不等于报文主体
    • 可以将内容进行gzip,compress等压缩编码
    • 可以将实体主体分成多个块,进行分块传输。浏览器可以边解码边渲染已经解码的内容
  • 发送多种数据类型多部分对象集合

    • MIME(MultipurposeInternet Mail Extensions,多用途因特网邮件扩展
    • 在MIME扩展中会使用一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据
    • 相对应的content-type为multipart/form-data
    • 相应地,HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用
  • Range Request

    • 指定下载的实体范围
    • Range: byte=50001-20000
    • 针对范围请求,响应会返回状态码为206 Partial Content的响应报文。
    • 对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文
  • 内容协商

    • 客户端和浏览器就相应的资源内容进行交涉,提供给客户端最为适合的源。基于语言、字符集、编码方式等作为判断的基准
    • 首部类型:Accept Accept-Charset Accept-Encoding Accept-Language Content-Language
    • 协商类型包括:1 服务器驱动协商 2 客户端驱动协商 3 透明协商(一起商量)

4、HTTP状态码

HTTP状态码由3位数字+原因短语组成

1xx 请求正在处理

2xx 请求正常处理完毕

  • 200 OK

  • 204 No Content

  • 206 Partial Content

    3xx 请求需要重定向附加操作

  • 301 Moved Permanently 请求的资源已被分配了新的URI,以后应使用资源现在所指的URI

  • 302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问,而且资源URI还没有固定下来,以后可能还会变。基本上浏览器碰到了都会删掉post请求,重发个get请求。

  • 303 See Other 标识客户端应当采用GET方法获取资源。浏览器解析到该访问后,会删除原post请求,替换成get 请求重发一次

  • 304 Not Modified 。找到资源,但不符合(if-xxx)条件定义的资源匹配

  • 305 Temporary Redirect 临时重定向,不会改变原有的post方法

4xx 客户端错误

  • 400 Bad Request 客户端请求语法错误
  • 401 Unauthorized 需要进行认证
  • 403 Forbidden 无权访问
  • 404 Not Found 服务器上没找到请求的资源

5xx 服务器错误

  • 500 Internal Server Error 服务器在执行请求时发生了错误
  • 503 Service Unavailable

5 HTTP首部

通用首部

通用首部指,客户端和服务端共同使用的首部

  • Cache-Control 控制缓存的工作机制
  • Connection
    • 指定部分字段,在经过代理服务器的时候要被代理服务器剔除。
    • 当Connection: close 值的时候,意味着关闭持久连接
  • Data HTTP报文的日期和时间
  • Pragma:用于向后兼容定义,当Progma: no-cache的时候,控制HTTP1.1之前的中间服务器不使用缓存
  • Trailer:用于分块传输,指定报文主体后记录了哪些首部字段
  • Transfer-Encoding:指定了传输时候的编码格式
  • Upgrade 检测HTTP协议以及其他协议是否可用更高的版本通信,参数是一个不同的通信协议
  • Via:用于追踪客户端和服务器之间的请求和相应报文的传输路径
  • Warning:缓存警告

    请求首部

  • Accept
  • Accept-Charset
  • Accept-Language
  • Authorization 防止用户的认证信息
  • Expect 期待服务器的特定行为
  • From 告知服务器使用用户代理的电子邮件地址
  • Host 请求资源所处的服务器的主机名和端口号
  • if-xxxx 请求匹配特定条件
  • Range:指定请求资源的范围
  • Referer:发起请求的客户端的URI
  • TE:传输编码设定
  • User-Agent

    响应首部

  • Accept-Ranges。取值bytes或none,是否接受范围请求
  • Age:相应是多久之前创建的
  • ETag 资源实体标识
  • Location 配合3xx响应,定义重定向的URI
  • Retry-After 配合503响应,告知多久后再发起请求
  • Server 服务器信息
  • Vary 服务器可以再这里和代理服务器预定,只有Vary字段相同的值,才可以从代理服务器直接相应,否则可以代理服务器返回缓存

    实体首部

  • Allow 允许的方法
  • Content-Type
  • Content-Encoding
  • Content-Language
  • Content-Length
  • Content-Location 报文主体的URI
  • Content-MD5
  • Content-Range
  • Expires
  • Last-Modified

    Cookie首部字段

  • Set-Cookie
  • Cookie

    6 HTTP服务器

    同一台物理主机上,可以采用多种技术搭载多个Web服务,多个Web服务可能拥有多个不同域名,发送HTTP请求的时候需要在HOST首部指定完整主机名和URL。

数据转发程序

  • 代理

    • 正向代理代理用户向服务器发送请求,隐藏客户端
    • 反向代理代替服务器响应请求,隐藏服务端
    • 缓存代理会将资源保存到代理服务器内存,提高读的效率
    • 代理转发时,不对报文进行任何加工的代理为透明代理,否则为非透明代理
  • 网关

    • 网关可以提升系统安全性,统一管控,协议更换,负载均衡等等(见架构修炼之道……读书笔记)
  • 隧道

    • 隧道建立起一条客户端和服务端之间的通信线路,使用SSL/TLS 等手段进行加密通信
    • 隧道不会解析HTTP请求,TLS或是SSL会在HTTP请求上包一层自己的逻辑

7 HTTPS

HTTP是一个设计简单的协议,并不涉及到全面的安全验证

  • 通信明文,内容可能被窃听
  • TCP/IP工作机制,是可以在通信链路上被窃听的
  • 不验证通信双方身份,可能被伪装
    • 可以验证双方的证书
    • 避免Dos攻击
  • 不验证报文的完整性
    • 需要做MAC

可以采用TLS/SSL对于通信进行加密

8 访问认证

服务端有可能需要确认客户端以及客户端当前使用人的身份

  • BASIC认证。没人用
    • 只防君子
    • 密码Base64编码后存储在报文里,没有加密可言
  • SSL认证
    • 认证客户端证书
  • 基于表单认证
    • Web应用自实现的认证方式

9 基于HTTP的协议

HTTP协议中,服务端不具备主动推动客户端的能力,所以难以做到推送机制

  • WebSocket
    • 支持服务端向客户端推送数据
    • 减少通信量,建立起WebSocket连接后,就会一直保持通信状态。连接开销减小,WebSocket首部信息也小
    • 需要再HTTP首部字段加上Upgrade: websocket 告知服务端进行握手,服务端响应后,返回101 Switching Protocols响应

10 HTTP安全

还是先等到专门一起的安全读物里做总结吧