HTTP 和 HTTPS的区别

http 即 超文本传输协议 在计算机世界里传输文字 图片 视频 音频等数据的规范和约束

说道http就不得不提TCP/IP网络模型 一般是五层
应用层(https/http/ftp/telent/dns)
传输层 (TCP/UDP)
网络层 (IP,ARP)
链路层(MAC)
物理层 (网卡。。。)
HTTPS 比HTTP多了一层安全保证 HTTPS 是 HTTP+TLS/SSL 的协议组合 安全性是由HTTP+TLS/SSL来保证的

HTTP面试题 - 图1

  1. 最简单的区别 http协议是以http开头 ,HTTPS是以https//开头的
  2. HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。

    HTTP GET 和 POST的区别

  3. get请求的参数是拼接在url的后面的, 而url的长度是有限制 从几千到几万个字符不等 所get请求能携带的数据有限 post的数据是放在请求体中的 对数据长度没有限制

  4. 用途不一样 get请求通常是从服务器拿数据 一般不会对服务端数据造成改变 post请求经常用于提交更新数据到服务器
  5. get的请求会被缓存 post一般不会 除非手动设置
  6. get请求在发送过程中产生一个TCP数据包 post在发送过程中产生两个TCP数据包 对于get请求浏览器会把http header和data一并发出去 。 而对于post 浏览器先发送header 服务器响应100 continue ,浏览器在发送Data
  7. get请求在浏览器反复的回退/前进过程是无害的 而post会再次提交表单

    什么是无状态协议? http是无状态协议吗? 如果是怎么解决?

    无状态协议值得是浏览器对于事物的处理没有记忆能力,举个例子 客户请求获得网页之后关闭浏览器,然后启动浏览器 登录改网站,但是服务器并不知道客户关闭了一次浏览器
    http就是一种无状态的的协议 他对用户的操作没有记忆能力,可能大多数用户不相信 他可能觉得这次登录了下次下次登录就不用输密码了,这其实不是http做的事情 这是cookie的功劳 它让浏览器有了记忆能力
    首先cookie怎么来呢?

  8. 当服务端第一次收到客户端的请求的时候,服务端会创建session对象, 然后把sessionId存在response的Set-Cookie的头字段里,带给浏览器

  9. 浏览器接收到后就会把Set-Cookie里包含的信息存起来,然后后面每次发送的http的请求的时候都会带上cookie到服务端,服务器从cookie里去sessionId,这样你的浏览器才有了记忆能力

还有一种方式是JWT机制,它也是能够让你的浏览器具有记忆能力的机制, JWT是可以保存在cookie中 也可以保存在localStorage中, 下次请求的时候带在请求头就行了

TCP 是什么?

TCP 全称是传输控制协议, 他能够帮助你确定计算机连接Internet 以及他们之间的数据传输,通过三次握手来启动确认TCP连接。一旦连接就可以发送数据了,当数据传输完成就会断开连接
TCP的主要特点

  1. TCP能够确保连接的建立和数据包的发送
  2. TCP 支持错误重传机制
  3. TCP支持拥塞控制 能够在网络堵塞的情况下延迟发送
  4. TCP能够提供错误校验 真被有害的数据包

TCP和UDP有什么不同

TCP UDP
面向连接的协议 无链接
发送数据前需要三次握手 建立连接 不要建立连接
按照特定书序重新排列数据包 数据包没有固定的顺序
传输速度较慢 传输速度快
头部有20字节 头部只有8字节
TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK 无握手协议
TCP 是可靠的,因为它可以确保将数据传送到服务器 在 UDP 中不能保证将数据传送到目标。

TCP 三次握手

在了解具体的流程前 我们先要认识几个概念

SYN 这消息是用来初始化和建立连接的
ACK 帮助对方去人收到SYN消息
SYN-ACK 本地的SYN消息 和焦躁的ACK 数据包
FIN 用来断开连接
  • SYN 他的全程是synchronize sequence numbers 同步序列号 是TCP/IP建立连接时使用的握手信号,在客户机和服务器之间建立TCP连接时候,首先会发送一个信号,客户端在接受到SYN消息时候,就会在自己的端内生成一个随机值X
  • SYN-ACK 服务器收到SYN后,会发送一个SYN-ACk作为答复,确认号是比接受的SYN多一个,即SYN+1, 服务器为数据包选择的序列号是理你个随机数Y
  • ACK 表示发来的数据已经确认接受无误,最后客户端将ACK 发送给服务器 序列号被设置为Y+1

    为甚么是三次握手而不是两次?

    说是三次握手 其实是四次 为什么这么说呢 请看下面

    1. Alice ---> Bob SYNchronize with my Initial Sequence Number of X
    2. Alice <--- Bob I received your syn, I ACKnowledge that I am ready for [X+1]
    3. Alice <--- Bob SYNchronize with my Initial Sequence Number of Y
    4. Alice ---> Bob I received your syn, I ACKnowledge that I am ready for [Y+1]

    对应的步骤

  1. Alice 生成一个初始化序列号(ISN) X, 并且同步给Bob
  2. Bob 确认收到了Alice的ISN
  3. Bob 生成了一个初始化序列号(ISN) Y, 并且同步给Alice
  4. Alice 确认收到了Bob的ISN

    实际张中间两步是合在一起的,所以实际的步骤就是下面这样的

    1. Bob <--- Alice SYN
    2. Bob ---> Alice SYN ACK
    3. Bob <--- Alice ACK

所以为什么有三次握手呢?因为假如是两次的话 那就下面这样

  1. Bob <--- Alice SYN
  2. Bob ---> Alice ACK

只能确认服务端有接受数据的能力 客户端有发送数据的能力 => 这样客户端只能发送数据给服务端
但是仅仅这样是不行的 TCP是双向通信协议,这意味着任何一段都可以向对方发送消息
所以就需要Bob再同步消息给Alice,来确保服务端也有发送数据的能力 客户端也有接受数据的能力
所以必须通过三次握手来建立一次TCP链接

TCP 四次挥手

在链接终止阶段使用四次挥手 链接的每一段都会独立的终止。下面我们来面熟一下过程

  • 首先 客户端应用程序决定要终止链接(服务端也可以选择断开连接),这会使客户端将FIN发送给服务器。进进入到FIN_WAIT_1的状态,当客户端处于FIN_WAIT_1的状态时,他会等待来自服务器的ACK响应
  • 然后第二步 当服务器接收到FIN消息的时候 会立即向客户端发送ACK确认消息
  • 当客户端收到来自服务器的ACK的时候 客户端就进入FIN_WAIT_2状态 然后等待来自服务器的FIN 消息
  • 服务器发送ACK确认消息后 一段时间后(可以进行关闭后) 会发送FIN到客户端 告知客户端可以关闭了
  • 当客户端收到服务端发送过来的FIN消息后,客户单就会由FIN_WAIT_2 状态进入TIME_WAIT状态,处于TIME_WAIT状态的客户端允许冲洗发送ACK到服务器为了防止信息丢失,客户端在TIME_WAIT 状态下话费的时间取决于它的实现。在等待了一段时间后, 链接关闭,客户端上所有的资源(包括端口号 缓冲区数据)都被释放