草庐IT

面试必备(背)--计算机网络八股文系列

Java烟雨 2023-05-20 原文

1. OSI 七层、TCP/IP 四层的关系和区别?

七层模型,亦称OSI(Open System Interconnection),它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。

OSI 七层从上往下依次是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

图片来源于网络

TCP/IP 四层从上往下依次是:应用层、传输层、网络层(互联网层)、链路层(数据链路层/网络接口层)。与 OSI 七层的映射关系如下:

 

OSI七层和TCP/IP的区别:

  • TCP/IP 是一个协议簇;而 OSI 则是一个模型。

  • TCP/IP 是由一些交互性的模块做成的分层次的协议,其中每个模块提供特定的功能;OSI 则指定了哪个功能是属于哪一层的。

  • TCP/IP 四层是 OSI 七层的简化版。

附一张经典图:

图片来源于网络

2. TCP 与 UDP 的区别?

 

小结 TCP 与 UDP 的区别:

  • TCP 基于连接 UDP 无连接;

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

  • TCP 流模式,UDP 数据报模式;

  • TCP 保证数据正确性且保证数据顺序;

  • UDP 可能丢包且不保证数据顺序;

3. TCP 是如何实现数据的可靠性?

一句话:通过校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制等机制来保证可靠性。

(1)校验和

在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和。

发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较。

(2)序列号

TCP 传输时将每个字节的数据都进行了编号,这就是序列号。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据。

(3)ACK 确认应答

当消息接收方接收到消息,返回一个对应的 ACK,发送方就知道这个消息已经处理完成,这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传。

(4)超时重传

消息超时也就是说没有在等待时间内收到对方的 ACK 消息。这个时候,为了保证消息对方能够正确收到,我们需要将这个消息进行重新传输,如果尝试成功,则继续发送接下来的包。若尝试几次均失败,那么 TCP 会强行断开连接,发送 RST 信息。并告知应用程序连接错误。

(5)连接可靠

三次握手、四次挥手的过程。

(6)流量控制

如果发送方的发送速度太快,会导致接收方的接收缓冲区填充满了,这时候继续传输数据,就会造成大量丢包,进而引起丢包重传等等一系列问题。TCP 支持根据接收端的处理能力来决定发送端的发送速度,这就是流量控制机制。

具体实现方式:接收端将自己的接收缓冲区大小放入 TCP 首部的『窗口大小』字段中,通过 ACK 通知发送端。

(7)拥塞控制

TCP 传输过程中一开始就发送大量数据,如果当时网络非常拥堵,可能会造成拥堵加剧。所以 TCP 引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路。

4. TCP 滑动窗口

TCP 会将较大数据拆分成一个个小的数据包再进行发送。发送完一个包,等待 ACK,这种模式是最简单的。但是问题也很明显,慢,吞吐量低。所以我们在等待 ACK 的同时,可以继续发送接下来的包。也就是说,滑动窗口就是在发送完一个数据包后,不需要等待 ACK 消息返回,可以发送后面的数据包,解决吞吐量问题。

发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

4.1 窗口的概念

发送方的发送缓存内的数据都可以被分为4类:

  1. 已发送,已收到ACK

  2. 已发送,未收到ACK

  3. 未发送,但允许发送

  4. 未发送,但不允许发送

其中类型2和3都属于发送窗口。

接收方的缓存数据分为3类:

  1. 已接收

  2. 未接收准备接收

  3. 未接收并未准备接收

其中类型2属于接收窗口。

 

TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口。用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的。

4.2 滑动机制

发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保发送端会对这些数据重传。

遵循快速重传、累计确认、选择确认等规则。

5. 拥塞控制

防止发送方发地太快,使得网络来不及处理,从而导致网络拥塞。

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

 

拥塞控制的方法主要有以下四种:

  1. 慢启动:不要一开始就发送大量的数据,由小到大逐渐增加拥塞窗口的大小。

  2. 拥塞避免:

  • 拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。

  • 发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 ...

  • 注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

  • 如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

 

  1. 快重传:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

快重传示意图

  1. 快恢复:快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

  • 在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。

  • 在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。

  • 在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

6. 三次握手和四次挥手

TCP报文段

 

字段解释:

  • 序号字段(就是seq):序号字段的值指的是本报文段所发送的数据的第一个字节的序号。

  • 确认号字段(就是ack):是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N, 则表明到序号N-1为止的所有数据都已正确收到。(累积确认)

  • 「确认位ACK」:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK置1。

  • 「同步位SYN」。同步SYN=1表示这是一个连接请求或连接接收报文。当SYN= 1, ACK=0 时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN= 1, ACK=1。TCP建立连接用到。

  • 「终止位FIN (Finish)」 。用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕了并要求释放传输连接。TCP断开连接用到。

  • URG(紧急) 当URG=1,表明紧急指针字段有效,该报文段有紧急数据,应尽快发送。

  • PSH(推送) 接收方接收到PSH=1的报文段,会尽快交付接收应用进程,不再等待整个缓存填满再交付。实际较少使用。

  • RST(复位) RST=1时,表明TCP连接中出现严重差错,必须是否连接,再重连。

有了上面的铺垫,再来看下面这图就容易明白了吧?

 

  1. 第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端进入syn_sent状态,等待服务端确认。

  2. 第二次握手:服务端收到数据包后由标志位SYN=1,知道客户端在请求建立连接,服务端将标志位SYN和 ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。

  3. 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输 数据了

6.1 为什么需要三次握手,最后一次如果没有行不行,会有什么问题?

不行。TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值。

如果只是两次握手,至多只有客户端的起始序列号能被确认,服务器端的序列号则得不到确认。

6.2 TCP四次挥手过程

 

  1. 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。

  2. 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

  3. 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。

  4. 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

6.3 为什么四次挥手释放连接时需要等待2MSL

MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。

6.4 为什么TCP挥手需要4次

主要原因是当服务端收到客户端的 FIN 数据包后,服务端可能还有数据没发完,不会立即close。

所以服务端会先将 ACK 发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将 FIN 包发给客户端表示现在可以断了。之后客户端需要收到 FIN 包后发送 ACK 确认断开信息给服务端。

6.5 TCP 三次握手能否携带数据?

第三次是可以携带数据的。

假如第一次握手可以携带数据的话,如果恶意攻击服务器,每次都在第一次握手中的SYN报文中放入大量数据。而且频繁重复发SYN报文,服务器会花费很多的时间和内存空间去接收这些报文。

第三次握手,此时客户端已经处于ESTABLISHED状态。对于客户端来说,他已经建立起连接了,并且已经知道服务器的接收和发送能力是正常的。所以也就可以携带数据了。

6.6 三次握手连接阶段,最后一次ACK包丢失,会发生什么?

  • 服务端:

第三次的ACK在网络中丢失,那么服务端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便客户端重新发送ACK包。如果重发指定次数之后,仍然未收到 客户端的ACK应答,那么一段时间后,服务端自动关闭这个连接。

  • 客户端:

客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端将以RST包(Reset,复位,用于异常的关闭连接)响应。此时,客户端知道第三次握手失败。

7. TCP 半连接队列和全连接队列是什么?

 

服务端收到客户端发出的 SYN 请求后,会把这个连接信息存储到半链接队列(SYN 队列)。

服务端收到第三次握⼿的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到全连接队列(accept 队列),等待进程调⽤ accept 函数时把连接取出来。

这两个队列都是有大小限制的,当超过容量后就会将链接丢弃,或者返回 RST 包。

8. 粘包/拆包是怎么发生的?怎么解决这个问题?

TCP 发送数据时会根据 TCP 缓冲区的实际情况进行包的划分,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是 TCP 粘包和拆包问题。

 

发生 TCP 粘包的原因:

  1. 发送的数据小于 TCP 缓冲区大小,TCP 将缓冲区中的数据一次发送出去可能就会发生粘包。

  2. 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

发生 TCP 拆包的原因:

  1. 待发送数据大于最大报文长度,TCP 在传输前将进行拆包。

  2. 发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。

解决方案:

  1. 发送端给每个数据包添加包首部,首部中包含数据包的长度,这样接收端在接收到数据后,通过该字段就可以知道每个数据包的实际长度了。

  2. 发送端将每个数据包设置固定长度,这样接收端每次从读取固定长度的数据把每个数据包拆分开。

  3. 可以在数据包之间设置边界,如添加特殊符号,接收端可以通过这个特殊符号来拆分包。

9. DNS协议

DNS协议是基于UDP的应用层协议,它的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。

9.1 DNS解析过程

  1. 在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有就先调用这个IP地址映射,完成域名解析。

  2. 如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有直接返回,完成域名解析。

  3. 如果 hosts 与本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP 参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

  4. 如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。

  5. 如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至13台根 DNS ,根 DNS 服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地 DNS 服务器收到IP信息后,将会联系负责 .com 域的这台服务器。这台负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找 baidu.com 域服务器,重复上面的动作,进行查询,直至找到 www.baidu.com 主机。

  6. 如果用的是转发模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。不管是本地 DNS 服务器用的是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。

10. 在浏览器中输入www.baidu.com后执行的全部过程?

域名解析 -> 建立TCP连接(三次握手)-> 发起http请求 -> 服务器响应http请求,浏览器得到html代码 -> 浏览器解析html代码,并请求html代码中的资源(如 js、css、图片等)-> 浏览器对页面进行渲染呈现给用户。

11. IP地址是怎样分类的?

先说一下 IP 的基本特点:

IP地址由四段组成,每个字段是一个字节,8位,最大值是255。IP地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机。

IP 地址主要分为A、B、C三类及特殊地址D、E这五类:

 

  • A类:(1.0.0.0-126.0.0.0)一般用于大型网络。

  • B类:(128.0.0.0-191.255.0.0)一般用于中等规模网络。

  • C类:(192.0.0.0-223.255.255.0)一般用于小型网络。

  • D类:是多播地址,地址的网络号取值于224~239之间,一般用于多路广播用户。

  • E类:是保留地址。地址的网络号取值于240~255之间。

12. 常用端口号

端口服务
21FTP(文件传输协议)
22SSH(安全外壳协议)
23Telnet(internet远程登录服务的标准协议
25SMTP简单邮件传输服务
53DNS(域名系统服务)
80HTTP(超文本传输协议)

13. HTTP协议

http协议是超文本传输协议。它是基于TCP协议的应用层传输协议,即客户端和服务端进行数据传输的一种规则。该协议本身HTTP 是一种无状态的协议。

13.1 简述http状态码和对应的信息

  • 1XX:接收的信息正在处理

  • 2XX:请求成功,请求被成功处理 200 OK

  • 3XX:重定向

  • 4XX:客户端错误

  • 5XX:服务端错误

常见错误码:

+ 200 (成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
+ 201 (已创建) 请求成功并且服务器创建了新的资源。
+ 202 (已接受) 服务器已接受请求,但尚未处理。
+ 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
+ 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
+ 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
+ 206 (部分内容) 服务器成功处理了部分 GET 请求。

+ 301 永久重定向 
+ 302 临时重定向 
+ 304 资源没修改,用之前缓存就行 

+ 400 客户端请求的报文有错误 
+ 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
+ 403 (禁止) 服务器拒绝请求。
+ 404 表示请求的资源在服务器上不存在或未找到

+ 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
+ 501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
+ 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
+ 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
+ 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
+ 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

13.2 转发和重定向的区别

转发是服务器行为。服务器直接向目标地址访问 URL,将相应内容读取之后发给浏览器,用户浏览器地址栏 URL不变,转发页面和转发到的页面可以共享 request 里面的数据。

重定向是利用服务器返回的状态码来实现的,如果服务器返回 301 或者 302,浏览器收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏 URL 会发生改变,而且不能共享数据。

13.3 http中常见的header字段有哪些?

请求头:

Accept: text/html,image/*( 浏览器可以接收的类型) 
Accept-Charset: ISO-8859-1(浏览器可以接收的编码类型) 
Accept-Encoding: gzip,compress(浏览器可以接收压缩编码类型) 
Accept-Language: en-us,zh-cn(浏览器可以接收的语言和国家类型) 
Host: www.it315.org:80(浏览器请求的主机和端口) 
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(某个页面缓存时间) 
Referer: http://www.it315.org/index. jsp(请求来自于哪个页面) 
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(浏览器相关信息) 
Cookie:(浏览器暂存服务器发送的信息) 
Connection: close(1.0)/Keep-Alive(1.1)(HTTP请求的版本的特点) 
Date: Tue, 11 Jul 2000 18:23:51 GMT(请求网站的时间) 

响应头:

Location: http://www.wekenw.com (控制浏览器显示哪个页面) 
Server:apache tomcat(服务器的类型) 
Content-Encoding: gzip(服务器发送的压缩编码方式) 
Content-Length: 80(服务器发送显示的字节码长度) 
Content-Language: zh-cn(服务器发送内容的语言和国家名) 
Content-Type: image/jpeg; charset=UTF-8(服务器发送内容的类型和编码类型) 
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务器最后一次修改的时间) 
Refresh: 1;url=http://www.it315.org(控制浏览器1秒钟后转发URL所指向的页面) 
Content-Disposition: attachment; filename=aaa.jpg(服务器控制浏览器发下载方式打开文件) 
Transfer-Encoding: chunked(服务器分块传递数据到客户端)  
Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务器发送Cookie相关的信息) 
Expires: -1(服务器控制浏览器不要缓存网页,默认是缓存) 
Cache-Control: no-cache(服务器控制浏览器不要缓存网页) 
Pragma: no-cache(服务器控制浏览器不要缓存网页)   
Connection: close/Keep-Alive(HTTP请求的版本的特点)   
Date: Tue, 11 Jul 2000 18:23:51 GMT(响应网站的时间) 

13.4 简述http1.0

规定了请求头和请求尾,响应头和响应尾(get post)

每一个请求都是一个单独的连接,做不到连接的复用

13.5 简述http1.1的改进

HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。

支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

服务端无法主动push

13.6 简述HTTP短连接与长连接区别

HTTP中的长连接短连接指HTTP底层TCP的连接。

短连接:客户端与服务器进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。

长连接:如果HTTP头部带有参数keep-alive,即开启长连接网页完成打开后,底层用于传输数据的TCP连接不会直接关闭,会根据服务器设置的保持时间保持连接,保持时间过后连接关闭。

13.7 简述http2.0的改进

提出多路复用。多路复用前,文件是串行传输的,请求a文件,b文件只能等待,并且连接数过多。引入多路复用,a文件b文件可以同时传输。

引入了二进制数据帧。其中帧对数据进行顺序标识,有了序列id,服务器就可以进行并行传输数据。

13.8 http与https的区别

http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份。https具有安全性的ssl加密传输协议,加密采用对称加密, https协议需要到ca申请证书,一般免费证书很少,需要交费。

13.9 简述TLS/SSL, HTTP, HTTPS的关系

SSL全称为Secure Sockets Layer即安全套接层,其继任为TLSTransport Layer Security传输层安全协议,均用于在传输层为数据通讯提供安全支持。

可以将HTTPS协议简单理解为HTTP协议+TLS/SSL

14. https 的连接过程

浏览器将支持的加密算法信息发给服务器

服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器

客户端(SSL/TLS)解析证书验证证书合法性,生成对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。

客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器

服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。

服务器将加密后的密文发送给客户端

客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成

15. Get与Post区别

  • Get:指定资源请求数据,刷新无害,Get请求的数据会附加到URL中,传输数据的大小受到url的限制。

  • Post:向指定资源提交要被处理的数据。刷新会使数据会被重复提交。post在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。

  • GET:请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。

  • POST:的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而 POST 请求参数则被包装到请求体中,相对更安全。

16. cookie和session区别?

  • 实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;

  • 大小限制:Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;

  • 安全性:Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;

  • 服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

  • 存放位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。

17. 计算机网络常用性能指标有:

  1. 速率:连接在计算机网络上的主机在数字信道上传送数据的速率。

  2. 带宽:网络通信线路传送数据的能力。

  3. 吞吐量:单位时间内通过网络的数据量。

  4. 时延:数据从网络一端传到另一端所需的时间。

  5. 时延带宽积:传播时延带宽。

  6. 往返时间RTT:数据开始到结束所用时间。

  7. 利用率信道:数据通过信道时间。

18 网络安全

什么是 XSS 攻击?

XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。

XSS的原理是:

恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。

XSS攻击最主要有如下分类:反射型、存储型、及 DOM-based型。反射性和DOM-baseed型可以归类为非持久性XSS攻击。存储型可以归类为持久性XSS攻击。

什么是 CSRF?

CSRF(Cross Site Request Forgery,跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为『One Click Attack』或者 『Session Riding』,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。

XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

对称加密与非对称加密

  1. 对称密钥加密,又称私钥加密,即信息的发送方和接收方用同一个密钥去加密和解密数据。

  • 最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难且较为不安全。

  • 进行一对一的双向保密通信。

  • 常见的对称加密算法:DES,AES等。

 

  1. 非对称密钥加密,又称公钥加密,它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。

  • 从功能角度而言非对称加密比对称加密功能强大且较为安全,但加密和解密速度却比对称密钥加密慢得多。

  • 多对一的单向保密通信。

  • 最常用的非对称加密算法:RSA

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

数字签名

数字签名必须保证实现以下三点功能:

  • 报文鉴别。即接受者能够核实发送者对报文的签名。

  • 报文的完整性。即接受者确信所收到的数据和发送者发送的完全一样而没有被篡改过。

  • 不可否认。即发送者事后不能抵赖对报文的签名。

 

该图只是进行了数字签名并没有对报文进行加密。

数字签名过程:A用私钥SKA对明文X进行D运算签名成为密文DSKA,B用A的公钥PKA对密文DSKA进行E运算还原出明文X。

那么这个过程是如何满足报文鉴别、报文的完整性、不可否认三个特点的呢?

  • 只有A拥有私钥SKA,只有他能生成密文DSKA,所以只要B用A的公钥能成功还原出可读的明文X就说明密文DSKA一定是A发来的。这里体现出报文的鉴别的特点。

  • 同理如果中途密文DSKA被篡改,那么篡改者没有A的私钥SKA来对篡改过后的报文进行加密,那么B对被篡改过的报文进行解密时就会得到不可读的明文,就知道收到的报文被修改过了。这里体现了报文的完整性的特点。

  • 若A抵赖曾发过该报文给B,B可把X和密文DSKA出示给进行公证的第三者,第三者很容易用PKA去证实A确实发送了X给B。这里体现了不可否认的特点。

 


如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多知识与技巧,关注与私信博主(03)

 

 

有关面试必备(背)--计算机网络八股文系列的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  6. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

随机推荐