在面试中,计算机网络是面试官最喜欢考察的内容之一
下面是我整理的一些高频计算机网络常问面试题,只要掌握了,分分钟拿捏面试官
11、Get与POST的区别
- GET 一般用来从服务器上获取资源,POST 一般用来创建资源
- GET 是幂等的,即读取同一个资源,总是得到相同的数据,而 POST 不是幂等的。GET 不会改变服务器上的资源,而 POST 会对服务器资源进行改变
- 请求参数形式上看,GET 请求的数据会附在 URL 之后,以 ”?“分割 URL 和传输数据,参数之间以 ”&“ 连接;而 POST 请求会把提交的数据则放置在是HTTP请求报文的 body 中
- POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而 POST 请求参数则被包装到请求体中,相对更安全
- GET 请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的
12、Session、Cookie 的区别
- session 在服务器端,cookie 在客户端(浏览器)
- session 默认被存储在服务器的一个文件里(不是内存)
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
- session 可以放在文件、数据库、或内存中都可以
13、简单聊聊 HTTP 协议吧
HTTP 是一种超文本传输协议 (Hypertext Transfer Protocol),主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol)
超文本指的是HTML,css,JavaScript和图片等,HTTP的出现是为了接收和发布HTML页面,经过不断的发展也可以用于接收一些音频,视频,文件等内容
HTTP协议是用于客户端和服务器端之间的通信,用于客户端和服务器端之间的通信有HTTP协议和TCP/IP协议族在内的其他众多的协议。
请求访问文本或图片等资源的一方,我们叫做客户端;负责接收,提供响应的一方称为服务器端
14、URI 和 URL 的区别
- URI
统一资源标识符(uniform resource identifier)用来唯一标识一个资源
- URL
统一资源定位符(uniform resource locator)
15、GET 和 POST 方法都是安全和幂等的吗?
先说明下安全和幂等的概念:
- 在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
- 所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的
那么很明显 GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的
16、说说 HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
HTTP/1.1 相比 HTTP/1.0 性能上的改进:
- 使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持 管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间
但 HTTP/1.1 还是有性能瓶颈:
- 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩
Body
的部分; - 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
- 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
- 没有请求优先级控制;
- 请求只能从客户端开始,服务器只能被动响应
17、那上面的 HTTP/1.1 的性能瓶颈,HTTP/2 做了什么优化?
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的
HTTP/2 相比 HTTP/1.1 性能上的改进:
- 头部压缩
HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复部分
这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了
- 二进制格式
HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式
头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧
这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率
- 数据流
HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应
每个请求或回应的所有数据包,称为一个数据流(Stream)
每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数
客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求
- 多路复用
HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应
移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率
举例来说,在一个 TCP 连接里,服务器收到了客户端 A 和 B 的两个请求,如果发现 A 处理过程非常耗时,于是就回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分
- 服务器推送
HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息
举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送(Server Push,也叫 Cache Push)
18、说说 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三次握手
- 第一次握手:客户端发送一个SYN包给服务端,然后进入到SYN_SENT状态
- 第二次握手:处在监听状态的服务端收到客户端的SYN包后进行回应:发送一个ACK包给客户端,同时发送一个SYN包给客户端,然后进入到SYN_RCVD状态
- 第三次握手:客户端在收到服务端的SYN包后发送一个ACK包进行确认,然后进入到
ESTABLISHED(连接成功状态)。服务端在收到ACK包后也进入ESTABLISHED(连接成功状态)
TCP四次挥手
- 第一次挥手:客户端先发送一个 FIN 包给服务端,然后进入到 FIN_WAIT1(终止等待1)状态
- 第二次挥手:服务端收到 FIN 包之后对其进行回应:发送一个 ACK 包给客户端,然后进入到 close_wait(关闭等待)状态。这时候服务端处于半关闭状态。
- 第三次挥手:同时服务端也请求关闭连接,发送一个 FIN 包给客户端,然后进入
LAST_ACK(最后确认)状态 - 第四次挥手:客户端在收到服务端发送的ACK包之后进入到 FIN_WAIT2(终止等待2)状态,对服务端发来的 FIN 包进行回应:发送一个 ACK包 给服务端,然后进入到TIME_WAIT(时间等待)状态,等待 2MSL(最长报文段寿命)后进入关闭状态,服务端在收到客户端发来的 ACK 包之后立即进入关闭状态
19、简单聊聊HTTP 工作原理
- 客户端与 web 服务器建立连接(TCP 三次握手)
- 客户端发送 HTTP 请求
- 服务端接收请求并返回 HTTP 响应
- 释放 TCP 连接
- 客户端浏览器解析 HTML 内容
20、什么是无状态协议,HTTP 是无状态协议吗,怎么解决无状态带来的问题
无状态协议(Stateless Protocol) 就是指浏览器对于事务的处理没有记忆能力。举个例子来说就是比如客户请求获得网页之后关闭浏览器,然后再次启动浏览器,登录该网站,但是服务器并不知道客户关闭了一次浏览器
HTTP 就是一种无状态的协议,他对用户的操作没有记忆能力。可能大多数用户不相信,他可能觉得每次输入用户名和密码登录一个网站后,下次登录就不再重新输入用户名和密码了。这其实不是 HTTP 做的事情,起作用的是一个叫做 Cookie 的机制。它能够让浏览器具有记忆能力
当你向服务端发送请求时,服务端会给你发送一个认证信息,服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 session id ,并通过响应头的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客户端返回要求设置 Cookie 的响应;
客户端收到响应后,在本机客户端设置了一个 JSESSIONID=XXXXXXX 的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束
接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 session id ),然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。这样,你的浏览器才具有了记忆能力