计算机网络:常见的计网面试题整理(一)


前言

这篇文章针对常见的计网面试题进行整理

一、题目&&解答

TCP和UDP的区别?

TCP
  • 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
  • TCP 不提供广播或多播服务
  • 由于 TCP 要提供可靠的,面向连接的传输服务,这难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
  • TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
  • TCP以字节流的形式进行传输,不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。
  • TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)
UDP
  • 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。
  • 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。

👨‍💻面试官追问:既然你说TCP提供的可靠的服务,那么TCP 协议如何保证可靠传输?
主要有校验和、序列号、超时重传、流量控制及拥塞避免等几种方法:
1.应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
2.校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
3.TCP 的接收端会丢弃重复的数据。
4.流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 利用滑动窗口实现流量控制。
5.拥塞控制: 当网络拥塞时,减少数据的发送。
6.ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
7.超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

在这里插入图片描述

总结

  • TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
  • 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
  • 对数据准确性要求高,速度可以相对较慢的,可以选用TCP

介绍一下TCP的三次握手

在这里插入图片描述

TCP的三次握手分为以下简单的三步:

  • 首先客户端发送带有 SYN 标志的数据包到服务端
  • 然后服务端发送带有 SYN/ACK 标志的数据包到客户端
  • 最后客户端发送带有带有 ACK 标志的数据包到服务端

👨‍💻面试官打断问:为什么要三次握手?一次,两次不行吗?

三次握手的目的是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的,可以从以下两个方面考虑(我们这里假设客户端是首先发起连接请求):

1.假设建立TCP连接仅需要两次握手,那么如果第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且可能向服务端已经开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。如果是三次握手,不会出现双方连接还未完全建立成功就开始发送数据的情况。
2.如果服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。

所以三次握手就能确认双发收发功能都正常,缺一不可

面试官又问:第 2 次握手传回了 ACK,为什么还要传回 SYN?
接收端传回发送端所发送的 ACK 是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN也就是同步序列编号则是为了建立并确认从服务端到客户端的通信

四次挥手如下
在这里插入图片描述
断开一个TCP连接需要如下的四个过程:

  • 第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含标志位FIN=1,序列号seq=u。此时客户端只能接收数据,不能向服务端发送数据。
  • 第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含标志位ACK=1,序列号seq=v,确认号ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。
  • 第三次挥手:服务端发送完数据后向客户端发出连接释放报文,报文包含标志位FIN=1,标志位ACK=1,序列号seq=w,确认号ack=u+1。
  • 第四次挥手:客户端收到服务端发送的释放连接请求,向服务端发送确认报文,包含标志位ACK=1,序列号seq=u+1,确认号ack=w+1。

面试官问:为什么TCP连接的时候是3次,关闭的时候却是4次?

因为TCP连接是针对服务端和客户端尚未建立起数据传输机制的情况下,而TCP关闭时服务端与客户端可能正有数据进行传输
关闭连接时,客户端向服务端发送FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。 服务器收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN
报文给客户端来表示同意现在关闭连接。 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN一般都会分开发送,从而比三次握手导致多了一次。

面试官接着问:为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

MSL的意思是报文的最长寿命。要确保服务器是否已经收到了我们的ACK报文,过了一个MSL后如果没有收到的话,服务器会重新发FIN报文给客端,此时又花了一个MSL,客户端再次收到FIN报文之后,就知道之前的ACK报文丢失了,然后再次发送ACK报文,一来一去正好2个MSL。

TCP中拥塞控制和流量控制有什么区别?

流量控制是TCP 提供的可以让「发送方」根据「接收方」的实际接收能力控制发送数据量的⼀种机制。因为如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费

拥塞控制流量控制不同,拥塞控制是一个全局性的过程,而流量控制指点对点通信量的控制。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。而拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致于过载。

👨‍💻面试官追问:流量控制具体怎么控制的?
TCP利用滑动窗口机制实现流量控制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd,发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。

👨‍💻面试官又问:拥塞控制具体的算法怎么样的?

TCP 的拥塞控制采用了四种算法,即慢开始 、 拥塞避免 、快重传、快恢复:

慢开始 : 慢开始算法的思路是当主机开始发送数据时由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为1,每经过一个传播轮次,cwnd 加倍。因为如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞。

拥塞避免 : 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1。

快重传与快恢复: 在 TCP/IP 中,快速传和块恢复(fast retransmit andrecovery,FRR)是一种拥塞控制算法,它能**快速恢复丢失的数据包。**没有 FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。

有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

具体的可以看这篇
TCP和UDP

说⼀说GET与POST有哪些区别?

四个方面

  • 作用:GET方法的含义是请求从服务器获取资源。而POST方法则是相反操作,它向URI指定的资源提交数据,数据就放在报文的 body里。
  • 参数位置:GET的参数放在URL中,POST的参数存储在实体主体中,并且GET方法提交的请求的URL中的数据最多是2048字节,POST请求没有大小限制
  • 安全性:在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。GET方法是安全的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的。POST因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的
  • 幂等性:所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。结合刚才说的,GET方法是具有幂等性的。而POST方法不具有幂等性

说一下在浏览器中输入URL到显示的过程

总体来说分为以下几个过程:

  • DNS 解析:浏览器查询 DNS,获取域名对应的 IP 地址
  • TCP 连接:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手
  • 发送 HTTP 请求:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求
  • 服务器处理请求并返回 HTTP 报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处 理,并将处理结果及相应的视图返回给浏览器
  • 浏览器解析渲染页面
  • 连接结束

👨‍💻面试官追问:整个过程会使用哪些协议?

首先浏览器查找域名的IP地址的过程会使用DNS协议 与服务器建立TCP连接使用到了TCP协议
建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议 IP数据包在路由器之间,路由选择使用OPSF协议
路由器在与服务器通信时,需要将ip地址转换为MAC地址,需要使用ARP协议 在TCP建立完成后,使用HTTP协议访问网页

HTTP 1.0 、HTTP 1.1、HTTP 2.0 的主要区别是什么?

HTTP 1.0
  • 请求与响应支持 HTTP 头,响应含状态行,增加了状态码,
  • 支持 HEAD,POST 方法
  • 支持传输 HTML 文件以外其他类型的内容

HTTP1.0 使用的是非持久连接,主要缺点是客户端必须为每一个待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍RTT 的开销。因为同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,而且这种短连接增加了网络传输的负担

HTTP 1.1
  • 长连接支持长连接
  • 缓存处理在HTTP1.0的基础上引入了更多的缓存控制策略。在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  • 带宽优化 :在HTTP 1.0中会存在浪费带宽的现象,主要是因为不支持断点续传功能,客户端只是需要某个对象的一部分,服务端却将整个对象都传了过来。在HTTP1.1中请求头引入了range头域,它支持只请求资源的某个部分,返回的状态码为206。
  • 错误状态:在错误通知管理中新增了错误状态响应码。
  • 主机名:增加了Host头处理,可以传递主机名(hostname)。
HTTP 2.0

HTTP2.0是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。HTTP2.0大幅度的提高了web性能,在HTTP1.1完全语义兼容的基础上,进一步减少了网络的延迟。实现低延迟高吞吐量。对于前端开发者而言,减少了优化工作。主要体现在以下几点特性:

  • 头部压缩
  • 多路复用
  • 二进制分帧
  • 请求优先级
  • 服务器推送
SPDY协议

什么是SPDY协议?
SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。

头部压缩

在 HTTP/1.1 及之前的时代,请求体一般会有响应的压缩编码过程,通过Content-Encoding头部字段来指定,但你有没有想过头部字段本身的压缩呢?当请求字段非常复杂的时候,尤其对于 GET 请求,请求报文几乎全是请求头,这个时候还是存在非常大的优化空间的。HTTP/2 针对头部字段,也采用了对应的压缩算法——HPACK,对请求头进行压缩。
HPACK 算法是专门为 HTTP/2 服务的,它主要的亮点有两个:

  • 首先是在服务器和客户端之间建立哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0,1,2,…)传给对方即可,对方拿到索引查表就行了。这种传索引的方式,可以说让请求头字段得到极大程度的精简和复用。
    在这里插入图片描述

HTTP/2 当中废除了起始行的概念,将起始行中的请求方法、URI、状态码转换成了头字段,不过这些字段都有一个":"前缀,用来和其它请求头区分开。

  • 其次是对于整数和字符串进行哈夫曼编码,哈夫曼编码的原理就是先将所有出现的字符建立一张索引表,然后让出现次数多的字符对应的索引尽可能短,传输的时候也是传输这样的索引序列,可以达到非常高的压缩率。
多路复用

之前说到HTTP 队头阻塞问题可以用用并发连接域名分片的方式来解决这个问题,但这并没有真正从 HTTP 本身的层面解决问题,只是增加了 TCP 连接,分摊风险而已。而且这么做也有弊端,多条 TCP 连接会竞争有限的带宽,让真正优先级高的请求不能优先处理。

在HTTP1.x中,我们经常会使用到雪碧图、使用多个域名等方式来进行优化,都是因为浏览器限制了同一个域名下的请求数量,当页面需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求时,资源需要等待其他资源请求完成后才能继续发送。

HTTP2.0中,基于二进制分帧层,HTTP2.0可以在共享TCP连接的基础上同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发出去,在另一端根据流标识符和首部将他们重新组装起来。 通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。

二进制分帧

首先,HTTP/2 认为明文传输对机器而言太麻烦了,不方便计算机的解析,因为对于文本而言会有多义性的字符,比如回车换行到底是内容还是分隔符,在内部需要用到状态机去识别,效率比较低。于是 HTTP/2 干脆把报文全部换成二进制格式,全部传输01串,方便了机器的解析。

原来Headers + Body的报文格式如今被拆分成了一个个二进制的帧,用Headers帧存放头部字段,Data帧存放请求体数据。分帧之后,服务器看到的不再是一个个完整的 HTTP 请求报文,而是一堆乱序的二进制帧。这些二进制帧不存在先后关系,因此也就不会排队等待,也就没有了 HTTP 的队头阻塞问题。
通信双方都可以给对方发送二进制帧,这种二进制帧的双向传输的序列,也叫做流(Stream)。HTTP/2 用流来在一个 TCP 连接上来进行多个数据帧的通信,这就是多路复用的概念。

可能你会有一个疑问,既然是乱序首发,那最后如何来处理这些乱序的数据帧呢?

首先要声明的是,所谓的乱序,指的是不同 ID 的 Stream 是乱序的,但同一个 Stream ID 的帧一定是按顺序传输的。二进制帧到达后对方会将 Stream ID 相同的二进制帧组装成完整的请求报文和响应报文。当然,在二进制帧当中还有其他的一些字段,实现了优先级和流量控制等功能。

服务器推送

另外值得一说的是 HTTP/2 的服务器推送(Server Push)。在 HTTP/2 当中,服务器已经不再是完全被动地接收请求,响应请求,它也能新建 stream 来给客户端发送消息,当 TCP 连接建立之后,比如浏览器请求一个 HTML 文件,服务器就可以在返回 HTML 的基础上,将 HTML 中引用到的其他资源文件一起返回给客户端,减少客户端的等待

请求优先级

把HTTP消息分为很多独立帧之后,就可以通过优化这些帧的交错和传输顺序进一步优化性能。

谈下你对 HTTP 长连接和短连接的理解?

HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。

而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码:

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

说一下HTTP 和 HTTPS 的区别?

有下面几个区别:

  • 开销:HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
  • 资源消耗:HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议,需要消耗更多的CPU和内存资源
  • 端口不同:HTTP和 HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • 安全性:HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。而HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输

HTTP的优缺点

1.简单:HTTP基本的报文格式就是header + body ,头部信息也是key-value 简单文本的形式,易于理解,降低了学习和使用的门槛。
2.灵活和易于扩展
HTTP协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。
同时HTTP由于是工作在应用层,则它下层可以随意变化。
HTTPS也就是在HTTP与TCP层之间增加了SSL/TLS安全传输层,HTTP/3甚至把TCP层换成了基于UDP的QUIC。
3.应用广泛和跨平台:互联网发展至今,HTTP的应用范围非常的广泛,从台式机的浏览器到手机上的各种APP。

👨‍💻面试官问:答得不错,在说说缺点?

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

说说URI 和 URL 的区别是什么?

  • URI(Uniform Resource Identifier)是统一资源标志符,可以唯一标识一个资源。
  • URL(Uniform Resource Locator)是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

总结

参考博客
【面试题】计算机网络篇-10道常见面试题总结
HTTP 1.0 1.1 2.0

  • 11
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值