HTTP与RESTful

HTTP

HTTP是一个属于应用层的协议,特点是简介、快速

HTTP发展史

HTTP客户端发起请求,创建端口
HTTP服务器在端口监听客户端请求
HTTP服务器向客户端返回状态和内容

网络请求,页面渲染

1、域名解析

  • 以Chrome浏览器为例,域名解析过程:

    • 1、Chrome搜索自身的DNS缓存
    • 2、搜索操作系统自身的DNS缓存(浏览器没有找到缓存或缓存已经过期失效):chrome://net-internals/#dns查看DNS缓存记录
    • 3、读取本地的HOST文件
    • 4、浏览器发起一个DNS的一个系统调用,一般向本地主控DNS服务器
    • 5、浏览器获得域名对应的IP地址后,发起HTTP "三次握手"
    • 6、TCP/IP连接建立起来后,浏览器就可以向服务器发送HTTP请求了,使用了比如说,用HTTP的GET方法请求一个根域里的一个域名,协议可以采用HTTP1.0的一个协议。
    • 7、服务器端接收到了这个请求,根据根路径参数,经过后端的一些处理之后,把处理后的一个结果的数据返回浏览器,如果是慕课网的页面就会把完整的HTML页面代码返回给浏览器。
    • 8、浏览器拿到了慕课网的完整的HTML页面代码,在解析和渲染这个页面的时候,里面的JS、CSS、图片静态资源,它们同样也是一个个HTTP请求,都需要经过上面的主要的七个步骤。
    • 9、浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给了用户。
  • 运营商DNS服务器

    • 1、宽带运营商服务器查看本身缓存
    • 2、运营商服务器发起一个迭代的DNS解析请求
      • 运营商服务器把结果返回操作系统内核同时缓存起来
      • 操作系统内核把结果返回浏览器
      • 最终浏览器拿到了www.imooc.com对应的IP地址

浏览器以一个随机端口向服务器的Web程序发起一个TCP连接请求,此连接请求通过层层路由设备到达网卡,然后进入内核的TCP/IP协议栈(有可能经过防火墙过滤),最终到达Web服务端。

HTTP交互过程
1、客户端发送SYN同步报文给服务端
2、服务端收到SYN同步报文之后,给客户端一个回复报文SYN,ACK报文
3、客户端收到第二条报文之后,会再给服务端回复一个ACK报文

连接建立完成之后,客户端和服务端就可以进行正常的HTTP网络请求

4、客户端发送一个HTTP请求报文到服务端
5、服务端收到客户端的HTTP请求报文,处理之后把数据返回给客户端,产生第五条HTTP响应报文

当客户端和服务端之间结束网络请求之后,这条TCP连接通道就会关闭
假如断开由客户端发起,流程:
6、客户端发送FIN终止信号报文
7、服务端收到客户端发送的终止信号之后,服务端会回复给客户端一个ACK确认报文

当客户端收到第七条报文之后,有客户端向服务端方向的连接就已经断开

8、过一段时间,服务端又会发送给客户端第八条FIN、ACK终止报文
9、客户端收到第八条报文之后,会回复给服务端一条ACK确认报文,此时由服务端到客户端方向的TCP连接通道关闭。

TCP 连接通道是一个全双工的通道,并不是两条通道

Wireshark工具查看HTTP工作流程

HTTP消息体
HTTP Request 协议格式
HTTP Request 协议格式
• {请求方法}{/相对路径} HTTP/{http版本}\r\n         \r\n = CRLF
• Header-Name-1:value\r\n
• Header-Name-2:value\r\n
• \r\n
• Optional Request Boby
HTTP Request 协议格式
HTTP Request 协议格式
• HTTP/{version} {status-code} {message}\r\n
• Header-Name-1:value\r\n
• Header-Name-2:value\r\n
• \r\n
• Optional Request Boby

Headers:头信息

Preview:资源预览

Response:么有处理的响应的响应的正文

Cookies:请求和返回的Cookies

Timing:图形化显示每个阶段耗费的时间

Stalled:等待时间:浏览器要发出请求到请求可以发出的等待时间,一般是代理协商以及要等到TCP连接释放的时间不包含DNS查询和建立TCP连接的时间。

Proxy negotiation:代理协商的时间

Request sent:请求时间:第一个字节发出前,到最后一个字节发出后的时间,可以理解为请求时间或上传时间

Watting(TTFB):请求发出以后到收到响应的第一个字节所花费的时间,包括整个数据在路由贯穿中所延迟的时间,以及服务器端响应这个请求做的处理时间

Content Download:收到第一个字节开始到收到最后一个字节结束所花费的时间

charles工具:抓取HTTP请求和响应数据

Telnet模拟HTTP请求

HTTPS:Hyper Text Transfer Protocol over Secure Socket Layer.基于SSL层的HTTP

HTTP与HTTPS不同之处

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费;
  • HTTP是明文传输,HTTPS则是具有安全性的SSL加密传输;
  • HTTP和HTTPS使用的端口也不一样,前者是80,后者是443;
  • HTTPS可进行加密传输,身份认证,比HTTP安全。

HTTP最大特点是无连接无状态。

  • 限制每次连接只处理一个请求,服务器处理完客户的请求之后并且接收到客户端的答应后断开此连接。这种方式的最大好处是节省传输时间。HTTP1.0,早期客户端与服务端交换的间歇性较大,大部分通道处于空闲,会无端占用资源,利用这一特点设计了请求时建立连接,请求完毕后释放连接,这样可以尽快释放资源,服务其他客户端。

  • 随着时间推移,keep-alive诞生,解决效率低的问题,功能是客户端到服务端连接持续有效。当出现对服务器后续请求时,keep-alive避免了重新建立连接。也可以叫做HTTP的持久连接,可以使用同一TCP连接来发送和接受多个HTTP请求和应答。

安全套接字层SSL & 安全传输层TLS

  • SSL:Secure Sockets Layer安全套接层
  • TLS:Transport Layer Securuty 传输层安全,SSL继任者
  • TLS与SSL在传输层之上对网络连接进行加密,为网络通信提供安全及数据完整性

SSL协议

为了解决以下风险而设计产生:

  • 所有信息都是加密传播,第三方无法窃听
  • 具有校验机制,一旦被篡改,通信双方会立刻发现
  • 配备身份证书,防止身份被冒充
HTTP与HTTPS架构
SSL连接建立过程
1、客户端发送握手信息给服务端,2个内容:随机数number1,协商的加密算法(或者客户端支持的加密算法)
2、服务端给予客户端响应握手信息,随机数number2,匹配好的协商加密算法(一定是客户端传给服务器端的加密算法的一个子集)
3、服务端给客户端第一个响应报文之后,随即又会传递给客户端第二个响应报文,即服务端的证书
4、客户端收到服务端传递的证书之后,对证书进行验证,是否有效、合法(1、客户端验证服务端证书的数字摘要和证书解密后的内容是否被篡改;2、证书链。逐级验证服务端的证书,一直到根证书是否在我们的操作系统的可信任证书列表当中。根证书会被植入到浏览器中或操作系统中)
5、客户端组装会话秘钥(组装有三个内容:通过客户端自己保留的随机数number1、随机数number2,预主秘钥组装会话秘钥)
6、客户端将预主秘钥通过服务端传递过来的证书里面的公钥加密,然后传递给服务端
7、服务端拿到加密过的预主秘钥,通过私钥解密域主秘钥,服务端也获取到三个随机数
8、服务端拿到三个随机数开始组装会话密钥
9、客户端通过组装的会话密钥去加密一条消息,把加密后的握手消息传递给服务端,主要为了验证服务端能否正常接收客户端加密过的数据消息
10、服务端同样发送一个加密后的握手消息给客户端,来验证客户端是否能正常解析加密过的数据。9,10两步验证通过,客户端与服务端之间的SSL连接就建立完成了。

预主密钥:由客户端产生,传递给服务端,在会话中起着非常重要的作用,配合随机数1和随机数2生成最终的会话密钥。传递的随机数和预主秘钥完全可以只有预主秘钥承担,为什么产生三个随机数:协议设计之初,假设客户端所产生的随机数不是真正的随机数,为了保证随机数的随机性,我们通过产生多个随机数来达到最终产生的秘钥具有非常好的随机性,防止被中间攻击人随意窃取。

公钥、私钥:非对称加密中的专业术语。

对称加密算法:加密所使用的秘钥和解密所使用的秘钥相同。常见的有AES、DES。安全性差,因为需要将私钥传输给服务端。

对称加密

非对称加密:使用公钥进行加密,解密使用私密的算法。常见RSA。

非对称加密

请求方法

  • GET:请求获取Request-URI所标识的资源
  • POST:新创建资源,在Request-URI所标识的资源后附加新的数据
  • PUT:请求服务器存储一个资源,并用Request-URI作为其标识。向指定资源位置上传最新内容
  • DELETE:请求服务器删除Request-URI所标识的资源
  • HEAD:请求获取由Request-URI所表示的资源的响应消息报头,可以不用传入全部内容
  • TRACE
  • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

状态码

  • 1xx:信息响应类,表示接收到请求并且继续处理
  • 2xx:处理成功响应类,表示动作被成功接收、理解和接受
  • 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
  • 4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
  • 5xx:服务器端错误,服务器不能正确执行一个正确的请求

常用状态码

  • 200 OK 客户端请求成功
  • 400 Bad Request 客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized 服务器收到请求,但是拒绝提供服务
  • 404 Not Found 请求资源不存在
  • 500 Internal Server Error 服务器发生不可预期的错误
  • 503 Server Unavailable 服务器当前不能处理客户端的请求

URL:同一资源定位符,偏重定位,说明了通过那种协议来访问一个资源。

URI:同一资源标识符,偏重标识,一个字符串格式规范。

URL是URI的子集。

Restful

  • REST(Resource Representational State Transfer)是Roy Thomas Fielding在他2000年的博士论文中提出的。如果一个架构符合REST原则,就称为RESTful架构

  • 本质:一种软件架构风格

  • 核心:面向资源

  • 解决问题:降低开发的复杂性;提高系统的可伸缩性

  • Restful资源层Resource:文本、图片、服务、音频等等

  • Restful表现层Representational

    • 文本:txt、html、xml、json、二进制
    • 图片:jpg、png
    • Case:book是一个资源,获取不同的格式
    • http协议的content-type和accept
  • Restful状态转化State Transfer

    • 幂等性:每次HTTP请求相同的参数,相同的URI,产生的结果是相同的
    • GET
    • POST
    • PUT
    • DELETE

设计概念和准则

  • 网络上的所有事物都可以被抽象为资源。
  • 每一个资源都有唯一的资源标识,对资源的操作不会改变这些标识。
  • 所有的操作都是无状态的。

资源:网络上的一个实体,或者说是网络上的一个具体信息。

schema://host[:port]/path [?query-string][#anchor]

  • schema:指定底层使用的协议(例如:http,https,ftp)

  • host:服务器的IP地址或者域名

  • port:服务器端口,默认为80

  • path:访问资源的路径

  • query-string:发送给http服务器的数据

  • anchor:锚

SOAP WebService

WebService:是一种跨编程语言和操作系统平台的远程调用技术。

WebService通过HTTP协议发送请求和接收结果时采用XML格式封装,并增加了一些特点的HTTP消息头,这些特定的HTTP消息头和XML内容格式就是SOAP协议。

效率与易用性

SOAP由于各种需求不断扩充其本身协议的内容,导致在SOAP处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。

RESTful由于其面向资源接口设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了http最初的应用协议设计理念。

安全性

RESTful对于资源型服务接口来说很合适,同时特别适合对效率要求很高,但是对于安全要求不高的场景。

SOAP的成熟性可以给需要提供给多开发语言,对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义,关键还是看应用场景。

如何设计RESTful API

  • 资源路径(URI)
  • HTTP动词
  • 过滤信息
  • 状态码
  • 错误处理

HTTP动词

对于资源的操作(CRUD),由HTTP动词(谓词)表示。

  • GET:从服务器取出资源(一项或多项)
  • POST:在服务器新建一个资源
  • PUT:在服务器更新资源(客户端提供改变后的完整资源)
  • PATCH:在服务器更新资源(客户端提供改变的属性)
  • DELETE:从服务器删除资源
请求类型 请求路径 功能
GET /books 获取列表
POST /book 创建一本书
GET /books/id 通过id查询一本书列表
PUT /book/id 通过id更新一本书
DELETE /book/id 通过id删除一本书

过滤信息

  • 如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

举例:

  • ?offset=10:指定返回记录的开始位置
  • ?page=2&per_page=100:指定第几页,以及每页的记录数
  • ?sortby=name&order=asc:指定返回结果排序,以及排序顺序
  • ?animal_type_id=1:指定筛选条件

你可能感兴趣的:(HTTP与RESTful)