面试官99% 会问的这些HTTP问题(上)

    技术2022-07-11  86

    HTTP 和 HTTPS 的区别

    HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

     

    HTTP 主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol)。

    超文本就是不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转。上面这些概念可以统称为数据,传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。而协议指的就是是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为协议,只不过是网络协议。

    说到 HTTP,不得不提的就是 TCP/IP 网络模型,一般是五层模型。如下图所示

     

    但是也可以分为四层,就是把链路层和物理层都表示为网络接口层

     

    还有一种就是 OSI 七层网络模型,它就是在五层协议之上加了表示层和会话层

     

    而 HTTPS 的全称是 Hypertext Transfer Protocol Secure,从名称我们可以看出 HTTPS 要比 HTTPS 多了 secure 安全性这个概念,实际上, HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 TLS/SSL 所做的工作。

    也就是说,HTTPS 就是身披了一层 SSL 的 HTTP。

     

    那么,HTTP 和 HTTPS 的主要区别是什么呢?

    最简单的,HTTP 在地址栏上的协议是以 http:// 开头,而 HTTPS 在地址栏上的协议是以 https:// 开头

    http://www.cxuanblog.com/ https://www.cxuanblog.com/

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

     

    HTTP 的默认端口是 80,而 HTTPS 的默认端口是 443。

    HTTP Get 和 Post 区别

    HTTP 中包括许多方法,Get 和 Post 是 HTTP 中最常用的两个方法,基本上使用 HTTP 方法中有 99% 都是在使用 Get 方法和 Post 方法,所以有必要我们对这两个方法有更加深刻的认识。

    get 方法一般用于请求,比如你在浏览器地址栏输入 www.cxuanblog.com 其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源,而 post 方法一般用于 <form> 表单的提交,相当于是把信息提交给服务器,等待服务器作出响应,get 相当于一个是 pull/拉的操作,而 post 相当于是一个 push/推的操作。get 方法是不安全的,因为你在发送请求的过程中,你的请求参数会拼在 URL 后面,从而导致容易被攻击者窃取,对你的信息造成破坏和伪造; /test/demo_form.asp?name1=value1&name2=value2

    而 post 方法是把参数放在请求体 body 中的,这对用户来说不可见。

    POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2 get 请求的 URL 有长度限制,而 post 请求会把参数和值放在消息体中,对数据长度没有要求。get 请求会被浏览器主动 cache,而 post 不会,除非手动设置。get 请求在浏览器反复的 回退/前进 操作是无害的,而 post 操作会再次提交表单请求。get 请求在发送过程中会产生一个 TCP 数据包;post 在发送过程中会产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 post,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。

    什么是无状态协议,HTTP 是无状态协议吗,怎么解决

    无状态协议(Stateless Protocol) 就是指浏览器对于事务的处理没有记忆能力。举个例子来说就是比如客户请求获得网页之后关闭浏览器,然后再次启动浏览器,登录该网站,但是服务器并不知道客户关闭了一次浏览器。

    HTTP 就是一种无状态的协议,他对用户的操作没有记忆能力。可能大多数用户不相信,他可能觉得每次输入用户名和密码登陆一个网站后,下次登陆就不再重新输入用户名和密码了。这其实不是 HTTP 做的事情,起作用的是一个叫做 小甜饼(Cookie) 的机制。它能够让浏览器具有记忆能力。

    如果你的浏览器允许 cookie 的话,查看方式 chrome://settings/content/cookies

     

    也就说明你的记忆芯片通电了… 当你想服务端发送请求时,服务端会给你发送一个认证信息,服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应; 客户端收到响应后,在本机客户端设置了一个 **JSESSIONID=XXXXXXX **的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束;

     

    接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。这样,你的浏览器才具有了记忆能力。

     

    还有一种方式是使用 JWT 机制,它也是能够让你的浏览器具有记忆能力的一种机制。与 Cookie 不同,JWT 是保存在客户端的信息,它广泛的应用于单点登录的情况。JWT 具有两个特点

    JWT 的 Cookie 信息存储在客户端,而不是服务端内存中。也就是说,JWT 直接本地进行验证就可以,验证完毕后,这个 Token 就会在 Session 中随请求一起发送到服务器,通过这种方式,可以节省服务器资源,并且 token 可以进行多次验证。JWT 支持跨域认证,Cookies 只能用在单个节点的域或者它的子域中有效。如果它们尝试通过第三个节点访问,就会被禁止。使用 JWT 可以解决这个问题,使用 JWT 能够通过多个节点进行用户认证,也就是我们常说的跨域认证。

    UDP 和 TCP 的区别

    TCP 和 UDP 都位于计算机网络模型中的运输层,它们负责传输应用层产生的数据。下面我们就来聊一聊 TCP 和 UDP 分别的特征和他们的区别

    UDP 是什么

    UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。

    数据报是与分组交换网络关联的传输单元。

    UDP 的特点主要有UDP 能够支持容忍数据包丢失的带宽密集型应用程序UDP 具有低延迟的特点UDP 能够发送大量的数据包UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。

    TCP 是什么

    TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。

    TCP 的主要特点有

    TCP 能够确保连接的建立和数据包的发送TCP 支持错误重传机制TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送TCP 能够提供错误校验和,甄别有害的数据包。

    TCP 和 UDP 的不同

    下面为你罗列了一些 TCP 和 UDP 的不同点,方便理解,方便记忆。

    TCP UDP

    TCP 是面向连接的协议 UDP 是无连接的协议TCP 在发送数据前先需要建立连接,然后再发送数据 UDP 无需建立连接就可以直接发送大量数据TCP 会按照特定顺序重新排列数据包 UDP 数据包没有固定顺序,所有数据包都相互独立TCP 传输的速度比较慢 UDP 的传输会更快TCP 的头部字节有 20 字节 UDP 的头部字节只需要 8 个字节TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。 UDP 是轻量级的。没有跟踪连接,消息排序等。TCP 会进行错误校验,并能够进行错误恢复 UDP 也会错误检查,但会丢弃错误的数据包。TCP 有发送确认 UDP 没有发送确认TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK 无握手协议 TCP 是可靠的,因为它可以确保将数据传送到路由器。 在 UDP 中不能保证将数据传送到目标。

    TCP 三次握手和四次挥手

    TCP 三次握手和四次挥手也是面试题的热门考点,它们分别对应 TCP 的连接和释放过程。下面就来简单认识一下这两个过程

    TCP 三次握手

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

    消息类型 描述

    SYN 这个消息是用来初始化和建立连接的。

    ACK 帮助对方确认收到的 SYN 消息

    SYN-ACK 本地的 SYN 消息和较早的 ACK 数据包

    FIN 用来断开连接

    SYN:它的全称是 Synchronize Sequence Numbers,同步序列编号。是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立 TCP 连接时,首先会发送的一个信号。客户端在接受到 SYN 消息时,就会在自己的段内生成一个随机值 X。SYN-ACK:服务器收到 SYN 后,打开客户端连接,发送一个 SYN-ACK 作为答复。确认号设置为比接收到的序列号多一个,即 X + 1,服务器为数据包选择的序列号是另一个随机数 Y。ACK:Acknowledge character, 确认字符,表示发来的数据已确认接收无误。最后,客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y + 1。

    如果用现实生活来举例的话就是

    小明 - 客户端 小红 - 服务端

    小明给小红打电话,接通了后,小明说喂,能听到吗,这就相当于是连接建立。小红给小明回应,能听到,你能听到我说的话吗,这就相当于是请求响应。小明听到小红的回应后,好的,这相当于是连接确认。在这之后小明和小红就可以通话/交换信息了。

    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 状态下花费的时间取决于它的实现,在等待一段时间后,连接关闭,客户端上所有的资源(包括端口号和缓冲区数据)都被释放。

    还是可以用上面那个通话的例子来进行描述

    小明对小红说,我所有的东西都说完了,我要挂电话了。小红说,收到,我这边还有一些东西没说。经过若干秒后,小红也说完了,小红说,我说完了,现在可以挂断了小明收到消息后,又等了若干时间后,挂断了电话。

    简述 HTTP1.0/1.1/2.0 的区别

    HTTP 1.0

    HTTP 1.0 是在 1996 年引入的,从那时开始,它的普及率就达到了惊人的效果。HTTP 1.0 仅仅提供了最基本的认证,这时候用户名和密码还未经加密,因此很容易收到窥探。HTTP 1.0 被设计用来使用短链接,即每次发送数据都会经过 TCP 的三次握手和四次挥手,效率比较低。HTTP 1.0 只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。HTTP 1.0 不支持断点续传,也就是说,每次都会传送全部的页面和数据。HTTP 1.0 认为每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)。

    HTTP 1.1

    HTTP 1.1 是 HTTP 1.0 开发三年后出现的,也就是 1999 年,它做出了以下方面的变化HTTP 1.1 使用了摘要算法来进行身份验证HTTP 1.1 默认使用长连接,长连接就是只需一次建立就可以传输多次数据,传输完成后,只需要一次切断连接即可。长连接的连接时长可以通过请求头中的 keep-alive 来设置HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。HTTP 1.1 支持断点续传,通过使用请求头中的 Range 来实现。HTTP 1.1 使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

    HTTP 2.0

    HTTP 2.0 是 2015 年开发出来的标准,它主要做的改变如下

    头部压缩,由于 HTTP 1.1 经常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。二进制格式,HTTP 2.0 使用了更加靠近 TCP/IP 的二进制格式,而抛弃了 ASCII 码,提升了解析效率强化安全,由于安全已经成为重中之重,所以 HTTP2.0 一般都跑在 HTTPS 上。多路复用,即每一个请求都是是用作连接共享。一个请求对应一个id,这样一个连接上可以有多个请求。

     

    最近整理了java架构文档和学习笔记文件以及架构视频资料和高清架构进阶学习导图免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。

    添加小助手VX:xuanwo008 领取资料备注好“”信息!即可获取

     

     

    Processed: 0.015, SQL: 12