引言
计算机网络是计算机科学与技术领域的基石,也是技术面试中的必考内容。无论你是准备面试,还是想夯实基础,理解网络协议的核心概念都至关重要。本文基于常见的面试考点,系统梳理了OSI七层模型、TCP/IP协议族、TCP与UDP的区别、HTTP协议演变、HTTPS加密原理、DNS解析过程、WebSocket与Socket的关系,以及TCP的可靠传输机制(三次握手、四次挥手、流量控制、拥塞控制)。希望这份笔记能帮助你构建清晰的知识体系,轻松应对各种网络问题。
一、OSI七层模型与TCP/IP模型
1. OSI七层模型(理论标准)
OSI(Open System Interconnection)模型将网络通信划分为七个层次,自下而上分别为:
| 层次 | 功能描述 | 常见协议/设备 |
|---|---|---|
| 物理层 | 建立、维护、断开物理连接,传输比特流 | 网线、集线器、中继器 |
| 数据链路层 | 提供相邻节点间的可靠数据传输,进行差错控制(FCS校验) | Ethernet、PPP、交换机 |
| 网络层 | 逻辑地址寻址(IP),路由选择 | IP、ICMP、IGMP、路由器 |
| 传输层 | 端到端通信,提供可靠或不可靠传输,端口号标识应用 | TCP、UDP |
| 会话层 | 建立、管理、终止会话(主机间对话) | NetBIOS、RPC |
| 表示层 | 数据格式转换、加密、压缩,确保应用层信息可读 | SSL/TLS、JPEG、ASCII |
| 应用层 | 为用户提供网络服务接口 | HTTP、FTP、SMTP、DNS |
补充:实际网络通信中,数据经过每一层时会被添加对应的头部(封装),接收端逐层解析(解封装)。
2. TCP/IP模型(事实标准)
TCP/IP模型是实际使用的协议栈,通常分为四层(或五层):
-
应用层:对应OSI的应用层、表示层、会话层。协议:HTTP、FTP、SMTP、DNS、WebSocket等。
-
传输层:对应OSI的传输层。协议:TCP、UDP。
-
网络层:对应OSI的网络层。协议:IP、ICMP、IGMP。
-
网络接口层:对应OSI的数据链路层和物理层。协议:Ethernet、ARP等。
二、TCP与UDP的对比
| 特性 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 连接性 | 面向连接,需三次握手建立连接 | 无连接,直接发送数据 |
| 可靠性 | 可靠传输:序列号、确认应答、重传、校验和、去重、排序 | 不可靠传输:尽最大努力,可能丢包、乱序、重复 |
| 流量控制 | 支持滑动窗口,避免接收方过载 | 无 |
| 拥塞控制 | 支持慢启动、拥塞避免等 | 无 |
| 数据传输方式 | 面向字节流,无边界 | 面向报文,保留报文边界 |
| 首部开销 | 最小20字节,最大60字节 | 固定8字节 |
| 通信方式 | 点对点(一对一) | 一对一、一对多、多对一、多对多(广播、多播) |
| 典型应用 | HTTP/HTTPS、FTP、SMTP、SSH | DNS、DHCP、视频直播、VoIP、在线游戏 |
选择依据:需要可靠性、顺序性选TCP;实时性要求高、可容忍少量丢包选UDP,应用层自行处理可靠性(如QUIC协议基于UDP实现)。
三、HTTP协议详解
1. HTTP的无状态性
HTTP协议是无状态的,即服务器不会记住客户端的两次请求之间的关系。每次请求都是独立的,服务器仅基于当前请求返回响应,不保存客户端状态。这种设计简化了服务器实现,但也带来了身份识别的挑战,因此引入了Cookie、Session、Token等机制。
2. 浏览器输入URL到页面显示的过程
-
DNS解析:查找域名对应的IP地址(浏览器缓存 → 本地DNS → 根DNS → 顶级DNS → 权威DNS)。
-
TCP连接:通过三次握手建立TCP连接(默认端口80)。
-
发送HTTP请求:浏览器构造HTTP请求报文(包含Cookie等信息)发送给服务器。
-
服务器处理请求:返回HTTP响应(通常包含HTML页面)。
-
浏览器渲染:解析HTML,加载CSS、JS、图片等资源(可能发起更多HTTP请求)。
-
关闭连接:TCP四次挥手释放连接(HTTP/1.1默认持久连接,可复用)。
3. HTTP版本演进
| 版本 | 特点 |
|---|---|
| HTTP/1.0 | 短连接,每次请求需新建TCP;可设置Connection: keep-alive启用长连接。 |
| HTTP/1.1 | 默认长连接(持久连接),支持管道化(同一连接发送多个请求),但队头阻塞问题依然存在。 |
| HTTP/2.0 | 二进制分帧(头信息和数据体均为二进制),多路复用(一个连接并发处理多个请求),头部压缩(HPACK),服务器推送。 |
4. POST与GET的区别
| 特性 | GET | POST |
|---|---|---|
| 可见性 | 参数在URL中可见,可被书签收藏 | 参数在请求体中,不可见 |
| 安全性 | 参数暴露,不安全(密码等不应用GET) | 相对安全,但仍需加密(HTTPS) |
| 数据长度 | 受URL长度限制(浏览器/服务器限制) | 理论上无限制,受服务器配置限制 |
| 用途 | 获取资源,幂等(多次请求相同结果) | 提交数据,可能改变服务器状态,非幂等 |
| 缓存 | 可被缓存 | 一般不缓存 |
5. HTTP长连接
HTTP长连接本质上是指TCP长连接,通过Connection: keep-alive头部实现(HTTP/1.1默认开启)。长连接允许复用同一个TCP连接传输多个HTTP请求,减少握手开销。超时时间由服务器keep-alive timeout和TCP内核参数共同决定(如tcp_keepalive_time)。
四、HTTPS与加密通信
1. HTTP存在的问题
-
明文传输,易被窃听。
-
未验证通信双方身份,易被冒充。
-
无数据完整性校验,易被篡改。
2. HTTPS = HTTP + SSL/TLS
HTTPS在HTTP和TCP之间加入SSL/TLS层,提供加密、认证和完整性保护。
3. HTTPS工作流程(基于RSA握手)
-
客户端发起HTTPS请求,连接服务器443端口。
-
服务器返回数字证书(包含公钥、颁发机构、有效期等)。
-
客户端验证证书合法性,通过后生成随机对称密钥,用证书公钥加密发送给服务器。
-
服务器用私钥解密,得到对称密钥。
-
后续通信使用该对称密钥进行加密传输。
4. 公钥、私钥、数字签名、数字证书
-
对称加密:加密和解密使用同一密钥,速度快,但密钥分发困难。
-
非对称加密:公钥加密,私钥解密;私钥签名,公钥验签。解决了密钥分发问题,但速度慢。
-
数字签名:对消息的哈希值用私钥加密,接收方用公钥解密并比对哈希值,确保消息完整性和来源可信。
-
数字证书:由CA(证书颁发机构)签发,包含公钥、持有者信息、CA的数字签名等,用于绑定身份与公钥。
五、DNS解析过程
DNS(域名系统)将域名转换为IP地址,解析流程如下:
-
浏览器缓存 → 操作系统缓存 → 本地hosts文件 → 本地DNS服务器(如ISP提供的DNS)。
-
本地DNS服务器向根域名服务器查询,根服务器返回顶级域名服务器(如.com)地址。
-
本地DNS向顶级域名服务器查询,返回权威域名服务器(如baidu.com)地址。
-
本地DNS向权威域名服务器查询,得到最终IP地址,返回给客户端并缓存。
六、WebSocket与Socket
1. WebSocket vs HTTP
-
通信模式:HTTP单向请求-响应;WebSocket双向全双工,连接建立后可主动推送。
-
连接状态:HTTP无状态,WebSocket有状态(长连接)。
-
握手方式:WebSocket基于HTTP握手(Upgrade头部升级协议)。
-
头部开销:HTTP每次请求携带大量头部;WebSocket握手后头部极小。
2. WebSocket vs Socket
-
Socket:网络编程接口(API),封装TCP/UDP,用于进程间通信。
-
WebSocket:应用层协议,基于TCP,用于浏览器与服务器全双工通信。
联系:WebSocket底层使用Socket编程实现。
七、TCP核心机制
1. 三次握手(建立连接)
过程:
-
客户端发送SYN=1,seq=x → SYN-SENT状态。
-
服务器回复SYN=1,ACK=1,seq=y,ack=x+1 → SYN-RCVD状态。
-
客户端发送ACK=1,seq=x+1,ack=y+1 → ESTABLISHED状态,服务器收到后也进入ESTABLISHED。
为什么是三次?
-
防止已失效的连接请求报文突然传到服务器,造成错误(两次握手会导致服务器误建立连接)。
-
三次握手可确保双方收发能力正常,同步初始序列号。
为什么不是两次? 如果只有两次,服务器发送确认后即认为连接建立,但客户端可能未收到确认或请求已失效,浪费资源。
为什么不是四次? 三次已足够,四次浪费。
2. 四次挥手(释放连接)
过程(假设客户端主动关闭):
-
客户端发送FIN=1,seq=u → FIN-WAIT-1。
-
服务器回复ACK=1,seq=v,ack=u+1 → CLOSE-WAIT,客户端进入FIN-WAIT-2。
-
服务器数据发送完毕,发送FIN=1,ACK=1,seq=w,ack=u+1 → LAST-ACK。
-
客户端回复ACK=1,seq=u+1,ack=w+1 → TIME-WAIT,等待2MSL后关闭;服务器收到ACK后立即关闭。
为什么需要四次? 因为TCP全双工,每个方向需单独关闭。服务器收到FIN后可能还有数据要发送,不能立即发FIN,因此ACK和FIN分开发送。
为什么TIME-WAIT等待2MSL?
-
确保最后一个ACK能被服务器收到(若丢失,服务器重传FIN,客户端可重发ACK)。
-
保证本次连接的所有报文在网络中消失,避免影响新连接。
3. TCP如何保证可靠传输?
-
序列号与确认应答:每个字节编号,接收方返回ACK。
-
超时重传:发送方启动定时器,超时未收到ACK则重传。
-
校验和:检测数据是否损坏。
-
流量控制:滑动窗口,避免接收方缓冲区溢出。
-
拥塞控制:慢启动、拥塞避免、快速重传、快速恢复,适应网络负载。
-
连接管理:三次握手、四次挥手。
-
数据排序:接收方根据序列号重组数据。
-
重复丢弃:丢弃重复报文。
4. 流量控制(滑动窗口示例)
发送方根据接收方通告的窗口大小调整发送速率。例如:
-
初始窗口均为400字节。
-
发送200字节后,窗口减小;接收方处理能力下降,窗口缩至0,发送方停止发送并定时探测。
-
当接收方处理完毕,窗口扩大,发送方继续发送。
5. 拥塞控制
-
慢启动:初始拥塞窗口较小,指数增长至慢启动阈值。
-
拥塞避免:超过阈值后线性增长,遇到丢包(超时或重复ACK)时减窗。
-
快速重传:收到3个重复ACK立即重传,不必等待超时。
-
快速恢复:配合快速重传,将拥塞窗口减半而非降至1。
八、常见面试题补充
1. forward和redirect的区别(Servlet)
| 特性 | forward(转发) | redirect(重定向) |
|---|---|---|
| 地址栏 | 不变 | 变为新URL |
| 请求次数 | 1次 | 2次 |
| 数据共享 | 可以共享request | 不能共享request |
| 行为 | 服务器内部跳转 | 客户端重新发起请求 |
| 效率 | 高 | 低 |
2. Session、Cookie、Token的区别
-
Cookie:客户端保存的小文本,用于携带状态信息(如Session ID)。
-
Session:服务器端保存的用户状态数据,通过Session ID关联(通常存于Cookie)。
-
Token:无状态认证机制,服务器不保存,客户端携带加密令牌,常用于分布式系统。
分布式Session解决方案:使用Redis集中存储Session,或采用JWT等Token方案。
客户端禁用Cookie怎么办? Session ID可放在URL参数或请求头(如Authorization)中传输。
九、总结
计算机网络知识点繁多,但核心脉络清晰。掌握OSI与TCP/IP模型、TCP/UDP区别、HTTP/HTTPS原理、三次握手与四次挥手等基础,是深入理解网络通信的关键。希望本文的梳理能帮助读者构建知识体系,在面试或实际开发中游刃有余。