计算机网络
什么是TCP的三次握手和四次挥手?
回答:
一、TCP三次握手(建立连接)
TCP(传输控制协议)是面向连接的协议,三次握手用于确保通信双方的发送和接收能力正常,流程如下:
1. 握手过程图示
客户端 服务器
│ │
├───────── SYN=1, seq=x ─────────►│ (客户端发送同步请求,初始化序列号x)
│ │
│ ◄───────── SYN=1, ACK=x+1, seq=y ──────┤ (服务器确认请求,发送同步+确认,初始化序列号y)
│ │
├───────── ACK=y+1 ────────────►│ (客户端确认服务器的确认,连接建立完成)
│ │2. 各步骤细节
第一次握手(客户端→服务器):
客户端发送带有SYN(同步标志)的数据包,声明自己的初始序列号x,请求建立连接。此时客户端状态变为SYN_SENT。第二次握手(服务器→客户端):
服务器收到请求后,返回SYN+ACK数据包:SYN=1:表示服务器同意建立连接;ACK=x+1:确认客户端的序列号(期望下一个数据包的序列号为x+1);- 声明自己的初始序列号
y。此时服务器状态变为SYN_RCVD。
第三次握手(客户端→服务器):
客户端发送ACK(Acknowledgment) 数据包,确认服务器的序列号y(ACK=y+1)。此时客户端和服务器状态均变为ESTABLISHED,连接正式建立。
3.为什么需要三次握手?
1. 防止历史连接初始化
TCP 采用三次握手而非两次握手,核心在于避免旧的网络包(历史连接)被误处理,导致无效连接建立。具体逻辑如下:
一、两次握手为何无法防止历史连接?
假设 TCP 仅通过两次握手建立连接(客户端发 SYN,服务器回 SYN+ACK 即完成连接),可能出现以下风险场景:
场景:旧 SYN 包导致的无效连接
- 客户端首次连接的延迟与重传
- 客户端发送 SYN 包(Seq=100)请求连接,但因网络延迟,该包未到达服务器。
- 客户端超时后重新发送 SYN 包(Seq=200),服务器收到后回复 SYN+ACK(Ack=201, Seq=300),双方完成通信后断开连接。
- 历史 SYN 包延迟到达服务器
- 首次发送的旧 SYN 包(Seq=100)在连接断开后才到达服务器。
- 服务器误认为这是新的连接请求,返回 SYN+ACK 包(Ack=101, Seq=400),并认为连接已建立(因两次握手无需客户端最后确认)。
问题后果:
服务器资源被无效连接占用(持续等待客户端数据),而客户端实际未发起新连接,导致资源浪费和错误连接。
2. 双向确认通信能力
三次握手通过“客户端→服务器→客户端”的三次交互,确保双方均确认对方的发送和接收能力正常:
- 第一次握手:客户端发送 SYN 包,确认自身发送能力正常。
- 第二次握手:服务器返回 SYN+ACK 包,确认自身接收能力正常,且客户端发送能力正常。
- 第三次握手:客户端返回 ACK 包,确认自身接收能力正常,且服务器发送能力正常。
二、TCP四次挥手(断开连接)
当通信结束时,TCP通过四次挥手释放连接,确保数据完整传输。
1. 挥手过程图示
客户端 服务器
│ │
├───── FIN=1, seq=u ───────────►│ (客户端请求断开,发送FIN包,序列号u)
│ │
│ ◄───── ACK=u+1, seq=v ────────┤ (服务器确认客户端的断开请求)
│ │
│ ◄───── FIN=1, ACK=u+1, seq=w ────┤ (服务器处理完剩余数据后,发送FIN包请求断开)
│ │
├───── ACK=w+1 ────────────►│ (客户端确认服务器的断开请求,连接彻底关闭)
│ │2. 各步骤细节
第一次挥手(客户端→服务器):
客户端发送FIN(结束标志)包,声明序列号u,请求断开连接,状态变为FIN_WAIT_1。第二次挥手(服务器→客户端):
服务器收到FIN后,返回ACK包(ACK=u+1),确认客户端的断开请求,此时服务器状态变为CLOSE_WAIT,客户端状态变为FIN_WAIT_2。第三次挥手(服务器→客户端):
服务器处理完剩余数据后,发送FIN包(序列号w),请求断开连接,状态变为LAST_ACK。第四次挥手(客户端→服务器):
客户端收到FIN后,返回ACK包(ACK=w+1),确认服务器的断开请求,状态变为TIME_WAIT;服务器收到ACK后,状态变为CLOSED。客户端在TIME_WAIT状态等待一段时间(2倍最大段生存期,MSL)后,也变为CLOSED。
3. 为什么需要四次挥手?
- 半关闭特性:TCP连接允许单向关闭(一方发送
FIN后,另一方仍可发送数据)。第二次挥手时服务器可能仍有数据未传输完毕,因此ACK和FIN需分开发送,导致四次挥手。
三、关键状态与常见问题
TIME_WAIT状态的作用:
确保最后一个ACK包成功到达服务器,避免服务器因未收到ACK而重发FIN;同时等待网络中残留的数据包过期,防止干扰新连接。三次握手失败/四次挥手异常:
- 若服务器未响应第二次握手,客户端会重发
SYN; - 若客户端未响应第四次挥手,服务器会重发
FIN。
- 若服务器未响应第二次握手,客户端会重发
TCP和UDP的区别?
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务;UDP不保证可靠交付。
- TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。
- TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
- 每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的通信方式。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
网络的工作模式有哪些?
回答:
常见的网络工作模式有:
C/S(Client/Server)模式
客户端主动发起请求,服务器端响应,常见于 Web 应用、APP。B/S(Browser/Server)模式
客户端通过浏览器访问服务器,轻量化,典型代表是各种 Web 系统。P2P(Peer to Peer)模式
各个节点既是客户端也是服务器,节点间直接通信,常见于 BT 下载、区块链。集中式模式
所有请求统一通过中心服务器处理,易于管理,但单点故障风险高。分布式模式
多个节点协同完成任务,负载均衡,高可用,常用于微服务架构。
网络连接模式有哪些
回答:
TCP(面向连接)
- 三次握手建立连接,保证数据可靠传输。
- 特点:可靠、有序、基于字节流,常用于 HTTP、FTP、SMTP 等协议。
UDP(无连接)
- 不建立连接,直接发送数据,可能丢包。
- 特点:不可靠、无序、基于报文,常用于 DNS、视频直播、游戏通信。
单播(Unicast)
- 一对一通信,最常见的模式,比如客户端请求服务器。
广播(Broadcast)
- 一对所有通信,在同一局域网内,消息会发给所有节点。
组播(Multicast)
- 一对多通信,发送给指定组内的多个节点,常用于在线视频会议、直播。
虚拟机常见的网络连接模式有哪些?
回答:
NAT(网络地址转换)
- 虚拟机通过宿主机的 IP 上网,外部网络无法直接访问虚拟机。
- 优点:配置简单,能上网。
- 缺点:虚拟机和外部主机之间访问受限。
桥接(Bridged)
- 虚拟机和宿主机在同一个物理网络中,虚拟机会像一台独立电脑一样获取局域网 IP。
- 优点:虚拟机和局域网内其他设备可互相访问。
- 缺点:需要占用局域网 IP,网络环境要求高。
仅主机(Host-Only)
- 虚拟机只和宿主机通信,不能访问外部网络。
- 优点:适合做隔离实验环境。
- 缺点:无法直接上网。
总结:
- NAT:虚拟机借宿主机上网,外网不能访问虚拟机。
- 桥接:虚拟机像局域网中的独立主机,可直接互访。
- 仅主机:虚拟机只能和宿主机通信,不联网。
什么是软路由?
回答:
软路由就是用一台普通电脑或嵌入式设备,通过安装路由系统软件(如 OpenWrt、PVE+爱快、ROS 等),来实现传统硬件路由器的功能。
- 本质:软件实现的路由器功能。
- 主要功能:上网拨号、NAT 转换、防火墙、DHCP、端口转发、VPN、流量控制等。
- 优点:可扩展性强、功能丰富、性能可根据硬件提升。
- 缺点:对硬件要求高、耗电量相对大、需要一定的网络知识配置。
上网拨号和 DHCP 的区别
回答:
DHCP(动态主机配置协议)
- 设备连上网络后,直接向 DHCP 服务器请求一个 IP 地址。
- 不需要账号密码,自动分配即可。
- 常见于企业内网、校园网、部分光猫桥接后的家庭网络。
PPPoE 拨号
- 在 DHCP 分配 IP 之前,需要先用账号密码完成认证。
- 拨号成功后,运营商再分配一个公网或私网 IP。
- 常见于家庭宽带、小区宽带,需要宽带账号密码。
区别总结:
- DHCP:直接分配 IP,免认证,方便快捷。
- PPPoE:先认证再分配 IP,更适合运营商计费和管理。
在浏览器里面输一个网址,它背后都发生了什么流程?
- URL解析:浏览器解析URL,提取协议、域名、端口等信息
- DNS查询:将域名转换为IP地址(浏览器缓存→系统缓存→路由器缓存→DNS服务器)
- 建立TCP连接:浏览器与服务器进行三次握手建立连接
- 发送HTTP请求:浏览器发送请求报文(请求行、请求头、请求体)
- 服务器处理请求:服务器接收请求,处理业务逻辑,生成响应
- 返回HTTP响应:服务器返回响应报文(状态行、响应头、响应体)
- 浏览器渲染页面:
- 解析HTML构建DOM树
- 解析CSS构建CSSOM树
- 合并DOM和CSSOM生成渲染树
- 布局和绘制页面
- 断开TCP连接:通过四次挥手断开连接
HTTP 常见的状态码有哪些?
| 状态码 | 类别 | 常见状态码 | 含义 |
|---|---|---|---|
| 1xx | 信息性 | 100 Continue | 继续请求 |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content | 请求成功 |
| 3xx | 重定向 | 301 Moved Permanently, 302 Found, 304 Not Modified | 资源位置变更 |
| 4xx | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found | 请求错误 |
| 5xx | 服务器错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable | 服务器错误 |
HTTP2 听过没?那它有啥新功能?
HTTP/2是HTTP协议的升级版,主要解决HTTP/1.1的性能问题:
- 多路复用:一次连接可同时处理多个请求,不用排队等待
- 头部压缩:压缩请求头,减少数据传输量
- 服务器推送:服务器主动发送资源,不用等浏览器请求
- 二进制协议:用二进制代替文本,解析更快
- 请求优先级:重要资源优先加载
简单理解:就像从单车道升级到多车道,车辆可以并行行驶,不用排队。
HTTP3有了解吗?
HTTP/3是最新版本,主要改进:
- 改用UDP:不再用TCP,避免TCP的队头阻塞问题
- 连接更快:0-RTT技术,重连时几乎不耗时
- 自带加密:内置TLS 1.3,安全性更高
- 网络切换:WiFi切换到4G时连接不会断开
简单理解:就像从普通公路升级到高速公路,不仅车道多,而且没有红绿灯,跑得更快。
HTTPS,数据传输过程中用的是对称加密还是非对称加密?
HTTPS使用混合加密方式:
非对称加密(用于握手阶段):
- 客户端使用服务器公钥加密会话密钥
- 服务器使用私钥解密获取会话密钥
- 用于安全交换对称加密所需的密钥
对称加密(用于数据传输阶段):
- 使用握手阶段协商的会话密钥加密实际数据
- 加解密速度快,适合大量数据传输