书籍链接: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
- 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安全
还是先等到专门一起的安全读物里做总结吧