2.2 万字 80 张手绘图,详解 63 道计算机网络面试高频题(让天下没有难背的八股),面渣背会这些计算机网络八股文,这次吊打面试官,我觉得稳了(手动 dog)。整理:沉默王二,戳
转载链接
,作者:三分恶,戳
原文链接
。
大家好,我是二哥呀,今天继续来给大家分享三弟的面渣逆袭!
这次带来的是计算机网络六十二问,三万字,七十图详解,大概是全网最全的计算机网络面试题。
建议大家收藏了慢慢看,秋招、春招、金九银十、金三银四冲!
计算机网络体系结构通过将复杂的网络通信分解成不同的层次,来标准化交互的过程。常见的模型包括 OSI 七层模型、TCP/IP 四层模型和五层体系结构。
三分恶面渣逆袭:三种网络体系结构
OSI 是理论上的网络通信模型,TCP/IP 是实际应用层面上的网络通信模型,五层结构是为了方便理解和记忆。
OSI(Open System Interconnection)七层参考模型是一个网络架构模型,由国际标准化组织(ISO)提出,用于描述和标准化各种计算机网络的功能和过程。这七层从高到低分别是:
-
应用层
:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
-
表示层
:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
-
会话层
:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
-
传输层
:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
-
网络层
:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
-
数据链路层
:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
-
物理层
:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针脚、电缆的规格和传输速率等。
TCP/IP 四层模型是互联网通信的核心,定义了一系列协议和标准,确保设备间可以可靠地进行数据传输。
medium:Victor Aaron Winnercoz
①、
应用层(Application Layer)
:直接面向用户和应用程序,提供各种网络服务。它包含了用于特定应用的协议和服务,如 HTTP(HyperText Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等。
示例:当在浏览器中输入一个 URL 并访问一个网页时,浏览器使用 HTTP 协议从 Web 服务器请求页面内容。
②、
传输层(Transport Layer)
:提供端到端的通信服务,确保数据可靠传输。它负责分段数据、流量控制、错误检测和纠正。常见的传输层协议有 TCP 和 UDP。
示例:当发送一封电子邮件时,TCP 协议确保邮件从你的客户端可靠地传输到邮件服务器。
③、
网际层
:或者叫网络层(Internet Layer),负责在不同网络之间路由数据包,提供逻辑地址(IP 地址)和网络寻址功能。用于处理数据包的分组、转发和路由选择,确保数据可以从源端传输到目标端。
常见协议:IPv4、IPv6、ICMP(Internet Control Message Protocol)。
示例:当访问一个网站时,网络层协议(如 IPv4)将你的请求从你的计算机通过多个路由器传输到目标服务器。
④、
网络接口层(Network Access Layer)
:或者叫链路层(Link Layer),负责将数字信号在物理通道(网线)中准确传输,定义了如何在单一网络链路上传输数据,如何处理数据帧的发送和接收,包括物理地址(MAC 地址)的解析。
常见协议:以太网(Ethernet)、Wi-Fi。
示例:在一个局域网(LAN)中,计算机通过以太网连接交换机,链路层协议负责数据帧在网络设备间的传输。
是对 OSI 和 TCP/IP 的折衷,它保留了 TCP/IP 的实用性,同时提供了比四层模型更细致的分层,便于教学和理解网络的各个方面。
-
应用层:作为网络服务和最终用户之间的接口。它提供了一系列供应用程序使用的协议,如 HTTP(网页)、FTP(文件传输)、SMTP(邮件传输)等。使用户的应用程序可以访问网络服务。
-
传输层:提供进程到进程的通信管理,这一层确保数据按顺序、无错误地传输。主要协议包括 TCP 和 UDP。
-
网络层:负责数据包从源到目的地的传输和路由选择,包括跨越多个网络(即互联网)。它使用逻辑地址(如 IP 地址)来唯一标识设备。路由器是网络层设备。
-
数据链路层:确保从一个节点到另一个节点的可靠、有效的数据传输。交换机、网桥是数据链路层设备。
-
物理层:电缆、光纤、无线电频谱、网络适配器等。
三次握手和四次挥手都是工作在传输层。传输层(Transport Layer)是 OSI 模型的第四层,负责提供端到端的通信服务,包括数据传输的建立、维护和终止。
TCP 作为一种面向连接的协议,通过三次握手建立连接,通过四次挥手终止连接,确保数据传输的可靠性和完整性。
计算机网络是指将多台计算机通过通信设备互联起来,实现资源共享和信息传递的系统。
游坦之:计算机网络
-
Java 面试指南(付费)
收录的华为 OD 面经同学 1 一面面试原题:说一些 OSI 七层参考模型
-
Java 面试指南(付费)
收录的京东面经同学 2 后端面试原题:TCP三次握手四次挥手工作在哪一层?
-
Java 面试指南(付费)
收录的京东面经同学 5 Java 后端技术一面面试原题:让自己讲一下网络
一张表格总结常见网络协议:
各层网络对应的网络协议
对于发送方而言,从上层到下层层层包装,对于接收方而言,从下层到上层,层层解开包装。
-
发送方的应用进程向接收方的应用进程传送数据
-
AP 先将数据交给本主机的应用层,应用层加上本层的控制信息 H5 就变成了下一层的数据单元
-
传输层收到这个数据单元后,加上本层的控制信息 H4,再交给网络层,成为网络层的数据单元
-
到了数据链路层,控制信息被分成两部分,分别加到本层数据单元的首部(H2)和尾部(T2)
-
最后的物理层,进行比特流的传输
数据在各层之间的传输
这个过程类似写信,写一封信,每到一层,就加一个信封,写一些地址的信息。到了目的地之后,又一层层解封,传向下一个目的地。
GitHub 上标星 10000+ 的开源知识库《
二哥的 Java 进阶之路
》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:
太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜
沉默王二
或扫描下方二维码关注二哥的原创公众号沉默王二,回复
222
即可免费领取。
这个过程包括多个步骤,涵盖了 DNS 解析、TCP 连接、发送 HTTP 请求、服务器处理请求并返回 HTTP 响应、浏览器处理响应并渲染页面等多个环节。
-
DNS 解析
:浏览器会发起一个 DNS 请求到 DNS 服务器,将域名解析为服务器的 IP 地址。
-
TCP 连接
:浏览器通过解析得到的 IP 地址与服务器建立 TCP 连接。这一步涉及到 TCP 的三次握手,用于确保双方都已经准备好进行数据传输了。
-
发送 HTTP 请求
:浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。
-
服务器处理请求
:服务器接收到 HTTP 请求后,根据请求的资源路径,经过后端处理,生成 HTTP 响应消息;响应消息包括状态行、响应头和响应体。
-
浏览器接收 HTTP 响应
:浏览器接收到服务器返回的 HTTP 响应数据后,开始解析响应体中的 HTML 内容;然后构建 DOM 树、解析 CSS 和 JavaScript 文件等,最终渲染页面。
-
断开连接
:TCP 四次挥手,连接结束。
我们以输入 www.baidu.com 为例:
三分恶面渣逆袭:www.baidu.com URL 到显示主页
三分恶面渣逆袭:www.baidu.com URL 到显示主页过程使用的协议
-
Java 面试指南(付费)
收录的字节跳动商业化一面的原题:url 请求的全过程(要求详细)
-
Java 面试指南(付费)
收录的字节跳动面经同学 9 飞书后端技术一面面试原题:输入 URL 会发生什么
-
Java 面试指南(付费)
收录的字节跳动面经同学 8 Java 后端实习一面面试原题:浏览器键入网址全过程
-
Java 面试指南(付费)
收录的字节跳动面经同学19番茄小说一面面试原题:键入url到页面显示的流程
-
Java 面试指南(付费)
收录的理想汽车面经同学 2 一面面试原题:输入www.baidu.com到浏览器显示出来的过程
DNS 的全称是
Domain Name System
,也就是域名解析系统,它可以将域名映射到对应的 IP 地址上,比如说我们访问 www.javabetter.cn,实际上访问的是我在阿里云上一台丐版服务器,它的 IP 地址是 xxx.xxx.xxx.xxx。
当然了,也可以通过 IP 地址直接访问服务器,但不方便记忆,所以就有了域名系统。一个好的域名可以卖好多好多钱,像 javabetter.cn 这个域名,一年需要 39 块钱。
域名到 IP 之间的映射,就需要 DNS 来完成。
二哥的 Java 进阶之路:javabetter.cn
我来说说 DNS 的解析过程吧:
三分析面渣逆袭:DNS 解析流程
假设我们在浏览器地址栏里键入了
paicoding.com
:
浏览器会首先检查自己的缓存中是否有这个域名对应的 IP 地址,如果有,直接返回;如果没有,进入下一步。
检查本地 DNS 缓存是否有该域名的记录。如果没有,向
根域名服务器
发送请求,根域名服务器将请求指向更具体的服务,如
com
顶级域名服务器。
顶级域名服务器再将请求指向权限域名服务器,通常由域名注册机构直接管理,
paicoding.com
是在阿里云上注册的,所以阿里云会提供对应的 DNS 解析服务,将域名和阿里云服务器绑定起来。
最终,浏览器使用获得的 IP 地址发起一个 HTTP 请求到目标服务器,然后该服务器返回所请求的网页内容。
-
Java 面试指南(付费)
收录的华为面经同学 6 Java 通用软件开发一面面试原题:说说 DNS 的解析过程
-
Socket 其实就是等于
IP 地址 + 端口 + 协议
。
具体来说,Socket 是一套标准,它完成了对 TCP/IP 的高度封装,屏蔽网络细节,以方便开发者更好地进行网络编程。
-
WebSocket 是一个持久化的协议,它是伴随 H5 而出的协议,用来解决
http 不支持持久化连接
的问题。
-
Socket 一个是
网编编程的标准接口
,而 WebSocket 则是应用层通信协议。
常见端口和服务
GitHub 上标星 10000+ 的开源知识库《
二哥的 Java 进阶之路
》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:
太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜
沉默王二
或扫描下方二维码关注二哥的原创公众号沉默王二,回复
222
即可免费领取。
HTTP 状态码用于表示服务器对请求的处理结果,可以分为 5 种:
-
1xx 服务器收到请求,需要进一步操作,例如 100 Continue。
-
2xx 请求成功处理,例如 200 OK。
-
3xx 重定向:需要进一步操作以完成请求;例如 304 Not Modified 表示资源未修改,客户端可以使用缓存。
-
4xx 客户端错误:请求有问题,例如 404 Not Found 表示资源不存在。
-
5xx 服务器错误,例如500 Internal Server Error 表示服务器内部错误。
三分恶面渣逆袭:常见 HTTP 状态码
-
301:永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。
-
302:临时性性移动,服务器从另外的地址响应资源,但是客户端还应该使用这个地址。
用一个比喻,301 就是嫁人的新垣结衣,302 就是有男朋友的长泽雅美。
-
Java 面试指南(付费)
收录的字节跳动面经同学 13 Java 后端二面面试原题:http 的响应号有哪些
-
Java 面试指南(付费)
收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP的状态码
HTTP 协议定义了多种请求方式,用以指示请求的目的。常见的请求方式有 GET、POST、DELETE、PUT。
三分恶面渣逆袭:HTTP 请求方式
-
GET:请求检索指定的资源。应该只用于获取数据,并且是幂等的,即多次执行相同的 GET 请求应该返回相同的结果,并且不会改变资源的状态。
-
POST:向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。数据被包含在请求体中。可能会创建新的资源或修改现有资源。
-
DELETE:删除指定的资源。
-
PUT:用于替换指定的资源。如果指定的资源不存在,创建一个新资源。
-
HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。可以用于检查资源是否存在,验证资源的更新时间等。
-
OPTIONS:用于获取服务器支持的 HTTP 请求方法。通常用于跨域请求中的预检请求(CORS)。
-
TRACE:回显服务器收到的请求,主要用于测试或诊断。但由于安全风险(可能暴露敏感信息),很多服务器会禁用 TRACE 请求。
-
CONNECT:建立一个到目标资源的隧道(通常用于 SSL/TLS 代理),用于在客户端和服务器之间进行加密的隧道传输。
可以是可以,但是不推荐。
使用 GET 执行写操作可能导致严重的安全问题,如跨站请求伪造(CSRF)。
实际开发中,也应该杜绝使用 GET 方法执行写操作。在
技术派实战项目
中,我们会在接口上明确规定应该使用哪种请求方式。
技术派实战项目源码
客户端一旦使用错误 ❎,将会收到一个 405 Method Not Allowed 的响应。
幂等(Idempotence)是一个数学概念,用于描述某些操作的特性,即无论操作执行多少次,结果都是相同的。换句话说,幂等操作可以重复执行而不会改变系统状态。
如果一个操作是幂等的,那么对同一资源执行该操作一次和执行多次的效果相同。
在正确实现的条件下,GET、HEAD、PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
例如,
GET /pageX HTTP/1.1
幂等的。连续调用多次,客户端接收到的结果都是一样的:
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
DELETE /idX/delete HTTP/1.1
是幂等的,即便是不同请求之间接收到的状态码不一样:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1 -> Returns 404
-
Java 面试指南(付费)
收录的字节跳动面经同学 13 Java 后端二面面试原题:http 有哪些方法,http 的 get 方法可以实现写操作吗,https 传递 url 安全吗,为什么数据在浏览器中,中间人攻击是什么
-
Java 面试指南(付费)
收录的字节跳动面经同学 1 技术二面面试原题:什么是幂等?幂等方法了解哪些?
-
Java 面试指南(付费)
收录的深信服面经同学 3 Java 后端线下一面面试原题:http请求除了get post的其他所有。
三分恶面渣逆袭:Get 和 Post 区别
GET 请求主要用于获取数据,参数附加在 URL 中,存在长度限制,且容易被浏览器缓存,有安全风险;而 POST 请求用于提交数据,参数放在请求体中,适合提交大量或敏感的数据。
另外,GET 请求是幂等的,多次请求不会改变服务器状态;而 POST 请求不是幂等的,可能对服务器数据有影响。
-
Java 面试指南(付费)
收录的京东面经同学 8 面试原题:get和post请求
-
Java 面试指南(付费)
收录的字节跳动同学 17 后端技术面试原题:get和post啥区别
-
Java 面试指南(付费)
收录的虾皮面经同学 13 一面面试原题:http的get和post区别
HTTP 中的 GET 方法是通过 URL 传递数据的,但是 URL 本身其实并没有对数据的长度进行限制,真正限制 GET 长度的是浏览器。
例如 IE 浏览器对 URL 的最大限制是 2000 多个字符,大概 2kb 左右,像 Chrome、Firefox 等浏览器支持的 URL 字符数更多,其中 FireFox 中 URL 的最大长度限制是 65536 个字符,Chrome 则是 8182 个字符。
这个长度限制也不是针对数据部分,而是针对整个 URL。
HTTP 是基于 TCP/IP 协议的应用层协议,它使用 TCP 作为传输层协议,通过建立 TCP 连接来传输数据。
HTTP 遵循标准的客户端-服务器模型,客户端打开连接发出请求,然后等待服务器返回的响应。
三分恶面渣逆袭:HTTP 请求的过程和原理
-
在浏览器输入 URL 后,浏览器首先会通过 DNS 解析获取到服务器的 IP 地址,然后与服务器建立 TCP 连接。
-
TCP 连接建立后,浏览器会向服务器发送 HTTP 请求。
-
服务器收到请求后,会根据请求的信息处理请求。
-
处理完请求后,服务器会返回一个 HTTP 响应给浏览器。
-
浏览器收到响应后,会根据响应的信息渲染页面。然后,浏览器和服务器断开 TCP 连接。
客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求。
可以采取分块下载的策略。首先,通过 HEAD 请求获取文件的总大小。然后根据文件大小和线程数,将文件进行切割。每个线程负责下载一个特定范围的数据。
可以通过设置 HTTP 请求头的 Range 字段指定下载的字节区间。例如,
Range: bytes=0-1023
表示下载文件的前 1024 字节。
最后启动多线程下载。
代码片段 1:获取文件大小
URL url = new URL("https://javabetter.cn/file.zip");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
int fileSize = connection.getContentLength(); // 获取文件大小
connection.disconnect();
代码片段 2:下载文件
public void downloadChunk(String url, int start,
int end, String outputPath) {
try {
URL fileUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();
connection.setRequestProperty("Range", "bytes=" + start + "-" + end);
InputStream inputStream = connection.getInputStream();
RandomAccessFile file = new RandomAccessFile(outputPath, "rw");
file.seek(start); // 定位到文件的相应位置
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
file.write(buffer, 0, bytesRead);
file.close();
inputStream.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
代码片段 3:启动多线程下载
int numThreads = 4;
int fileSize = 100000000; // 假设文件大小为 100MB
int chunkSize = fileSize / numThreads;
String url = "https://javabetter.cn/file.zip";
String outputPath = "path/to/local/file.zip";
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
for (int i = 0; i < numThreads; i++) {
int start = i * chunkSize;
int end = (i == numThreads - 1) ? fileSize - 1 : (start + chunkSize - 1);
executor.execute(() -> downloadChunk(url, start, end, outputPath));
executor.shutdown();
PS:大家可以在本地简单测试一下。
二哥的java 进阶之路:多线程下载
只需要设置 Range 字段为
Range: bytes=0-9
即可。
-
Java 面试指南(付费)
收录的华为 OD 面经同学 1 一面面试原题:什么是 HTTP?
-
Java 面试指南(付费)
收录的招商银行面经同学 6 招银网络科技面试原题:HTTP传送请求的一次流程
-
Java 面试指南(付费)
收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP是怎么样传输数据的?如果我从网上利用多线程来下载一个数据,那是要怎么下载呢?如果我只要下载数据的前面十个字节呢?
HTTP 的报文结构分为:请求报文和响应报文。两者在结构上很相似,都包含了
起始行
、
头部
和
消息正文
。
三分恶面渣逆袭:HTTP 报文
请求报文由请求行、请求头部、空行和消息正文组成。如下所示:
GET /index.html HTTP/1.1
Host: www.javabetter.cn
Accept: text/html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
①、请求行包括请求方法、请求 URL 和 HTTP 协议的版本。例如:
GET /index.html HTTP/1.1
。
②、请求头部包含请求的附加信息,如客户端想要接收的内容类型、浏览器类型等。例如:
-
Host: www.javabetter.cn
,表示请求的主机名(域名)
-
Accept: text/html
,表示客户端可以接收的媒体类型
-
User-Agent: Mozilla/5.0
,表示客户端的浏览器类型
-
Range:用于指定请求内容的范围,如断点续传时表示请求的字节范围。
③、请求头部和消息正文之间有一个空行,表示请求头部结束。
④、消息正文是可选的,如 POST 请求中的表单数据;GET 请求中没有消息正文。
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<body>沉默王二很天真</body>