作者:邴越
原文链接:计算机网络高频面试题解析(含书籍推荐)
网络原理是工程师的必须了解的计算机基础知识,先推荐下两本好书,《图解HTTP》和《图解TCP/IP》。
《图解TCP/IP》讲解网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容,《图解HTTP》对HTTP协议进行了全面系统的介绍,这两本书的特点都是在讲解的同时,配上了大量漫画通信图例,读起来比较轻松。
高频面试题解析
1、OSI七层网络模型的结构与功能
OSI是一个开放性的通信系统互连参考模型,OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
OSI是一个定义得非常好的协议规范,但是比较复杂所以一般使用TCP/IP 的四层模型来描述。
就目前来说,TCP/IP 的四层模型更受广泛认可,在计算机网络中,大家更多喜欢使用 TCP/IP 模型来进行划分和理解。因为表示层、会话层以及应用层之间的界限在实际应用中并不清晰,让人不好区分。
2、TCP/IP四层协议有哪些结构与功能
TCP/IP 参考模型是一个包含了不同网络层次的一系列网络协议的集合。一般 TCP/IP 参考考模型分为四层,从下到上分别是,数据链路层、网络层、传输层和应用层。
也有将它分为五层的,也就是加上物理层,不过对于大部分的计算机网络应用,软件工程师一般都是不关心物理层。
应用层提供了不同应用数据包的处理协议。常见的有 HTTP、FTP、DNS、Email、Telnet 等。
传输层为应用程序提供了端到端的通信服务,该层的协议有两个:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据包协议)。其中 TCP 提供的是有连接可靠服务,UDP 提供的是无连接不可靠服务。
网络层也称互联网层,核心协议是 IP 协议,是路由算法工作的主要层。
数据链路层包括了逻辑链路控制层(Logical Link Control,LLC)和介质访问控制层(Media Access Control,MAC)两个子层。LLC 负责识别网络层协议,然后对它们进行封装。LLC 报头告诉数据链路层一旦帧被接收到时,应当对数据包做何处理。数据链路层还包括了设备驱动程序部分的内容。
3、五层协议的体系结构,都有哪些协议
上面说了四层协议,我们在四层协议的基础上再来详细的说明下五层协议。
(1)应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。
(2)运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
传输控制协议 TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。
用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
(3)网络层
网络层(network layer)负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。
这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机。
这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
(4)数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。
控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
(5)物理层
在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
4、TCP和UPD的主要特点对比
UDP 的主要特点
UDP 是无连接的;
UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
UDP 是面向报文的;
UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
UDP 支持一对一、一对多、多对一和多对多的交互通信;
UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点
TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
5、TCP 三次握手和四次挥手
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
我们看一下《图解HTTP》的漫画图解:
具体操作的示意图:
客户端–发送带有 SYN 标志的数据包–一次握手–服务端
服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端
6、为什么要三次握手?
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
7、三次握手为什么要传回 SYN,为什么要ACK
SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement 确认字符 )消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。
8、为什么要四次挥手
断开一个 TCP 连接需要四次挥手:
- 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
- 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
- 服务器-关闭与客户端的连接,发送一个FIN给客户端
- 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
9、TCP、UDP 协议的区别
UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
10、TCP 协议如何保证可靠传输
1)确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。
2)数据校验:TCP报文头有校验和,用于校验报文是否损坏
3)数据合理分片和排序:
tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。
而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。
4)流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。
5)拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。
11、TCP 利用滑动窗口实现流量控制的机制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
TCP 利用滑动窗口实现流量控制。
滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
12、TCP拥塞控制的机制以及算法
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。
拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。
拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1.
快重传与快恢复:
在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
13、在浏览器中输入url地址后显示主页的过程
一次完整的http请求过程,总体来说分为以下几个过程:
1.DNS域名解析
2.建立TCP连接
3.发送HTTP请求
4.服务器处理请求
5.返回HTTP报文
6.关闭TCP连接
7.浏览器解析HTML
8.浏览器布局渲
14、常见的Http状态码
http状态返回代码:1xx(临时响应)、2xx (成功)、3xx (重定向)、4xx(请求错误)、5xx(服务器错误)
2XX 成功
200 OK,表示从客户端发来的请求在服务器端被正确处理
201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
202 Accepted 请求已接受,但是还没执行,不保证完成请求
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content,进行范围请求
3XX 重定向
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
307 temporary redirect,临时重定向,和302含义相同
4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源
408 Request timeout, 客户端请求超时
409 Confict, 请求的资源可能引起冲突
5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
501 Not Implemented 请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
505 http version not supported 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本
15、HTTP有哪些方法?
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
GET: 通常用于请求服务器发送某些资源
HEAD: 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源
OPTIONS: 用于获取目的资源所支持的通信选项
POST: 发送数据给服务器
PUT: 用于新增资源或者使用请求中的有效负载替换目标资源的表现形式
DELETE: 用于删除指定的资源
PATCH: 用于对资源进行部分修改
CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
TRACE: 回显服务器收到的请求,主要用于测试或诊断
16、HTTP长连接、短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
17、HTTPS是如何保证安全的?
HTTP协议是一个应用层协议,通常运行在TCP协议之上。它是一个明文协议,客户端发起请求,服务端给出响应的响应。
由于网络并不是可信任的,HTTP协议的明文特性会存在以下风险:
- 通信数据有被窃听和被篡改的风险
- 目标网站有被冒充的风险
HTTPS其实就是secure http的意思,也就是HTTP的安全升级版。HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装。
HTTPS相对于HTTP有哪些不同呢?其实就是在HTTP跟TCP中间加多了一层加密层TLS/SSL。
HTTPS使用非对称加密,加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的。
18、HTTPS的中间人攻击是什么?
HTTPS从协议上解决了HTTP时代的中间人攻击问题,但是HTTPS在用户主动信任了伪造证书的时候也会发生中间人攻击(比如早期的12306需要手动信任证书),HTTPS中间人攻击流程如下:
客户端用HTTPS连接服务器的443端口
服务器下发自己的数字证书给客户端
黑客劫持了服务器的真实证书,并伪造了一个假的证书给浏览器
浏览器可以发现得到的网站证书是假的,但是浏览器选择信任
浏览器生成随机对称密钥A,用伪造的证书中的公钥加密发往服务器
黑客同样可以劫持这个请求,得到浏览器的对称密钥A,从而能够窃听或者篡改通信数据
黑客利用服务器的真实公钥将客户端的对称密钥A加密发往服务器
服务器利用私钥解密这个对称密钥A之后与黑客通信
黑客利用对称密钥A解密服务器的数据,篡改之后利用对称密钥A加密发给客户端
客户端收到的数据已经是不安全的了
以上就是HTTPS中间人攻击的原理,这也就是HTTPS抓包为什么要信任证书的原因。
19、如何理解HTTP协议是无状态的?
http协议时无状态的,指的是协议对事物没有记忆能力,服务器不知道客户端是什么状态,http是同一个无状态面向连接的协议。
20、ping命令基于哪一层协议的原理是什么?
ping命令基于网络层的命令,是基于ICMP协议工作的。