计算机网络面试题

计算机网络面试题

一、HTTP/HTTPS

1、HTTP和HTTPS有什么区别

简单来说HTTPS是HTTP的安全版。

传输方式不同,http是超文本传输协议,信息是明文传输;https则具有安全性的SSL/TSL加密传输协议。

用的端口不同,http是80,https是443.

连接方式不同,http的连接是无状态的;https是由ssl/tsl+http构建的可进行加密传输、身份认证的网络协议。

客户端处理方式不同,如果 URL 的协议是 HTTP,则客户端会打开一条到服务端端口 80(默认)的连接,并向其 发送HTTP 请求。 如果 URL 的协议是 HTTPS,则客户端会打开一条到服务端端口 443(默认)的连接,然后与服务器握手,以二进制格式与服务器交换一些 SSL 的安全参数,附上加密的 HTTP 请求。HTTPS 比 HTTP 多了一层与 SSL 的连接,这也就是客户端与服务端 SSL 握手的过程,整个过程主要完成以下工作:交换协议版本号,选择一个两端都了解的密码,对两端的身份进行认证,生成临时的会话密钥,以便加密信道。

计算机网络面试题_第1张图片

2、Http1.1 和 Http1.0 及 2.0 的区别

Http1.1 和 Http1.0的区别:

(1)缓存处理。在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略https://www.cnblogs.com/wrmfw/archive/2011/09/05/2166910.html

(2)带宽优化以及网络连接的使用。HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利 用带宽和连接。

(3)错误通知的管理。在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

(4)Host头处理。在http1.0中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。

(5)长连接。HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启Connection: keep-alive,一定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。

HTTP2.0 HTTP1.X 相比的新特性

(1)新的二进制格式。HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。

(2)多路复用。即连接共享,每一个 request 都是用作连接共享机制的。一个 request 对应一个 id,这样一个连接上可以有多个 request,每个连接的request 可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属到各自不同的服务端请求里面。

(3)header压缩。HTTP1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需要传输的大小。

(4)服务端推送。同 SPDY 一样,HTTP2.0 也具有 server push 功能。

https://blog.csdn.net/weixin_39307273/article/details/104457767

3、Https 请求慢的解决办法

(1)不通过DNS解析,直接访问IP

(2)解决连接无法复用。比如:基于 tcp 的长连接 (主要) 移动端建立一条自己的长链接通道,通道的实现是基于tcp 协议。基于 tcp 的 socket 编程技术难度相对复杂很多,而且需要自己定制协议。但信息的上报和推送变得更及时,请求量爆发的时间点还能减轻服务器压力(避免频繁创建和销毁连接)

(3)解决 head of line blocking。它的原因是队列的第一个数据包(队头)受阻而导致整列数据包受阻使用 http pipelining(管线化),确保几乎在同一时间把 request 发向了服务器。https://blog.csdn.net/dongzhiquan/article/details/6114040

4、Http 的 request 和 response 的协议组成

(1)request组成

客户端发送一个 HTTP 请求到服务器的请求消息由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

计算机网络面试题_第2张图片

(2)request组成

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。

HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

计算机网络面试题_第3张图片

5、谈谈对 http 缓存的了解

HTTP 的缓存机制也是依赖于请求和响应 header 里的参数类实现的,最终响应式从缓存中取还是从服务端重新拉取。

HTTP 的缓存可以分为两种:

强制缓存:需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据是,服务端返回了缓存的过期时间(Expires 与 Cache-Control),没有过期就可以继续使用缓存,否则不适用,无需再向服务端询问。

对比缓存:需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端会将缓存标识(Last-Modified/If-Modified-Since 与 Etag/If-None-Match)与数据一起返回给客户端,客户端将两者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存 标识发送给服务端,服务端根据缓存标识进行判断, 如果返回 304,则表示通知客户端可以继续使用缓存。

https://www.cnblogs.com/chenqf/p/6386163.html

6、Http 长连接。

Http1.0 是短连接,HTTP1.1 默认是长连接,也就是默认 Connection 的值就是 keep-alive。但是长连接实质是指的 TCP 连接,而不是 HTTP 连接。TCP 连接是一个双向的通道,它是可以保持一段时间不关闭的,因此 TCP 连接才有真正的长连接和短连接这一说。

Http1.1 为什么要用使用 tcp 长连接?

长连接情况下,多个 HTTP 请求可以复用同一个 TCP 连接,这就节省了很多 TCP 连接建立和断开的消耗。

此外,长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在 header 当中进行设置的,也就是所谓的超时时间),这个连接没有 HTTP 请求发出的话,那么这个长连接就会被断掉。

7、Https 加密原理

加密算法基本有两种:对称加密和非对称加密。

对称加密,加密用的密钥和解密用的密钥是同一个,代表性的有AES加密算法

非对称加密,加密用的密钥称为公钥,解密用的称为私钥,代表性的有RSA加密算法

此外还有Hash加密算法:MD5,SHA1,SHA256

https的加密在SSL中完成,概括如下:

 1、客户端和服务端建立 SSL 握手,客户端通过 CA 证书来确认服务端的身份;

 2、互相传递三个随机数,之后通过这随机数来生成一个密钥;

 3、互相确认密钥,然后握手结束;

 4、数据通讯开始,都使用同一个对话密钥来加解密;

客户端校验 CA 证书

CA 证书中的 Hash 值,其实是用证书的私钥进行加密后的值(证书的私钥不在 CA 证书中)。然后客户端得到证书后,利用证书中的公钥去解密该 Hash 值,得到 Hash-a ;然后再利用证书内的签名 Hash 算法去生成一个 Hash-b 。最后比较 Hash-a 和 Hash-b 这两个的值。如果相等,那么证明了该证书是对的,服务端是可以被信任的;如果不相等,那么就说明该证书是错误的,可能被篡改了,浏览器会给出相关提示,无法建立起 HTTPS 连接。除此之外,还会校验 CA 证书的有效时间和域名匹配等。

HTTPS 中的 SSL 握手建立过程

假设现在有客户端 A 和服务器 B :

 1 、 首 先 , 客 户 端 A 访 问 服 务 器 B , 比 如 我 们 用 浏 览 器 打 开 一 个 网页 www.baidu.com ,这时,浏览器就是客户端 A ,百度的服务器就是服务器 B 了。这时候客户端 A 会生成一个随机数 1,把随机数 1 、自己支持的 SSL 版本号以及加密算法等这些信息告诉服务器 B 。

 2、服务器 B 知道这些信息后,然后确认一下双方的加密算法,然后服务端也生成一个随机数 B ,并将随机数 B 和 CA 颁发给自己的证书一同返回给客户端 A 。

 3、客户端 A 得到 CA 证书后,会去校验该 CA 证书的有效性,校验方法在上面已经说过了。校验通过后,客户端生成一个随机数 3 ,然后用证书中的公钥加密随机数 3 并传输给服务端 B 。

 4、服务端 B 得到加密后的随机数 3,然后利用私钥进行解密,得到真正的随机数3。

 5、最后,客户端 A 和服务端 B 都有随机数 1、随机数 2、随机数 3,然后双方利用这三个随机数生成一个对话密钥。之后传输内容就是利用对话密钥来进行加解密了。这时就是利用了对称加密,一般用的都是 AES 算法。

 6、客户端 A 通知服务端 B ,指明后面的通讯用对话密钥来完成,同时通知服务器 B 客户端 A 的握手过程结束。

 7、服务端 B 通知客户端 A,指明后面的通讯用对话密钥来完成,同时通知客户端A 服务器 B 的握手过程结束。

 8、SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户端 A 和服务器 B 开始使用相同的对话密钥进行数据通讯。

8、HTTPS 如何防范中间人攻击?

当数据传输发生在一个设备(PC/手机)和网络服务器之间时,攻击者使用其技能和工具将自己置于两个端点之间并截获数据;尽管交谈的两方认为他们是在与对方交谈,但是实际上他们是在与干坏事的人交流,这便是中间人攻击。

攻击方式有嗅探、数据包注入、会话劫持、SSL剥离

如何防范:https加密原理

9、有哪些响应码,分别都代表什么意思?

1** 信息,服务器收到请求,需要请求者继续执行操作

2** 成功,操作被成功接收并处理

3** 重定向,需要进一步的操作以完成请求

4** 客户端错误,请求包含语法错误或无法完成请求

5** 服务器错误,服务器在处理请求的过程中发生了错误

二、TCP/UDP

1、为什么 tcp 要经过三次握手,四次挥手?

“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。主要目的防止 server 端一直等待,浪费资源。换句话说,即是为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

“四次挥手”原因是因为 tcp 是全双工模式,接收到 FIN 时意味将没有数据再发来,但是还是可以继续发送数据。

三次握手

计算机网络面试题_第4张图片

第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 位置为 1,Sequence Number为 x;然后,客户端进入 SYN_SEND 状态,等待服务器的确认;

第二次握手:服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN报文段进行确认,设置 Acknowledgment Number 为 x+1(Sequence Number+1);同时,自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态;

第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将 Acknowledgment Number设置为 y+1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。

四次挥手

计算机网络面试题_第5张图片

第一次挥手:主机 1(可以使客户端,也可以是服务器端),设置 Sequence Number 和 Acknowledgment Number,向主机 2 发送一个 FIN 报文段;此时,主机 1 进入 FIN_WAIT_1状态;这表示主机 1 没有数据要发送给主机 2 了;

第二次挥手:主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段, Acknowledgment Number 为 Sequence Number 加 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1,我“同意”你的关闭请求;

第三次挥手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 LAST_ACK 状态;

第四次挥手:主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机1 进入 TIME_WAIT 状态;主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接;此时,主机1 等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了。

2、TCP 可靠传输原理实现(滑动窗口)。

确认和重传:接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。

数据合理分片与排序:TCP 会对数据进行分片,接收方会缓存为按序到达的数据,重新排序后再提交给应用层。

流量控制:当接收方来不及接收发送的数据时,则会提示发送方降低发送的速度,防止包丢失。

拥塞控制:当网络发生拥塞时,减少数据的发送。

http://blog.chinaunix.net/uid-26275986-id-4109679.html

3、Tcp 和 Udp 的区别?

1、基于连接与无连接;

2、对系统资源的要求(TCP 较多,UDP 少);

3、UDP 程序结构较简单;

4、流模式与数据报模式 ;

5、TCP 保证数据正确性,UDP 可能丢包;

6、TCP 保证数据顺序,UDP 不保证。

4、如何设计在 UDP 上层保证 UDP 的可靠性传输?

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照 tcp 可靠性传输的方式。如不考虑拥塞处理,可靠 UDP 的简单设计如下:

 1、添加 seq/ack 机制,确保数据发送到对端

 2、添加发送和接收缓冲区,主要是用户超时重传。

 3、添加超时重传机制。

具体过程:送端发送数据时,生成一个随机 seq=x,然后每一片按照数据大小分配 seq。数据到达接收端后接收端放入缓存,并发送一个 ack=x 的包,表示对方已经收到了数据。发送端收到了 ack 包后,删除缓冲区对应的据。时间到后,定时任务检查是否需要重传数据。

目前有如下开源程序利用 udp 实现了可靠的数据传输。分别为 RUDP、RTP、UDT

三、其它重要网络概念

1、socket 断线重连怎么实现,心跳机制又是怎样实现?

socket 断线重连实现

正常连接断开客户端会给服务端发送一个 fin 包,服务端收到 fin 包后才会知道连接断开。而断网断电时客户端无法发送 fin 包给服务端,所以服务端没办法检测到客户端已经断线。 为了缓解这个问题,服务端需要有个心跳逻辑,就是服务端检测到某个客户端多久没发送任何数据过来就认为客户端已经断开, 这需要客户端定时向服务端发送心跳数据维持连接。

心跳机制实现

长连接的实现:心跳机制,应用层协议大多都有 HeartBeat 机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线。并传输一些可能必要的数据。使用心跳包的典型协议是 IM,比如QQ/MSN/飞信等协议

实现方式:

(1)在 TCP 的机制里面,本身是存在有心跳包的机制的,也就是 TCP 的选项:SO_KEEPALIVE。 系统默认是设置的 2 小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。 而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。通过使用 TCP 的 KeepAlive 机制(修改那个 time 参数),可以让连接每隔一小段时间就产生一些 ack 包,以降低被踢掉的风险,当然,这样的代价是额外的网络和 CPU 负担。

(2)应用层实现心跳机制。

  1. Client使用定时器,不断发送心跳;
  2. Server收到心跳后,回复一个包;
  3. Server为每个Client启动超时定时器,如果在指定时间内没有收到Client的心跳包,则Client失效。

补充:套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端- -套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

2、Cookie 与 Session 的作用和原理。

 Session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。

 Cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session 的一种方式。

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cookie。
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。

四、常见网络流程机制

**1、**浏览器输入地址到返回结果发生了什么

1、DNS 解析,此外还有 DNSy 优化(DNS 缓存、DNS 负载均衡)

2、TCP 连接

3、发送 HTTP 请求

4、服务器处理请求并返回 HTTP 报文

5、浏览器解析渲染页面

6、连接结束

2、如何尽快的加载资源(网络优化)?

能不从网络中加载的资源就不从网络中加载,当我们合理使用缓存,将资源放在浏览器端,这是最快的方式。如果资源必须从网络中加载,则要考虑缩短连接时间,即 DNS优化部分;减少响应内容大小,即对内容进行压缩。另一方面,如果加载的资源数比较少的话,也可以快速的响应用户。

什么

1、DNS 解析,此外还有 DNSy 优化(DNS 缓存、DNS 负载均衡)

2、TCP 连接

3、发送 HTTP 请求

4、服务器处理请求并返回 HTTP 报文

5、浏览器解析渲染页面

6、连接结束

2、如何尽快的加载资源(网络优化)?

能不从网络中加载的资源就不从网络中加载,当我们合理使用缓存,将资源放在浏览器端,这是最快的方式。如果资源必须从网络中加载,则要考虑缩短连接时间,即 DNS优化部分;减少响应内容大小,即对内容进行压缩。另一方面,如果加载的资源数比较少的话,也可以快速的响应用户。

你可能感兴趣的:(面试,网络,网络协议)