一、基础篇
1、 TCP/IP 网络模型
对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层,网络接口层。
应用层:
应用层是不用去关心数据是如何传输的,只需要专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
传输层:
传输层的作用在于为运行在不同主机上的应用进程之间提供逻辑通信(这里的逻辑通信指的是在传输层角度看来两个进程间直接进行通信,实际上还是通过下层提供的服务)。传输层有两个传输协议,分别是 TCP 和 UDP:
- TCP:提供 面向连接 的,可靠 的数据传输服务。
- UDP:提供 无连接 的,尽最大努力 的数据传输(不保证数据传输的可靠性),简单高效。
应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段。
网络层:
我们不希望传输层处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能交给网络层。
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
网络层将数据从一个设备传输到另一个设备,需要依赖IP地址和子网掩码进行寻址找到对应的子网,再去寻找对应的主机。
除了寻址能力, IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。
网络接口层:
负责将数据转换为数字信号在物理设备之间传输。在生成了 IP 头部之后,接下来要交给网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
四个层的封装格式如下图:
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
2、从输入 URL 到页面展示到底发生了什么?
- DNS解析:发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。
- TCP连接:客户端浏览器与WEB服务器建立TCP连接。
- 发送HTTP请求:客户端浏览器向目标WEB服务器发送相应的HTTP或HTTPS请求。
- 服务器处理请求并返回 HTTP 报文:WEB服务器响应请求,返回指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址。
- 浏览器解析渲染页面:客户端浏览器下载数据,解析HTML源文件,在页面中进行显示。
- 连接结束:断开TCP连接。
二、HTTP篇
3、HTTP基本概念
3.1、HTTP是什么?
HTTP 是在互联网中约束两设备之间传输超文本数据的约定和规范。
3.2、HTTP 常见的状态码:
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx
类状态码表示服务器成功处理了客户端的请求,常见的有:- 「200 OK」是最常见的成功状态码,表示一切正常。
-
「204 No Content」也是常见的成功状态码,但响应头没有 body 数据。
-
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向,常见的有:-
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
-
「302 Found」即临时重定向,请求的资源还在,但暂时需要用另一个 URL 来访问。
- 「304 Not Modified」缓存重定向,告诉客户端可以继续使用缓存资源,用于缓存控制。
-
-
4xx
类状态码表示客户端发送的报文有误,服务器无法处理。常见的有:-
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
-
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
-
「404 Not Found」表示请求的资源在服务器上不存在,所以无法提供给客户端。
-
-
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,常见的有:-
「500 Internal Server Error」与 400 类似,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
-
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
-
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
-
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
-
3.3、HTTP 常见字段有哪些?
- Host:客户端发送请求时,用来指定服务器的域名。
- Content-Length :表明服务器返回数据的数据长度。
- Connection :常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用。
- Content-Encoding :说明数据的压缩方法,表示服务器返回的数据使用了什么压缩格式。
4、GET 和 POST 有什么区别?
- 语义(主要区别):GET 通常用于获取或查询资源;而 POST 通常用于创建或修改资源。
- 幂等:GET 请求是幂等的,即多次重复执行不会改变资源的状态;而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。
- 格式:GET 请求的参数通常放在 URL 中,形成查询字符串;POST 请求的参数通常放在请求体(body)中。
- 缓存:由于 GET 请求是幂等的,它可以被浏览器或其他中间节点缓存起来,以提高性能; POST 请求则不适合被缓存,因为它可能有副作用,每次执行可能需要实时的响应。
5、HTTP缓存技术
对于一些具有重复性的 HTTP 请求,可以把这些「请求-响应」的数据都缓存在本地,提高访问速度,降低服务器压力。
http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,其设置了过期时间大小。当浏览器再次请求访问服务器中的该资源时,会先根据Cache-Control 中设置的过期时间,来判断该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器。
-
强制缓存:只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,无需向服务器发送请求。
- 协商缓存:向服务器发送请求,服务器会根据请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并通知浏览器从缓存中读取资源。
6、HTTP 与 HTTPS
6.1、HTTP 与 HTTPS 的区别:
-
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
-
HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
6.2、HTTPS 解决了 HTTP 的哪些问题?
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。
- 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续不再使用非对称加密。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的标识,用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
对称加密:只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
非对称加密:用公钥和私钥,公钥可任意分发,私钥保密,解决了密钥交换问题但速度慢。
6.3、HTTPS 是如何建立连接的?
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
6.4、HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
- 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
6.5、HTTP/2 做了什么优化?
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
- 头部压缩:如果同时发送多个请求,且头部是一样的,那协议会自动进行压缩。
- 二进制格式:不再像 HTTP/1.1 采用纯文本格式,头信息和数据体都是二进制且统称为帧。
- 并发传输:引入了 Stream 概念,多个 Stream 复用在一条 TCP 连接。
- 服务器推送:客户端和服务器双方都可以建立 Stream,减少消息传递次数。
6.6、HTTP/3 做了哪些优化?
HTTP/1.1 和 HTTP/2 都有队头阻塞的问题:
- HTTP/1.1属于 HTTP 层队头阻塞。
- HTTP/2 属于 TCP 层队头阻塞。
所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
6.7、HTTP 是不保存状态的协议, 如何保存用户状态?
通过session和cookie机制协同保存用户的状态。Session的作用就是通过服务端记录用户的状态,当用户进行操作时,服务端给该用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。最后通过在 Cookie 中附加一个 Session ID 来方式来跟踪这个Session。
使用 Session 维护用户登录状态的过程如下:
- 用户进行登录时,用户提交包含用户名和密码的表单,放入 HTTP 请求报文中;
- 服务器验证该用户名和密码,如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 Key 称为 Session ID;
- 服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中;
- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之前的业务操作。
如果cookie被禁用的话,可以利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
7、WebSocket
7.1、什么是 WebSocket?
WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。其本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
7.2、WebSocket 和 HTTP 有什么区别?
- WebSocket 是一种双向实时通信协议,而 HTTP 是一种单向通信协议。
- WebSocket 使用 ws:// 或 wss:// 作为协议前缀,HTTP 使用 http:// 或 https:// 作为协议前缀。
- WebSocket 可以支持扩展,实现部分自定义的子协议,如支持压缩、加密等。
8、Ping命令
ping命令用来测试网络中主机之间的连通性和网络延迟。
工作原理:
基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。
PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。
- PING 命令会向目标主机发送 ICMP Echo Request。
- 如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply。
9、DNS
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题,属于应用层协议,使用UDP传输。
先以递归的方式查询本地 DNS 服务器,再以迭代的方式查询其余服务器。
DNS解析过程:
- 先查询缓存以及硬盘里的hosts文件。
- 请求本地dns服务器,本地dns服务器一般都是你的网络接入服务器商提供,比如中国电信。
- 本地DNS服务器以迭代的方式请求根域名服务器、顶级域名服务器...最终查询到ip地址。
10、TCP和UDP
10.1、TCP 与 UDP 的区别
- 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
- 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
- 是否有状态:这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了。
- 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
- 传输形式:TCP 是面向字节流的,UDP 是面向报文的。
- 首部开销:TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。
- 是否提供广播或多播服务:TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;
10.2、什么时候选择 TCP,什么时候选 UDP?
- UDP 一般用于即时通信,比如:语音、 视频、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。
- TCP 用于对传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等。
10.3、HTTP 基于 TCP 还是 UDP?
HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 基于 UDP 的 QUIC 协议 。主要是为了解决 HTTP/2 中存在的队头阻塞问题。
这是由于 HTTP/2.0 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。
10.4、使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
使用TCP的协议:
- HTTP 协议(HTTP/3.0 之前):是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
- HTTPS 协议:更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议。
- FTP 协议:文件传输协议 FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。
-
SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
- POP3/IMAP 协议:两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
- Telnet 协议:用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
- SSH 协议 : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
使用UDP的协议:
- HTTP 协议(HTTP/3.0 ): HTTP/3.0 弃用 TCP,改用基于 UDP 的 QUIC 协议 。
- DHCP 协议:动态主机配置协议,动态配置 IP 地址。
- DNS:域名系统(DNS,Domain Name System)将人类可读的域名转换为机器可读的 IP 地址。实际上,DNS 同时支持 UDP 和 TCP 协议。
10.5、TCP 三次握手
建立一个 TCP 连接需要“三次握手”,缺一不可:
- 一次握手 : 客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
- 二次握手 : 服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手 : 客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成 TCP 三次握手。
10.6、为什么需要三次握手?
三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常。
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常。
- 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常。
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
10.7、TCP 四次挥手
断开一个 TCP 连接则需要“四次挥手”,缺一不可:
- 第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。
- 第二次挥手:服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
- 第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
- 第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
举个例子:A 和 B 打电话,通话即将结束后。
- 第一次挥手:A 说“我没啥要说的了”
- 第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
- 第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
- 第四次挥手:A 回答“知道了”,这样通话才算结束。
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
10.8、TCP 如何保证传输的可靠性?
- 基于数据块传输:应用数据被分割成数据块,再传输给网络层,数据块被称为报文段或段。
- 对失序数据包重新排序以及去重:TCP 为了保证不发生丢包,就给每个包一个序列号,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重。
- 校验和 : TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- 重传机制 : 在数据包丢失或延迟的情况下,重新发送数据包,直到收到对方的确认应答。
- 流量控制 : 当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。
- 拥塞控制 : 当网络拥塞时,减少数据的发送。TCP 在发送数据的时候,需要考虑两个因素:一是接收方的接收能力,二是网络的拥塞程度。接收方的接收能力由滑动窗口表示,表示接收方还有多少缓冲区可以用来接收数据。网络的拥塞程度由拥塞窗口表示,它是发送方根据网络状况自己维护的一个值,表示发送方认为可以在网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞。
10.9、什么是TCP粘包/拆包?发生的原因?
由于 TCP 传输协议是面向字节流的传输协议,没有消息保护边界,所以发送方发送的多个数据包,接收方应用层不知如何区分,可能会被当成一个包来处理,这就是粘包;或者,发送方将一个打包分成多个小包发送,而接收方将它们当成多个包进行处理,这就是拆包。
解决方法:
- 将首尾字符用特殊字符分隔。
- 使用变长协议,在报文头中指定当前报文中数据的长度。(如HTTP协议)
10.10、什么是半连接队列?
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。
11、IP
IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
12、NAT的作用是什么?
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
13、ARP
13.1、什么是 Mac 地址?
MAC地址:MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。
MAC 地址具有可携带性、永久性,永久地标识一个设备的身份,不论它到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
13.2、ARP 协议有什么用?
它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。