OSI、TCP/IP 与 REST API 校招面试题|计算机网络综合考点
OSI、TCP/IP 与 REST API 校招面试题|计算机网络综合考点
本章面向计算机专业学生、应届生和校招求职者,集中梳理 OSI 七层模型、TCP/IP 四层协议与 REST API,帮助建立网络分层和接口设计的整体认知。
1. 请描述一下 OSI 七层协议
面试题剖析
这道题考察对网络分层的整体认识。回答应覆盖七层名称、各层职责、典型技术以及与 TCP/IP 模型的对应关系。重点不是背名称,而是能解释为什么寻址、可靠传输和应用语义需要分层处理。
面试题解答
OSI 是用于描述网络通信职责的七层参考模型。从下到上依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

- 物理层:传输比特信号
定义电气、光学、无线信号及接口规范,将比特编码成适合介质传输的信号。例如网线、光纤上的信号传输。它不理解 IP 地址、端口或网页内容。
- 数据链路层:在相邻节点之间传输帧
负责成帧、链路寻址、介质访问和差错检测。以太网帧包含源、目标 MAC 和用于差错检测的 FCS。部分链路技术还有重传机制,但不能认为所有数据链路协议都负责纠正错误。普通二层交换机依据 MAC 转发帧。
- 网络层:跨网络寻址和转发
通过逻辑地址识别端点,根据路由表逐跳转发数据包。典型协议是 IP、ICMP,路由器主要在这一层工作。IP 提供尽力而为的交付,不保证到达、顺序或不重复。IP 地址通常配置给网络接口,一台设备可以有多个地址。
- 传输层:提供应用进程之间的通信
TCP、UDP 通过端口区分通信端点。TCP 提供面向连接、可靠、有序的字节流,并提供流量控制和拥塞控制;UDP 提供无连接的数据报服务。因此,“可靠、有序”是 TCP 的能力,不是所有传输层协议共同的保证。
- 会话层:组织会话
负责会话建立、维护、对话控制和同步等概念性功能。实际互联网应用通常由应用程序或协议库完成这些工作,并不一定存在独立的会话层模块。
- 表示层:处理数据表示
涉及编码转换、序列化、压缩、加密等功能。可以用字符编码和数据格式转换辅助理解;不要把实际协议栈中的 TLS 强行等同于一个独立的 OSI 表示层协议。
- 应用层:规定应用间的通信语义
例如 HTTP 规定网页与接口的请求响应,DNS 提供域名解析,SMTP 用于发送邮件,IMAP/POP3 用于读取邮件。应用层不是浏览器界面本身,而是应用使用的网络协议与服务。
发送数据时逐层封装,接收时反向解封装。在典型以太网 IPv4/TCP 场景中,可概括为“应用数据 → TCP 报文段 → IP 数据包 → 以太网帧 → 信号”。TCP/IP 四层模型把 OSI 顶部三层归入应用层,底部两层归入网络接口层。
面试时可以总结为:物理层传信号,链路层传帧,网络层跨网寻址,传输层服务进程通信,顶部三层分别组织会话、处理表示和定义应用语义。分层使不同技术能够独立演进,也方便定位问题。
可能追问的问题
TCP/IP 四层模型与 OSI 七层如何对应?
交换机和路由器依据什么地址转发?
TCP、UDP、IP、HTTP、ARP 分别处于什么位置?
为什么不能说传输层一定提供可靠传输?
2. 简述 TCP/IP 四层协议
面试题剖析
考察候选人对计算机网络体系结构的理解,能否准确说明 TCP/IP 四层模型中各层的名称、主要职责、典型协议,以及数据在不同层之间封装和解封装的过程。同时可能考察其能否区分 TCP/IP 四层模型与 OSI 七层模型。
面试题解答

TCP/IP 协议模型将网络通信划分为四层,分别是网络接口层、网络层、传输层和应用层(从下到上)。
网络接口层(Network Interface Layer)
网络接口层是 TCP/IP 模型的最底层,负责数据在同一物理网络中的传输。它将上层传递下来的数据封装成数据帧,并通过网线、光纤或无线信号发送出去。
该层主要涉及 MAC 地址、数据帧、网卡以及物理传输介质。常见协议或技术包括以太网、Wi-Fi 和 ARP。例如,主机在局域网中发送数据时,需要通过目标设备或下一跳设备的 MAC 地址完成帧的传输。
网络接口层解决的是相邻设备之间如何传输数据的问题,交换机主要工作在这一层。
网络层(Internet Layer)
网络层负责将数据从源主机传输到目标主机,主要功能包括 IP 地址寻址、路由选择和数据包转发。
网络层的核心协议是 IP。每台接入网络的设备都会配置相应的 IP 地址,路由器根据数据包中的目标 IP 地址查询路由表,选择合适的路径进行转发。一个数据包从源主机到达目标主机,可能需要经过多个路由器。
网络层只提供尽力而为的传输服务,不保证数据一定能够到达,也不保证数据按照发送顺序到达。除 IP 外,网络层常见的协议还有 ICMP,ping 命令就是通过 ICMP 检测网络连通性的。
传输层(Transport Layer)
传输层负责不同主机上应用程序之间的通信。网络层通过 IP 地址找到目标主机,传输层则通过端口号找到目标主机中的具体应用程序。
传输层主要有 TCP 和 UDP 两种协议。
TCP 是面向连接、可靠的传输协议。它通过三次握手建立连接,并通过序列号、确认应答、超时重传等机制保证数据可靠、有序地到达,同时还提供流量控制和拥塞控制。HTTP/1.1、HTTP/2、文件传输和 SSH 等场景通常使用 TCP;HTTP/3 使用 QUIC/UDP,同样可以提供可靠传输。
UDP 是无连接的传输协议。发送数据前不需要建立连接,也不保证数据一定到达或按顺序到达。它的协议开销较小,适用于实时音视频、在线游戏和 DNS 查询等更关注实时性的场景。
TCP 和 UDP 的区别是传输层中非常常见的独立考点。
应用层(Application Layer)
应用层直接为应用程序提供网络服务,负责规定应用程序之间交换数据时所使用的格式和通信规则。
常见的应用层协议包括 HTTP、HTTPS、DNS、FTP、SMTP 和 SSH。例如,浏览器使用 HTTP 或 HTTPS 与服务器交换网页数据,DNS 负责将域名解析为 IP 地址,SMTP 用于发送电子邮件。
TCP/IP 模型中的应用层相当于 OSI 模型中的应用层、表示层和会话层。因此,数据格式转换、加密、压缩以及会话管理等功能,也通常由应用程序或应用层协议完成。
数据发送时,会按照应用层、传输层、网络层和网络接口层的顺序逐层封装;接收数据时,则按照相反的顺序逐层解封装。
面试时可以总结为:应用层定义业务协议,传输层提供进程通信,网络层负责跨网络寻址,网络接口层负责当前链路交付。发送时逐层封装,接收时反向解封装;可靠性与消息边界要看具体传输协议。
可能追问的问题
TCP/IP 四层模型与 OSI 七层模型有什么区别和对应关系?
TCP 和 UDP 有什么区别?分别适用于哪些场景?
浏览器访问一个网站时,数据是如何经过 TCP/IP 各层进行封装和传输的?
3. 请说一下 REST API
面试题剖析
这道题考察接口设计思路,而不仅是能否列出 GET、POST 等方法。需要讲清资源与资源表示、无状态、统一接口和 HTTP 方法语义,避免把“HTTP + JSON”直接等同于严格的 REST。
面试题解答
REST 是一种架构风格,REST API 通常使用 URI 标识资源,通过资源的表示与客户端交互。例如 /books/1001 标识一本书,返回的 JSON 是它的一种表示。
- 核心约束
REST 包括客户端与服务端分离、无状态、可缓存、统一接口、分层系统,以及可选的按需代码。无状态意味着每次请求应包含理解该请求所需的信息,不依赖服务端保存前一次交互上下文;它不意味着服务器不能保存数据库中的资源。
统一接口还包括资源标识、通过表示操作资源、自描述消息和超媒体驱动应用状态。很多工程中称为 RESTful 的 JSON 接口只实践了其中一部分。严格定义可参考 Fielding 的 REST 论述。
- 资源与方法配合使用
GET 在语义上安全且幂等,PUT、DELETE 幂等但不安全;POST、PATCH 不默认保证幂等。幂等比较预期的服务端效果,不要求每次响应状态码完全相同。失败重试仍要结合认证、条件请求和业务幂等设计。
- Flask 示例
下面使用内存字典演示 CRUD 和完整替换语义。仅用于单进程教学,数据不持久化;生产环境还需要数据库、认证、并发控制和错误处理。
from flask import Flask, jsonify, request, url_for
app = Flask(__name__)
books = {}
def parseBook():
data = request.get_json(silent=True)
if not isinstance(data, dict):
return None
if not all(isinstance(data.get(key), str) and data[key].strip()
for key in ('title', 'author')):
return None
return {'title': data['title'].strip(), 'author': data['author'].strip()}
@app.get('/books')
def listBooks():
return jsonify([{'id': key, **value} for key, value in books.items()])
@app.get('/books/<int:book_id>')
def getBook(book_id):
if book_id not in books:
return jsonify(error='Book not found'), 404
return jsonify(id=book_id, **books[book_id])
@app.post('/books')
def createBook():
book = parseBook()
if book is None:
return jsonify(error='title and author are required'), 400
# This ID allocator is only for a single-process teaching example.
book_id = max(books, default=0) + 1
books[book_id] = book
response = jsonify(id=book_id, **book)
response.status_code = 201
response.headers['Location'] = url_for('getBook', book_id=book_id)
return response
@app.put('/books/<int:book_id>')
def replaceBook(book_id):
if book_id not in books:
return jsonify(error='Book not found'), 404
book = parseBook()
if book is None:
return jsonify(error='title and author are required'), 400
books[book_id] = book
return jsonify(id=book_id, **book)
@app.delete('/books/<int:book_id>')
def deleteBook(book_id):
if book_id not in books:
return jsonify(error='Book not found'), 404
del books[book_id]
return '', 204
if __name__ == '__main__':
app.run()
面试时可以总结为:REST 以资源为中心,通过统一接口交换资源表示。在 HTTP API 中,通常用 URI 定位资源、方法表达操作、状态码表达结果;同时还要考虑无状态、缓存、幂等和并发修改,不能只把接口路径改成名词就认为实现了完整 REST。
可能追问的问题
PUT 和 PATCH 的区别是什么,PATCH 一定幂等吗?
DELETE 第一次返回 204、第二次返回 404,还是幂等的吗?
REST 无状态与服务器保存业务数据矛盾吗?
ETag 和 If-Match 如何避免并发覆盖?
继续阅读
阅读导航




