网络协议

网络(http,tcp,udp,ssl,加密)

TCP/IP模型

网络结构有两种主流的分层方式: OSI 七层模型和 TCP/IP 四层模型

TCP/IP是指传输控制协议/网间协议,是目前世界上应用最广的协议

UDP

TCP 三次握手(建立链接)

以 A(Client) 与 B(Server) 通信为例子
· 第一次, A 向 B 发送消息, 收到消息。A 确认自己的发信能力和 B 的接收能力
· 第二次, B 向 A 发送消息, A 收到消息。A 确认自己的发送能力和接收能力,A 也确认B 的发送能力和接收能力
· 第三次, 最后 A 再向 B 发送消息, B 接收到消息。B 可确认 A 的接收能力和 B 的发送能力

Http和Https协议请求时都会通过Tcp三次握手建立Tcp连接。

通过三次握手,A和B都能确认自己和对方的收发信能力,相当于建立了互相的信任,就可以开始通信了

TCP 四次挥手(断开链接)

  • 第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了
  • 第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。
  • 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。
  • 第四次挥手:主机1收到主机2的FIN报文段,想主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。

主机1向主机2断开链接,主机1向主机2说我没有要发送的数据了要求断开链接,主机2回应说同意你断开链接,主机1就说那我断开链接,主机2说好的准备断开,最后主机1等待链接被关闭

握手协议是指主要用来让客户端及服务器确认彼此的身份的一类网络协议

除此之外,为了保护SSL记录封包中传送的数据,握手协议还能协助双方选择连接时所使用的加密算法、MAC算法及相关密钥

在传送应用程序的数据前,必须使用握手协议

OSI 与 TCP/IP 区别

  1. OSI 采用七层模型, TCP/IP 四层模型
  2. TCP/IP 网络接口层没有真正定义,只是概念性的描述。OSI 把它分成 2 层,每一层功能详尽。
  3. 在协议开发之前,就有了OSI模型,所以OSI模型具有共通性,而TCP/IP是基于协议建立的模型,不适用于非TCP/IP的网络
  4. 实际应用中,OSI模型是理论上的模型,没有成熟的产品;而TCP/IP已经成为国际标准

TCP 与 UDP

\ UDP TCP
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅 8 字节 首部最小 20 字节,最大 60 字节
适用场景 适用于实时应用(IP 电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

HTTP

https://http2.akamai.com/demo

HTTP 是基于 TCP/IP 协议的应用层协议,它不涉及数据包传输,主要规定了客户端可服务区之间的通信格式

HTTP是半双工协议,在同一时刻数据只能单向流动

HTTP是一个client-server协议,其作用有:

  1. 缓存
  2. 开放同源限制
  3. 认证
  4. 代理和隧道
  5. 会话(服务端的请求状态)

请求

GET / HTTP/1.1 # GET Method / Path HTTP/1.1 HTTP协议版本
Host: developer.mozilla.org # Headers
Accept-Languaage: fr # Headers

响应

HTTP/1.1 200 OK # 200 状态码 Ok 状态消息
Date: ....
Server: ...
Last-Modified: ...

请求/响应(req,res)

HTTP消息由采用ASCII编码的多行文本构成

在HTTP/1.1及早期版本中,这些消息通过连接公开地发送,在HTTP/2中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个HTTP帧中

起始行和 HTTP 消息中的HTTP 头统称为请求头,而其有效负载被称为消息正文

请求起始行

HTTP请求是由客户端发出的消息,用来使服务器执行动作。起始行 (start-line) 包含三个元素:

  1. HTTP 请求方法 GET | POST | OPTION | DELETE …
  2. 请求目标 (request target),通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征
    请求的格式因不同的 HTTP 方法而异。它可以是:
    · 一个绝对路径,末尾跟上一个 ’ ? ’ 和查询字符串。这是最常见的形式,称为 原始形式 (origin form),被 GET,POST,HEAD 和 OPTIONS 方法所使用。
    POST / HTTP 1.1
    GET /background.png HTTP/1.0
    HEAD /test.html?query=alibaba HTTP/1.1
    OPTIONS /anypage.html HTTP/1.0
    

· 一个完整的URL,被称为 绝对形式 (absolute form),主要在 GET 连接到代理时使用。
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
·由域名和可选端口(以’:‘为前缀)组成的 URL 的 authority component,称为 authority form。 仅在使用 CONNECT 建立 HTTP 隧道时才使用。
CONNECT developer.mozilla.org:80 HTTP/1.1
·星号形式 (asterisk form),一个简单的星号(’*’),配合 OPTIONS 方法使用,代表整个服务器。
OPTIONS * HTTP/1.1
3. HTTP 版本 (HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。

请求头

来自请求的 (HTTP headers)[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers] 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号 (’:’) 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长

请求内容

不是所有的请求都有一个 body
例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body

有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求

响应状态行

HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:

  1. 协议版本,通常为 HTTP/1.1。
  2. 状态码 (status code),表明请求是成功或失败。常见的状态码是 200,404,或 302。
  3. 状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

一个典型的状态行看起来像这样
HTTP/1.1 404 Not Found

响应主体

不是所有的响应都有 body:具有状态码 (如 201 或 204) 的响应,通常不会有 body

Body 大致可分为三类:

  1. Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-TypeContent-Length
  2. Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked 来使用 chunks 编码。
  3. Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

请求方法

GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
HEAD
方法请求一个与GET请求的响应相同的响应,但没有响应体.
POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT方法用请求有效载荷替换目标资源的所有当前表示。
DELETE方法删除指定的资源。
CONNECT方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS方法用于描述目标资源的通信选项。
TRACE方法沿着到目标资源的路径执行一个消息环回测试。
PATCH方法用于对资源应用部分修改。

HTTP 缓存

HTTP 缓存的最大用处

  1. 缓解服务器端压力
  2. 提升性能(获取资源的耗时更短了)

Cache-Control (req/res)

  1. no-store 禁止 req/res 进行缓存,每一次的 req 都会下载完整的响应内容
  2. no-cache 强制确认缓存, server 对 req 进行确认, cache 是否过期, 没过期就使用 cache
  3. public/private(缺省) public 会被任何中间人缓存,private 浏览器私有缓存

If-None-Match || If-Modified-Since (req)

理论上缓存是可以永久保存的,但只有有限的存储空间

该请求头信息可以检测服务器资源是否更新

缓存失效计算公式

expirationTime = responseTime + freshnessLifetime - currentAge

加速资源

对于一些低频率更新的资源,比如(css,js) 的 URL 后面加上一个版本号,该资源就会被视作完全新的资源,不好的地方就是每一处都会更新

而更好的就是当低频更新的资源(js/css)变动了,只用在高频变动的资源文件(html)里做入口的改动

Cookie

  1. 会话状态管理
  2. 修改化设置
  3. 浏览器行为追踪

现代浏览器中 Cookie 已经渐渐被淘汰,取而代之是 Web StorageIndexDB

SetCookie res

服务器响应头,指定设置 Cookie

Cookie req

客户端接收到响应,后服务端有 Set Cookie 头信息,则会用 Cookie 头信息将保存的 Cookie 信息发送出去

res

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: name=qlover
Sst-Cookie: age=20

req

GET /login.php HTTP/1.0
HOST: local.php.com
Cookie: name=qlover; age=20

Secure 标记,如果在 req 中 Cookie 中携带了 Secure 标记,则 req 只会从 HTTPS 发送

但 Cookie 发送数据太不安全,所以在 Chrome52+ 和 FF52+ http: 将无法使用 Secure

HttpOnly 标记,则会将该 Cookie 作用于客户端与服务器之间,也就是说普通的 document.cookie API 则无法访问带有 HttpOnly 标记的 Cookie

可以避免 XSS 攻击

Https

Https 协议是以安全为目标的 Http 通道,简单来说就是 Http 的安全版

主要是在Http下加入SSL层(现在主流的是SLL/TLS),SSL是Https协议的安全基础,Https 默认端口号为 443

SSL 主要分为两个层次,一是握手协议,二则是记录协议

其中记录协议是建立在 TCP 可靠传输协议之上,主要为高层协议提示数据封装、压缩、加密等的基本功能支持

而握手协议则是建立在记录协议之上,主要则是通讯双方的认证,协商加密算法以及交换加密密钥

SSL 工作过程如下:

发送方的工作过程为:
  从上层接受要发送的数据(包括各种消息和数据)
  对信息进行分段,分成若干纪录
  使用指定的压缩算法进行数据压缩(可选)
  使用指定的MAC算法生成MAC
  使用指定的加密算法进行数据加密
  加SSL记录协议的头,发送数据。
接收方的工作过程为:
  接收数据,从SSL记录协议的头中获取相关信息
  使用指定的解密算法解密数据
  使用指定的MAC算法校验MAC
  使用压缩算法对数据解压缩(在需要进行)
  将记录进行数据重组
  将数据发送给高层。

MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制

SLL 证书

SSL证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,需要从经销商购买。

证书有很多类型,按认证级别分类:

  1. 域名认证(DV=Domain Validation):最低级别的认证,可以确认申请人拥有这个域名
  2. 公司认证(OV=Organization Validation):确认域名所有人是哪家公司,证书里面包含公司的信息
  3. 扩展认证(EV=Extended Validation):最高级别认证,浏览器地址栏会显示公司名称。

Http 和 Https 的区别如下

  1. https协议需要到CA申请证书,大多数情况下需要一定费用
  2. Http是超文本传输协议,信息采用明文传输,Https则是具有安全性SSL加密传输协议
  3. Http和Https端口号不一样,Http是80端口,Https是443端口
  4. Http连接是无状态的,而Https采用Http+SSL构建可进行加密传输、身份认证的网络协议,更安全。
  5. Http协议建立连接的过程比Https协议快。因为Https除了Tcp三次握手,还要经过SSL握手。连接建立之后数据传输速度,二者无明显区别。

加密算法

  • 对称加密
    • 加解使用同一个密钥
    • 效率高,速度快,适合大数据量加解密
  • 非对称加密
    • 加解密使用不同密钥,公钥与密钥
    • 速度慢,但安全性高
  • Hash 算法
    • 只有加密无解密过程

RSA

Https协议就是使用RSA加密算法,可以说RSA加密算法是宇宙中最重要的加密算法

加密过程http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

WebSocket

WebSocket是一种全新的协议,随着HTML5草案的不断完善,越来越多的现代浏览器开始全面支持WebSocket技术了,它将TCP的Socket(套接字)应用在了webpage上,从而使通信双方建立起一个保持在活动状态连接通道

但还是建立在 HTTP 协议基础上的,所以连接发起方依然是客户端

而一旦确立 WebSocket 通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文

WebSocket 是类似 Socket 的TCP长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输

发布了4 篇原创文章 · 获赞 0 · 访问量 103
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览