计算机网络常见面试题总结 :整合了javaguide、面试小抄、湖科大教书匠、办校
一、计算机网络基础
1.OSI 和 TCP/IP 网络分层模型
相关面试题 :
- OSI 七层模型是什么?每一层的作用是什么?
- TCP/IP 四层模型是什么?每一层的作用是什么?
- 为什么网络要分层?
1.1应用层(Application layer)
应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。
应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等 DNS、RTSP。
1.2传输层(Transport layer)
传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。 应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。
运输层主要使用以下两种协议:
- 传输控制协议 TCP(Transmisson Control Protocol)--提供 面向连接 的,可靠的 数据传输服务。常用于FTP文件传输,HTTP。
- 用户数据协议 UDP(User Datagram Protocol)--提供 无连接 的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。常用于视频、音频等多媒体通信。
why 分层?
我们平时使用框架开发一个后台程序来说,我们往往会按照每一层做不同的事情的原则将系统分为三层:
- Repository(数据库操作)
- Service(业务操作)
- Controller(前后端数据交互)
复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。
好了,再来说回:“为什么网络要分层?”。我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
- 提高了整体灵活性、可扩展性 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
- 大问题化小 :分层可以将复杂的网络问题(信号衰减、数据丢包、数据完整性校验.....)分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
2.应用层常见协议
二、TCP与UDP
三、HTTP
1.从输入URL 到页面展示到底发生了什么?(非常重要)
2.HTTP 状态码有哪些?
橙色需要掌握 其他了解
HTTP 状态码用于描述 HTTP 请求的结果,比如2xx 就代表请求被成功处理。
# 1xx Informational(信息性状态码)
1xx 你平时你大概率不会碰到,所以这里直接跳过。 接收的请求正在处理
# 2xx Success(成功状态码)
- 200 OK :请求被成功处理。比如我们发送一个查询用户数据的HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
- 201 Created :请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
- 202 Accepted :服务端已经接收到了请求,但是还未处理。
- 204 No Content : 服务端已经成功处理了请求,但是没有返回任何内容。
3xx Redirection(重定向状态码) 具体看面试小炒
- 301 Moved Permanently : 资源被永久重定向了。比如你的网站的网址更换了。
- 302 Found :资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
# 4xx Client Error(客户端错误状态码)
- 400 Bad Request : 发送的HTTP请求存在问题。比如请求参数不合法、请求方法错误。
- 401 Unauthorized : 未认证却请求需要认证之后才能访问的资源。
- 403 Forbidden :直接拒绝HTTP请求,不处理。一般用来针对非法请求。
- 404 Not Found : 你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
- 409 Conflict : 表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。
5xx Server Error(服务端错误状态码)
- 500 Internal Server Error : 服务端出问题了(通常是服务端出Bug了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
- 502 Bad Gateway :我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。
3.#HTTP 和 HTTPS 有什么区别?(重要)
直观理解
http和tcp 没有变 加了SSL/TSL层 (这张图来自图灵)
HTTP vs HTTPS(应用层) | JavaGuide(Java面试+学习指南) 了解下对称加密 非对称加密 (原理暂时先不看)
对称加密:通信双方共享唯一密钥 k,加解密算法已知,加密方利用密钥 k 加密,解密方利用密钥 k 解密,保密性依赖于密钥 k 的保密性
非对称加密: 公钥可以公开给任何人,私钥严格保密 不参与网络传输
- 端口号 :HTTP 默认是 80,HTTPS 默认是 443。
- URL 前缀 :HTTP 的 URL 前缀是
http://
,HTTPS 的 URL 前缀是https://
。 - 安全性和资源消耗 : HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高(可以确保数据在传输的过程中不被窃取、篡改 确保数据的完整性),但是 HTTPS 比 HTTP 耗费更多服务器资源。
4.HTTP 1.0 和 HTTP 1.1 有什么区别?
- 连接方式 : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。
HTTP/1.0 默认使用短连接 ,也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个TCP连接,这样就会导致有大量的“握手报文”和“挥手报文”占用了带宽。
带宽指单位时间能通过链路的数据量。通常以bps来表示,比特率即每秒可传输之位数
为了解决 HTTP/1.0 存在的资源浪费的问题, HTTP/1.1 优化为默认长连接模式 。 采用长连接模式的请求头(Connection:keep-alive)报文会通知服务端:“我向你请求连接,并且连接成功建立后,请不要关闭”。因此,该TCP连接将持续打开,为后续的客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
如果 TCP 连接一直保持的话也是对资源的浪费,因此,一些服务器软件(如 Apache)还会支持超时时间的时间。在超时时间之内没有新的请求达到,TCP 连接才会被关闭。
(有必要说明的是,HTTP/1.0仍提供了长连接选项,即在请求头中加入Connection: Keep-alive
。同样的,在HTTP/1.1中,如果不希望使用长连接选项,也可以在请求头中加入Connection: close
,这样会通知服务器端:“我不需要长连接,连接成功后即可关闭”。)
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
实现长连接需要客户端和服务端都支持长连接。
5.HTTP 是不保存状态的协议, 如何保存用户状态?/Session和Cookie
6.URI 和 URL 的区别是什么?
四、ARP (是网络层协议)
1、什么是 Mac 地址?
MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
可以理解为,MAC 地址是一个网络设备真正的身份证号,IP 地址只是一种不重复的定位方式(比如说住在某省某市某街道的张三,这种逻辑定位是 IP 地址,他的身份证号才是他的 MAC 地址),也可以理解为 MAC 地址是身份证号,IP 地址是邮政地址。MAC 地址也有一些别称,如 LAN 地址、物理地址、以太网地址等。
还有一点要知道的是,不仅仅是网络资源才有 IP 地址,网络设备也有 IP 地址,比如路由器。但从结构上说,路由器等网络设备的作用是组成一个网络,而且通常是内网,所以它们使用的 IP 地址通常是内网 IP,内网的设备在与内网以外的设备进行通信时,需要用到 NAT 协议。
MAC 地址的长度为 6 字节(48 比特),地址空间大小有 280 万亿之多($2^{48}$),MAC 地址由 IEEE 统一管理与分配,理论上,一个网络设备中的网卡上的 MAC 地址是永久的。不同的网卡生产商从 IEEE 那里购买自己的 MAC 地址空间(MAC 的前 24 比特),也就是前 24 比特由 IEEE 统一管理,保证不会重复。而后 24 比特,由各家生产商自己管理,同样保证生产的两块网卡的 MAC 地址不会重复。
MAC 地址具有可携带性、永久性,身份证号永久地标识一个人的身份,不论他到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
最后,记住,MAC 地址有一个特殊地址:FF-FF-FF-FF-FF-FF(全 1 地址),该地址表示广播地址。
2.ARP 协议解决了什么问题?/有了IP地址 为什么还要MAC地址
(这张图来自b站 30分钟学会计网)
由192.168.1.52能不能直接找到192.168.1.254?
在网络层引入路由器是为了解决跨网络的数据的转发,IP是一个逻辑地址,不能直接用来通信,而MAC地址是真实的物理地址,可以用来直接通信 。需要ARP协议将Ip转为MAC地址,在MAC层(数据链路层)进行传输
ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层Ip地址和链路层MAC地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
3. ARP 协议的工作原理?(听了湖科大的课 文字是javaguide)总的来说:ARP 协议是一个广播问询,单播响应协议
在一个局域网内,每个网络设备(每台主机)都自己维护了一个 ARP 表,ARP 表记录了某些其他网络设备(其他主机)的 IP 地址-MAC 地址映射关系
假设当前有如下场景:IP 地址为137.196.7.23
的主机 A,想要给同一局域网内的 IP 地址为137.196.7.14
主机 B,发送 IP 数据报文。
A <——> B
再次强调,当主机发送 IP 数据报文时(网络层),仅知道目的地的 IP 地址,并不清楚目的地的 MAC 地址,而 ARP 协议就是解决这一问题的。
为了达成这一目标,主机 A 将不得不通过 ARP 协议来获取主机 B 的 MAC 地址,并将 IP 报文封装成链路层帧,发送到下一跳上。在该局域网内,关于此将按照时间顺序,依次发生如下事件:
-
主机 A 检索自己的 ARP 表,发现 ARP 表中并无主机 B 的 IP 地址对应的映射条目,也就无从知道主机 B 的 MAC 地址。
-
主机 A 将构造一个 ARP 查询分组,并将其广播到所在的局域网中。
ARP 分组是一种特殊报文,ARP 分组有两类,一种是查询分组,另一种是响应分组,它们具有相同的格式,均包含了发送和接收的 IP 地址、发送和接收的 MAC 地址。当然了,查询分组中,发送的 IP 地址,即为主机 A 的 IP 地址,接收的 IP 地址即为主机 B 的 IP 地址,发送的 MAC 地址也是主机 A 的 MAC 地址,但接收的 MAC 地址绝不会是主机 B 的 MAC 地址(因为这正是我们要问询的!),而是一个特殊值——
FF-FF-FF-FF-FF-FF
,之前说过,该 MAC 地址是广播地址,也就是说,查询分组将广播给该局域网内的所有设备。 -
主机 A 构造的查询分组将在该局域网内广播,理论上,每一个设备都会收到该分组,并检查查询分组的接收 IP 地址是否为自己的 IP 地址,如果是,说明查询分组已经到达了主机 B,否则,该查询分组对当前设备无效,丢弃之。
-
主机 B 收到了查询分组之后,验证是对自己的问询,接着构造一个 ARP 响应分组,该分组的目的地只有一个——主机 A,发送给主机 A。同时,主机 B 提取查询分组中的 IP 地址和 MAC 地址信息,在自己的 ARP 表中构造一条主机 A 的 IP-MAC 映射记录。
ARP 响应分组具有和 ARP 查询分组相同的构造,不同的是,发送和接受的 IP 地址恰恰相反,发送的 MAC 地址为发送者本身,目标 MAC 地址为查询分组的发送者,也就是说,ARP 响应分组只有一个目的地,而非广播。
-
主机 A 终将收到主机 B 的响应分组,提取出该分组中的 IP 地址和 MAC 地址后,构造映射信息,加入到自己的 ARP 表中。