docs/src/sidebar/sanfene/network.md
2.2 万字 80 张手绘图,详解 63 道计算机网络面试高频题(让天下没有难背的八股),面渣背会这些计算机网络八股文,这次吊打面试官,我觉得稳了(手动 dog)。整理:沉默王二,戳转载链接,作者:三分恶,戳原文链接。
大家好,我是二哥呀,今天继续来给大家分享三弟的面渣逆袭!
这次带来的是计算机网络六十二问,三万字,七十图详解,大概是全网最全的计算机网络面试题。
建议大家收藏了慢慢看,秋招、春招、金九银十、金三银四冲!
计算机网络体系结构通过将复杂的网络通信分解成不同的层次,来标准化交互的过程。常见的模型包括 OSI 七层模型、TCP/IP 四层模型和五层体系结构。
OSI 是理论上的网络通信模型,TCP/IP 是实际应用层面上的网络通信模型,五层结构是为了方便理解和记忆。
OSI(Open System Interconnection)七层参考模型是一个网络架构模型,由国际标准化组织(ISO)提出,用于描述和标准化各种计算机网络的功能和过程。这七层从高到低分别是:
TCP/IP 四层模型是互联网通信的核心,定义了一系列协议和标准,确保设备间可以可靠地进行数据传输。
①、应用层(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 的实用性,同时提供了比四层模型更细致的分层,便于教学和理解网络的各个方面。
三次握手和四次挥手都是工作在传输层。传输层(Transport Layer)是 OSI 模型的第四层,负责提供端到端的通信服务,包括数据传输的建立、维护和终止。
TCP 作为一种面向连接的协议,通过三次握手建立连接,通过四次挥手终止连接,确保数据传输的可靠性和完整性。
计算机网络是指将多台计算机通过通信设备互联起来,实现资源共享和信息传递的系统。
- Java 面试指南(付费)收录的华为 OD 面经同学 1 一面面试原题:说一些 OSI 七层参考模型
- Java 面试指南(付费)收录的京东面经同学 2 后端面试原题:TCP三次握手四次挥手工作在哪一层?
- Java 面试指南(付费)收录的京东面经同学 5 Java 后端技术一面面试原题:让自己讲一下网络
一张表格总结常见网络协议:
对于发送方而言,从上层到下层层层包装,对于接收方而言,从下层到上层,层层解开包装。
这个过程类似写信,写一封信,每到一层,就加一个信封,写一些地址的信息。到了目的地之后,又一层层解封,传向下一个目的地。
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众���沉默王二,回复 222 即可免费领取。
这个过程包括多个步骤,涵盖了 DNS 解析、TCP 连接、发送 HTTP 请求、服务器处理请求并返回 HTTP 响应、浏览器处理响应并渲染页面等多个环节。
我们以输入 www.baidu.com 为例:
- 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 来完成。
我来说说 DNS 的解析过程吧:
假设我们在浏览器地址栏里键入了 paicoding.com:
浏览器会首先检查自己的缓存中是否有这个域名对应的 IP 地址,如果有,直接返回;如果没有,进入下一步。
检查本地 DNS 缓存是否有该域名的记录。如果没有,向根域名服务器发送请求,根域名服务器将请求指向更具体的服务,如 com 顶级域名服务器。
顶级域名服务器再将请求指向权限域名服务器,通常由域名注册机构直接管理,paicoding.com是在阿里云上注册的,所以阿里云会提供对应的 DNS 解析服务,将域名和阿里云服务器绑定起来。
最终,浏览器使用获得的 IP 地址发起一个 HTTP 请求到目标服务器,然后该服务器返回所请求的网页内容。
- Java 面试指南(付费)收录的华为面经同学 6 Java 通用软件开发一面面试原题:说说 DNS 的解析过程
具体来说,Socket 是一套标准,它完成了对 TCP/IP 的高度封装,屏蔽网络细节,以方便开发者更好地进行网络编程。
2024 年 12 月 25 日新增
我平常使用最多的就是 chrome 浏览器自带的 network 面板了,可以看到请求的时间、请求的信息,以及响应信息。
更专业的还有 fidder、wireshark 等工具。
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:平时,你是用什么来抓包呢。
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。
HTTP 状态码用于表示服务器对请求的处理结果,可以分为 5 种:
用一个比喻,301 就是嫁人的新垣结衣,302 就是有男朋友的长泽雅美。
- Java 面试指南(付费)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 的响应号有哪些
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP的状态码
HTTP 协议定义了多种请求方式,用以指示请求的目的。常见的请求方式有 GET、POST、DELETE、PUT。
可以是可以,但是不推荐。
使用 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 请求主要用于获取数据,参数附加在 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 遵循标准的客户端-服务器模型,客户端打开连接发出请求,然后等待服务器返回的响应。
客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求。
可以采取分块下载的策略。首先,通过 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:大家可以在本地简单测试一下。
只需要设置 Range 字段为 Range: bytes=0-9 即可。
- Java 面试指南(付费)收录的华为 OD 面经同学 1 一面面试原题:什么是 HTTP?
- Java 面试指南(付费)收录的招商银行面经同学 6 招银网络科技面试原题:HTTP传送请求的一次流程
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题: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,表示客户端的浏览器类型③、请求头部和消息正文之间有一个空行,表示请求头部结束。
④、消息正文是可选的,如 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
<html>
<body>沉默王二很天真</body>
</html>
①、状态行
包括 HTTP 协议的版本、状态码(如 200、404)和状态消息(如 OK、NotFound)。例如: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,表示服务器类型③、空行
表示响应头部结束。
④、消息正文(可选)
响应的具体内容,如 HTML 页面。不是所有的响应都有消息正文,如 204 No Content 状态码的响应。
- Java 面试指南(付费)收录的比亚迪面经同学 3 Java 技术一面面试原题:说一下 HTTP 的结构和 HTTPS 的原理
- Java 面试指南(付费)收录的 小公司面经合集好未来测开面经同学 3 测开一面面试原题:HTTP 请求消息和响应消息的格式
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP常见的请求头部有些什么呢?【面试官应该是想引导我考虑到Range头,可惜没了解过捏】
它们的主要区别在于,URL 除了提供了资源的标识,还提供了资源访问的方式。这么比喻,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人——人类住址协议://地球/中国/北京市/海淀区/xx 职业技术学院/14 号宿舍楼/525 号寝/张三.男。
HTTP1.0 默认是短连接,HTTP 1.1 默认是长连接,HTTP 2.0 采用的多路复用。
Connection: keep-alive 强制开启长连接。
- Java 面试指南(付费)收录的腾讯面经同学 23 QQ 后台技术一面面试原题:HTTP 1 和 2 的区别
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:http2.0和http1.0区别
HTTP/2.0 基于 TCP 协议,而 HTTP/3.0 则基于 QUIC 协议,Quick UDP Connections,直译为快速 UDP 网络连接。
基于 TCP 的 HTTP/2.0,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输的过程中,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,仍然会阻塞在它之后传输的流数据。
而基于 UDP 的 QUIC 协议可以更彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰。
同时,QUIC 协议在传输的过程中就完成了 TLS 加密握手,更直接了。
应该是 HTTP/2,在 2022 年 1 月达到峰值,占所有网站的 46.9%。
统计网站:w3techs
- Java 面试指南(付费)收录的华为面经同学 8 技术二面面试原题:HTTP 2.0 和 3.0 的区别
- Java 面试指南(付费)收录的字节跳动面经同学 1 技术二面面试原题:目前使用最广泛的是哪个HTTP版本?
在 HTTP 中,长连接是指客户端和服务器之间在一次 HTTP 通信完成后,不会立即断开,而是保留连接以供后续请求复用。
这种机制可以减少了频繁建立和关闭连接的开销
可以通过 Connection: keep-alive 实现。在 HTTP/1.1 中,长连接是默认开启的。
1. tcp_keepalive_intvl = 15
2. tcp_keepalive_probes = 5
3. tcp_keepalive_time = 1800
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP怎么保持长连接呢?
HTTPS 是 HTTP 的增强版,在 HTTP 的基础上加入了 SSL/TLS 协议,确保数据在传输过程中是加密的。
HTTP 的默认端⼝号是 80,URL 以http://开头;HTTPS 的默认端⼝号是 443,URL 以https://开头。
- Java 面试指南(付费)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 和 https 的区别,https 是怎么建立连接,https 是对称还是非对称加密
- Java 面试指南(付费)收录的 小公司面经合集好未来测开面经同学 3 测开一面面试原题:说说 HTTP和 HTTPS 的区别
- Java 面试指南(付费)收录的字节跳动面经同学19番茄小说一面面试原题:https与http的区别,加密的实现
- Java 面试指南(付费)收录的得物面经同学 9 面试题目原题:介绍一下http和https的区别?为什么https安全?
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:http 和Https 有啥区别呢?https 安全在哪里
memo:2025 年 9 月 03 日修改至此,今天有球友发私信说拿到了京东的正式批 offer,并且业务看上去很核心,那真的要恭喜🎉啊,你付出多少就会有多少的收获,在没有开花结果之前,就是要坚持,鼓励自己。
HTTP 是明文传输的,存在数据窃听、数据篡改和身份伪造等问题。而 HTTPS 通过引入 SSL/TLS,解决了这些问题。
SSL/TLS 在加密过程中涉及到了两种类型的加密方法:
客户端会通过数字证书来验证服务器的身份,数字证书由 CA 签发,包含了服务器的公钥、证书的颁发机构、证书的有效期等。
- Java 面试指南(付费)收录的比亚迪面经同学 3 Java 技术一面面试原题:说一下 HTTP 的结构和 HTTPS 的原理
- Java 面试指南(付费)收录的的腾讯面经同学 26 暑期实习微信支付面试原题:https的加密技术
- Java 面试指南(付费)收录的美团面经同学 3 Java 后端技术一面面试原题:https相比http有什么区别 对称加密和非对称加密 ca证书验证
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTPS是什么?他解决了HTTP什么问题?
- Java 面试指南(付费)收录的虾皮面经同学 13 一面面试原题:https使用过吗 怎么保证安全
HTTPS 的连接建立在 SSL/TLS 握手之上,其过程可以分为两个阶段:握手阶段和数据传输阶段。
①、客户端向服务器发起请求
②、服务器接收到请求后,返回自己的数字证书,包含了公钥、颁发机构等信息。
③、客户端收到服务器的证书后,验证证书的合法性,如果合法,会生成一个随机码,然后用服务器的公钥加密这个随机码,发送给服务器。
④、服务器收到会话密钥后,用私钥解密,得到会话密钥。
⑤、客户端和服务器通过会话密码对通信内容进行加密,然后传输。
如果通信内容被截取,但由于没有会话密钥,所以无法解密。当通信结束后,连接会被关闭,会话密钥也会被销毁,下次通信会重新生成一个会话密钥。
HTTPS 通过 SSL/TLS 协议确保了客户端与服务器之间交换的数据被加密,这包括 HTTP 头部和正文。
而 URL 是 HTTP 头部的一部分,因此这部分信息也是加密的。
但因为涉及到 SSL 握手的过程,所以域名信息会被暴露出来,需要注意。
另外,完整的 URL 可能在 Web 服务器的日志中记录,这些日志可能是明文的。还有,URL 在浏览器历史记录中也是可见的。
因此,敏感信息永远不应该通过 URL 传递,即使是在使用 HTTPS 的情况下。
中间人攻击(Man-in-the-Middle, MITM)是一种常见的网络安全威胁,攻击者可以在通信的两端插入自己,以窃取通信双方的信息。
在很多电影中,都会存在这样的场景:主角通过某种方式,将自己伪装成中间人,然后窃取通信双方的信息,阿汤哥的碟中谍中就有很多类似的手笔。
中间人攻击是一个缺乏相互认证的攻击,因此大多数加密协议都会专门加入一些特殊的认证方法,以防止中间人攻击。像 SSL 协议,就是通过验证服务器的数字证书,是否由 CA(权威的受信任的数字证书认证机构)签发,来防止中间人攻击的。
主要通过 SSL/TLS 协议的多层次安全机制,首先在握手阶段,客户端和服务器使用得是非对称加密,生成的会话密钥只有服务器的私钥才能解密,而私钥只有服务器持有。
在数据传输阶段,即使攻击者拦截了通信数据,没有会话密钥也无法解密。
可以,HTTPS 可以抓包,但因为通信内容是加密的,需要解密后才能查看。
其原理是通过一个中间人,伪造服务器证书,并取得客户端的信任,然后将客户端的请求转发给服务器,将服务器的响应转发给客户端,完成中间人攻击。
常用的抓包工具有 Wireshark、Fiddler、Charles 等。
- Java 面试指南(付费)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 和 https 的区别,https 是怎么建立连接,https 是对称还是非对称加密
- Java 面试指南(付费)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 有哪些方法,http 的 get 方法可以实现写操作吗,https 传递 url 安全吗,为什么数据在浏览器中,中间人攻击是什么
- Java 面试指南(付费)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTPS怎么建立连接的?HTTPS怎么保证建立的信道是安全的?
- Java 面试指南(付费)收录的虾皮面经同学 13 一面面试原题:https能不能抓包
memo:2025 年 9 月 20 日修改至此,今天有球友发喜报说拿到了美的的 offer,虽然不是大厂,但他自己感觉很开心,并且特意感谢了我对他的鼓励。有了保底也可以无所畏惧的继续向前冲了。
推荐阅读:HTTPS 握手过程中,客户端如何验证证书的合法性
首先,所有的证书都是由 CA 机构签发的,CA 机构是一个受信任的第三方机构,它会对证书的申请者进行身份验证,然后签发证书。
CA 就像是网络世界的公安局,具有极高的可信度。
CA 签发证书的过程是非常严格的:
客户端(通常是浏览器,通常会集成 CA 的公钥信息)在校验证书的合法性时,主要通过以下步骤来校验证书的合法性。
假如在 HTTPS 的通信过程中,中间人篡改了证书,但由于他没有 CA 机构的私钥,所以无法生成正确的 Signature,因此就无法通过校验。
如果客户端不支持服务器建议的任何加密算法,那么安全连接将建立失败。
当客户端向服务器发起一个 HTTPS 请求时,它会发送一个 ClientHello 消息。
这个消息包含了客户端支持的加密算法列表(称为密码套件),以及其他一些参数。
服务器收到 ClientHello 后,会从客户端提供的密码套件中选择一个它也支持的密码套件,并在 ServerHello 消息中返回给客户端。
如果服务器无法找到一个双方都支持的密码套件,那么它会发送一个警告消息,表示无法协商出一个共同的加密算法,随后连接将被终止。
- Java 面试指南(付费)收录的得物面经同学 1 面试原题:HTTPS,中间人伪造证书怎么办,伪造证书机构
- Java 面试指南(付费)收录的字节跳动面经同学 34 Java 后端一面面试原题:客户端怎么检验ca证书的合法性
HTTP 协议是无状态的,这意味着每个 HTTP 请求都是独立的,服务器不会保留任何关于客户端请求的历史信息。
换句话说,我家大门常打开,是人是神都欢迎,我不在乎,只要给钱,哦不,按规矩,一切好办。
由于 HTTP 是无状态的,像用户的购物车状态就必须通过其他方式来保持,如在每次请求中传递用户的 ID,或者使用 Cookie 在客户端保存购物车状态。
- Java 面试指南(付费)收录的字节跳动面经同学 8 Java 后端实习一面面试原题:http为什么是无状态的
先来看看什么是 Session 和 Cookie :
Session 和 Cookie 到底有什么不同呢?
Session 和 Cookie 有什么关联呢?
可以使用 Cookie 记录 Session 的标识。
分布式环境下 Session 怎么处理呢?
分布式环境下,客户端请求经过负载均衡,可能会分配到不同的服务器上,假如一个用户的请求两次没有落到同一台服务器上,那么在新的服务器上就没有记录用户状态的 Session。
这时候怎么办呢?
可以使用 Redis 等分布式缓存来存储 Session,在多台服务器之间共享。
客户端无法使用 Cookie 怎么办?
有可能客户端无法使用 Cookie,比如浏览器禁用 Cookie,或者客户端是安卓、IOS 等等。
这时候怎么办?SessionID 怎么存?怎么传给服务端呢?
首先是 SessionID 的存储,可以使用客户端的本地存储,比如浏览器的 sessionStorage。
接下来怎么传呢?
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。
TCP(传输控制协议)的三次握手机制是一种用于在两个 TCP 主机之间建立一个可靠连接的过程。这个机制确保了两端的通信是同步的,并且在数据传输开始前,双方都准备好了进行通信。
①、第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN)
②、第二次握手:SYN + ACK
③、第三次握手:ACK
用大白话讲 TCP 三次握手就是:
三十年前的农村,电话还没有普及,所以,通信基本靠吼。
老张和老王是邻居,这天老张下地了,结果家里有事,热心的邻居老王赶紧跑到村口,开始叫唤老王。
"你老婆要生了,赶紧回去吧!"
老张风风火火地赶回家,老婆顺利地生了个带把的大胖小子。握手的故事充满了幸福和美满。
当然可以,你(客户端)在一个拥挤的聚会上遇到了你想交谈的美女(服务器)。因为周围很吵,你们需要确认对方都准备好交流,并清楚地听到对方说的每一句话。
①、第一次握手:打招呼
x,也就是你们交谈的起点)②、第二次握手:对方回应
y,并确认了你的微信号x+1,表示它准备好了)③、第三次握手:确认准备就绪
y+1)④、聊天开始
这时候,你们两个就确认彼此都准备好深入交流了,可以开始你们的对话了。
SYN 是 TCP 协议中用来建立连接的一个标志位,全称为 Synchronize Sequence Numbers,也就是同步序列编号。
SYN 不仅确保了序列号的同步,使得后续的数据能够有序传输,还能防止旧的报文段被误认为是新连接。
- Java 面试指南(付费)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:TCP 为什么要三次握手
- Java 面试指南(付费)收录的TP联洲同学 5 Java 后端一面的原题:Tcp三次握手,Syn的概念
使用三次握手可以建立一个可靠的连接。这一过程的目的是确保双方都知道对方已准备好进行通信,并同步双方的序列号,从而保持数据包的顺序和完整性。
---面试中可以不背,但需要理解 start---
要知道,网络传输是有延时的(要通过网络光纤、WIFI、卫星信号传输等)。
假如说客户端发起了 SYN=1 的第一次握手。服务器也及时回复了 SYN=2 和 ACK=1 的第二次握手,但是这个 ACK=1 的确认报文段因为某些原因在传输过程中丢失了。
如果没有第三次握手告诉服务器,客户端收到了服务器的回应,那服务器是不知道客户端有没有接收到的。
于是服务器就一直干巴巴地开着端口在等着客户端发消息呢,但其实客户端并没有收到服务器的回应,心灰意冷地跑了。
这就好像你找美女要联系方式了,人家回你了,你却没听见,还以为人家看不上你,赌气地跑了;剩下的美女却一直在等你。。。
还有一种情况是,一个旧的、延迟的连接请求(SYN=1)被服务器接受,导致服务器错误地开启一个不再需要的连接。
举个例子:假设你(客户端)给你的朋友(服务器)发送了一个邮件(连接请求)。因为某些原因,这封邮件迟迟没有到达朋友那里,可能是因为邮局的延误。于是你决定再发一封新的邮件。朋友收到了第二封邮件,你们成功地建立了连接并开始通信。
但是,过了很久,那封延误的旧邮件突然也到了你朋友那里。如果没有一种机制来识别和处理这种延误的邮件,你的朋友可能会以为这是一个新的连接请求,并尝试响应它,但其实你已经重新发了请求,原来的不需要了。这就导致了不必要的混乱和资源浪费。
---面试中可以不背,但需要理解 end---
三次握手已经足够创建可靠的连接了,没有必要再多一次握手。
泛洪攻击(SYN Flood Attack)是一种常见的 DoS(拒绝服务)攻击,攻击者会发送大量的伪造的 TCP 连接请求,导致服务器资源耗尽,无法处理正常的连接请求。
半连接服务拒绝,也称为 SYN 洪泛攻击或 SYN Flood。
所谓的半连接就是指在 TCP 的三次握手过程中,当服务器接收到来自客户端的第一个 SYN 包后,它会回复一个 SYN-ACK 包,此时连接处于“半开”状态,因为连接的建立还需要客户端发送最后一个 ACK 包。
在收到最后的 ACK 包之前,服务器会为这个尚未完成的连接分配一定的资源,并在它的队列中保留这个连接的位置。
如果重新设计 TCP 的连接建立过程,可以考虑引入 SYN cookies,这种技术通过在 SYN-ACK 响应中编码连接信息,从而在不占用大量资源的情况下验证客户端。
- Java 面试指南(付费)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:TCP 为什么要三次握手
- Java 面试指南(付费)收录的美团同学 2 优选物流调度技术 2 面面试原题:为什么三次握手,有什么缺点,洪泛攻击,半连接服务拒绝,让你重新设计,怎么设计
服务端不会进行任何的动作,而客户端由于一段时间内没有收到服务端发来的确认报文,等待一段时间后会重新发送 SYN 报文,如果仍然没有回应,会重复这个过程,直到发送次数超过最大重传次数限制,就会返回连接建立失败。
客户端会继续重传,直到次数限制;而服务端此时会阻塞在 accept()处,等待客户端发送 ACK 报文
服务端同样会采用类似客户端的超时重传机制,如果重试次数超过限制,则 accept()调用返回-1,服务端建立连接失败;而此时客户端认为自己已经建立连接成功,因此开始向服务端发送数据,但是服务端的 accept()系统调用已经返回,此时不在监听状态,因此服务端接收到客户端发送来的数据时会发送 RST 报文给客户端,消除客户端单方面建立连接的状态。
ACK 是为了告诉客户端传来的数据已经接收无误。
而传回 SYN 是为了告诉客户端,服务端响应的确实是客户端发送的报文。
第 3 次握手是可以携带数据的。
此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,它已经建立连接成功,并且确认服务端的接收和发送能力是正常的。
第一次握手不能携带数据是出于安全的考虑,因为如果允许携带数据,攻击者每次在 SYN 报文中携带大量数据,就会导致服务端消耗更多的时间和空间去处理这些报文,会造成 CPU 和内存的消耗。
TCP 半连接指的是在 TCP 三次握手过程中,服务器接收到了客户端的 SYN 包,但还没有完成第三次握手,此时的连接处于一种未完全建立的状态。
如果服务器回复了 SYN-ACK,但客户端还没有回复 ACK,该连接将一直保留在半连接队列中,直到超时或被拒绝。
TCP 进入三次握手前,服务端会从 CLOSED 状态变为 LISTEN 状态, 同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。
顾名思义,半连接队列存放的是三次握手未完成的连接,全连接队列存放的是完成三次握手的连接。
SYN Flood 是一种典型的 DDos 攻击,它在短时间内,伪造不存在的 IP 地址, 向服务器发送大量 SYN 报文。当服务器回复 SYN+ACK 报文后,不会收到 ACK 回应报文,那么 SYN 队列里的连接旧不会出对队,久⽽久之就会占满服务端的 SYN 接收队列(半连接队列),使得服务器不能为正常⽤户服务。
主要有 syn cookie 和 SYN Proxy 防火墙等。
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:tcp半连接是什么样一个状态?
TCP 连接的断开过程被形象地概括为四次挥手。
第一次挥手:客户端向服务器发送一个 FIN 结束报文,表示客户端没有数据要发送了,但仍然可以接收数据。客户端进入 FIN-WAIT-1 状态。
第二次挥手:服务器接收到 FIN 报文后,向客户端发送一个 ACK 报文,确认已接收到客户端的 FIN 请求。服务器进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
第三次挥手:服务器向客户端发送一个 FIN 报文,表示服务器也没有数据要发送了。服务器进入 LAST-ACK 状态。
第四次挥手:客户端接收到 FIN 报文后,向服务器发送一个 ACK 报文,确认已接收到服务器的 FIN 请求。客户端进入 TIME-WAIT 状态,等待一段时间以确保服务器接收到 ACK 报文。服务器接收到 ACK 报文后进入 CLOSED 状态。客户端在等待一段时间后也进入 CLOSED 状态。
大白话说四次挥手:
假如单身狗博主有一个女朋友—由于博主上班九九六,下班肝博客,导致没有时间陪女朋友,女朋友忍无可忍。
沙雕博主小心翼翼地装起了自己的青轴机械键盘。
挥手的故事总充满了悲伤和遗憾!
- Java 面试指南(付费)收录的腾讯同学 25 后端开发实习一面面试原题:TCP和UDP,TCP连接和断开过程
- Java 面试指南(付费)收录的字节跳动面经同学19番茄小说一面面试原题:TCP断开连接过程
因为 TCP 是全双工通信协议,数据的发送和接收需要两次一来一回,也就是四次,来确保双方都能正确关闭连接。
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:tcp 的挥手为什么是四次,而不是三次呢?
- Java 面试指南(付费)收录的字节跳动面经同学34一面面试原题:tcp握手为什么是3次,挥手为什么是4次
memo:2025 年 9 月 04 日修改至此,今天有球友在星球里提问说拿到了科大讯飞和长鑫存储的 offer,长鑫直接给开奖了,真的速度。
为什么需要等待?
1. 为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。 这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的服务端就收不到对已发送的 FIN + ACK 报文段的确认。服务端会超时重传这个 FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动 2MSL 计时器。最后,客户端和服务器都正常进入到 CLOSED 状态。
2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持��的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。
为什么等待的时间是 2MSL?
MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。
TIME_WAIT 等待 2 倍的 MSL,⽐较合理的解释是:⽹络中可能存在来⾃发送⽅的数据包,当这些发送⽅的数据包被接收⽅处理后⼜会向对⽅发送响应,所以⼀来⼀回需要等待 2 倍的时间。
⽐如如果被动关闭⽅没有收到断开连接的最后的 ACK 报⽂,就会触发超时重发 Fin 报⽂,另⼀⽅接收到 FIN 后,会重发 ACK 给被动关闭⽅, ⼀来⼀去正好 2 个 MSL。
除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。
设想这样的场景:客户已主动与服务器建立了 TCP 连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。
服务器每收到一次客户端的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75 秒钟发送一次。若连续发送 10 个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。
服务端收到客户端关闭连接的请求并确认之后,就会进入 CLOSE-WAIT 状态。此时服务端可能还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务端在关闭连接之前将待发送的数据处理完。
TIME-WAIT 发生在第四次挥手,当客户端在发送 ACK 确认对方的 FIN 报文后,会进入 TIME_WAIT 状态。
它存在的意义主要有两个:
补充:MSL(Maximum Segment Lifetime):TCP 报文段在网络中的最大存活时间,通常为 30 秒到 2 分钟
- Java 面试指南(付费)收录的字节跳动面经同学19番茄小说一面面试原题:TIME_WAIT
- Java 面试指南(付费)收录的腾讯面经同学 29 Java 后端一面原题:讲下TCP的TIME_WAIT
TIME_WAIT 状态过多会导致什么问题?
如果服务器有处于 TIME-WAIT 状态的 TCP,则说明是由服务器⽅主动发起的断开请求。
过多的 TIME-WAIT 状态主要的危害有两种:
第⼀是内存资源占⽤;
第⼆是对端⼝资源的占⽤,⼀个 TCP 连接⾄少消耗⼀个本地端⼝;
怎么解决 TIME_WAIT 状态过多?
一个 TCP 报文段主要由报文段头部(Header)和数据两部分组成。头部包含了确保数据可靠传输所需的各种控制信息,比如说序列号、确认号、窗口大小等。
- Java 面试指南(付费)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:TCP 报文的结构
TCP 首先通过三次握手和四次挥手来保证连接的可靠性,然后通过校验和、序列号、确认应答、超时重传、滑动窗口等机制来保证数据的可靠传输。
推荐阅读:TCP 校验和计算方法
①、校验和:TCP 报文段包括一个校验和字段,用于检测报文段在传输过程中的变化。如果接收方检测到校验和错误,就会丢弃这个报文段。
②、序列号/确认机制:TCP 将数据分成多个小段,每段数据都有唯一的序列号,以确保数据包的顺序传输和完整性。同时,发送方如果没有收到接收方的确认应答,会重传数据。
③、流量控制:接收方会发送窗口大小告诉发送方它的接收能力。发送方会根据窗口大小调整发送速度,避免网络拥塞。
④、超时重传:如果发送方发送的数据包超过了最大生存时间,接收方还没有收到,发送方会重传数据包以保证丢失数据重新传输。
⑤、拥塞控制:TCP 会采用慢启动的策略,一开始发的少,然后逐步增加,当检测到网络拥塞时,会降低发送速率。在网络拥塞缓解后,传输速率也会自动恢复。
- Java 面试指南(付费)收录的虾皮面经同学 13 一面面试原题:tcp为什么是可靠的
- Java 面试指南(付费)收录的同学 30 腾讯音乐面试原题:那个Tcp 是如何保证这个安全传输的呢?
TCP 提供了一种机制,可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流量控制。
TCP 通过滑动窗口来控制流量,我们看下简要流程:
SND.NXT会右移 200 个字节,也就是说当前的可用窗口减少了 200 个字节。TCP 发送一个数据,如果需要收到确认应答,才会发送下一个数据。这样的话就会有个缺点:效率会比较低。
“用一个比喻,我们在微信上聊天,你打完一句话,我回复一句之后,你才能打下一句。假如我没有及时回复呢?你是把话憋着不说吗?然后傻傻等到我回复之后再接着发下一句?”
为了解决这个问题,TCP 引入了窗口,它是操作系统开辟的一个缓存空间。窗口大小值表示无需等待确认应答,而可以继续发送数据的最大值。
TCP 头部有个字段叫 win,也即那个 16 位的窗口大小,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度,从而达到流量控制的目的。
“通俗点讲,就是接受方每次收到数据包,在发送确认报文的时候,同时告诉发送方,自己的缓存区还有多少空余空间,缓冲区的空余空间,我们就称之为接受窗口大小。这就是 win。”
TCP 滑动窗口分为两种: 发送窗口和接收窗口。发送端的滑动窗口包含四大部分,如下:
接收方的滑动窗口包含三大部分,如下:
Nagle 算法和延迟确认是干什么的?
当我们 TCP 报⽂的承载的数据⾮常⼩的时候,例如⼏个字节,那么整个⽹络的效率是很低的,因为每个 TCP 报⽂中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,⽽数据只有⼏个字节,所以在整个报⽂中有效数据占有的比例就会⾮常低。
这就好像快递员开着⼤货⻋送⼀个⼩包裹⼀样浪费。
那么就出现了常⻅的两种策略,来减少⼩报⽂的传输,分别是:
Nagle 算法
Nagle 算法:任意时刻,最多只能有一个未被确认的小段。所谓 “小段”,指的是小于 MSS 尺寸的数据块,所谓 “未被确认”,是指一个数据块发送出去后,没有收到对方发送的 ACK 确认该数据已收到。
Nagle 算法的策略:
只要没满⾜上⾯条件中的⼀条,发送⽅⼀直在囤积数据,直到满⾜上⾯的发送条件。
延迟确认
事实上当没有携带数据的 ACK,它的⽹络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报⽂。
为了解决 ACK 传输效率低问题,所以就衍⽣出了 TCP 延迟确认。
TCP 延迟确认的策略:
一般情况下,Nagle 算法和延迟确认不能一起使用,Nagle 算法意味着延迟发,延迟确认意味着延迟接收,两个凑在一起就会造成更大的延迟,会产生性能问题。
流量控制是为了避免发送⽅的数据填满接收⽅的缓存,但并不能控制整个⽹络。
⼀般来说,计算机⽹络会处在⼀个共享的环境。因此也有可能会因为其他主机之间的通信使得⽹络拥堵。
当⽹络出现拥堵时,如果继续发送⼤量数据包,可能会导致数据包延时、丢失等,这时 TCP 就会重传数据,但重传会增加⽹络负担,于是会导致更⼤的延迟以及更多的丢包,就进⼊了恶性循环....
所以,TCP 被设计成了⼀个非常⽆私的协议,当⽹络发送拥塞时,TCP 会⾃我牺牲,降低发送的数据流。
拥塞控制的⽬的就是避免发送⽅的数据填满整个⽹络。
就像是一个水管,不能让太多的水(数据流)流入水管,如果超过水管的承受能力,水管会被撑爆(丢包)。
发送方会维护一个拥塞窗口 cwnd 的变量,调节所要发送数据的量。
拥塞窗⼝ cwnd是发送⽅维护的⼀个的状态变量,它会根据⽹络的拥塞程度动态变化的。
发送窗⼝ swnd 和接收窗⼝ rwnd 是约等于的关系,那么由于加⼊了拥塞窗⼝的概念后,此时发送窗⼝的值是 swnd = min(cwnd, rwnd),也就是拥塞窗⼝和接收窗⼝中的最⼩值。
拥塞窗⼝ cwnd 变化的规则:
拥塞控制主要有这几种常用算法:
①、慢启动算法
慢启动算法,慢慢启动。
它表示 TCP 建立连接完成后,一开始不要发送大量的数据,而是先探测一下网络的拥塞程度。由小到大逐渐增加拥塞窗口的大小,如果没有出现丢包,每收到一个 ACK,就将拥塞窗口 cwnd 大小就加 1(单位是 MSS)。每轮次发送窗口增加一倍,呈指数增长,如果出现丢包,拥塞窗口就减半,进入拥塞避免阶段。
举个例子:
发包的个数是指数性的增⻓。
为了防止 cwnd 增长过大引起网络拥塞,还需设置一个慢启动阀值 ssthresh(slow start threshold)状态变量。当cwnd到达该阀值后,就好像水管被关小了水龙头一样,减少拥塞状态。即当 cwnd >ssthresh 时,进入了拥塞避免算法。
②、拥塞避免算法
一般来说,慢启动阀值 ssthresh 是 65535 字节,cwnd到达慢启动阀值后
显然这是一个线性上升的算法,避免过快导致网络拥塞问题。
接着上面慢启动的例子,假定 ssthresh 为 8 ::
③、拥塞发生
当网络拥塞发生丢包时,会有两种情况:
如果是发生了 RTO 超时重传,就会使用拥塞发生算法
这种方式就像是飙车的时候急刹车,还飞速倒车,这。。。
其实还有更好的处理方式,就是快速重传。发送方收到 3 个连续重复的 ACK 时,就会快速地重传,不必等待 RTO 超时再重传。
发⽣快速重传的拥塞发⽣算法:
④、快速恢复
快速重传和快速恢复算法一般同时使用。快速恢复算法认为,还有 3 个重复 ACK 收到,说明网络也没那么糟糕,所以没有必要像 RTO 超时那么强烈。
正如前面所说,进入快速恢复之前,cwnd 和 sshthresh 已被更新:
然后,进⼊快速恢复算法如下:
- Java 面试指南(付费)收录的京东面经同学 5 Java 后端技术一面面试原题:tcp拥塞控制
超时重传机制是 TCP 的核心之一,它能确保在网络传输中如果某些数据包丢失或没有及时到达的话,TCP 能够重新发送这些数据包,以保证数据完整性。
其原理是在发送某个数据后开启一个计时器,如果在一定时间内没有得到发送数据报的 ACK 报文,就重新发送数据,直到发送成功为止。
重传包括超时重传、快速重传、带选择确认的重传(SACK)和重复 SACK 四种。
TCP 中的重传超时时间(RTO,Retransmission Timeout)不是一个固定的值,而是动态计算的,目的是为了适应不同的网络条件。
RTO 有个标准方法的计算公式,叫 Jacobson / Karels 算法。
①、计算 SRTT(Smoothed RTT,平滑往返时间),以避免单次测量中的抖动影响重传时间。
SRTT = (1 - α) * SRTT + α * RTT
其中,α 是一个常量,通常取值为 0.125(即1/8),表示新测量值对平滑RTT的影响比例。
RTT,也就是 Round-Trip Time,往返时间,即数据包从发送到接收到确认的时间。TCP 会对每个数据包的 RTT 进行测量,并不断更新这个值。
②、计算 RTTVAR (RTT Variation,表示RTT的变化量,用于衡量RTT的波动)
RTTVAR = (1 - β) * RTTVAR + β * (|RTT - SRTT|)
β 通常取值为 0.25(即1/4),表示对RTTVAR更新的权重。
③、最后,得出最终的 RTO
RTO = SRTT + max(G, 4 x RTTVAR)
G 是一个小的常量偏移量,用来防止RTO过小。一般来说,G 的值通常是1毫秒。
一般来说,RTO 略微大于 RTT,效果是最佳的。
超时重传不是十分完美的重传方案,它有这些缺点:
TCP 还有另外⼀种快速重传(Fast Retransmit)机制,它不以时间为驱动,⽽是以数据驱动重传。
它不以时间驱动,而是以数据驱动。它是基于接收端的反馈信息来引发重传的。
可以用它来解决超时重发的时间等待问题,快速重传流程如下:
在上图,发送⽅发出了 1,2,3,4,5 份数据:
快速重传机制只解决了⼀个问题,就是超时时间的问题,但是它依然⾯临着另外⼀个问题。就是重传的时候,是重传之前的⼀个,还是重传所有的问题。
⽐如对于上⾯的例⼦,是重传 Seq2 呢?还是重传 Seq2、Seq3、Seq4、Seq5 呢?因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。
根据 TCP 不同的实现,以上两种情况都是有可能的。可⻅,这是⼀把双刃剑。
为了解决不知道该重传哪些 TCP 报⽂,于是就有 SACK ⽅法。
为了解决应该重传多少个包的问题? TCP 提供了带选择确认的重传(即 SACK,Selective Acknowledgment)。
SACK 机制就是,在快速重传的基础上,接收方返回最近收到报文段的序列号范围,这样发送方就知道接收方哪些数据包是没收到的。这样就很清楚应该重传哪些数据包。
如上图中,发送⽅收到了三次同样的 ACK 确认报⽂,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进⾏重发。
D-SACK,英文是 Duplicate SACK,是在 SACK 的基础上做了一些扩展,主要用来告诉发送方,有哪些数据包,自己重复接受了。
DSACK 的目的是帮助发送方判断,是否发生了包失序、ACK 丢失、包重复或伪重传。让 TCP 可以更好的做网络流控。
例如 ACK 丢包导致的数据包重复:
3499)
- 二哥编程星球球友枕云眠美团 AI 面试原题:解释一下TCP的超时重传机制
TCP 的粘包和拆包更多的是业务上的概念!
什么是 TCP 粘包和拆包?
TCP 是面向流,没有界限的一串数据。TCP 底层并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。
为什么会产生粘包和拆包呢?
那怎么解决呢?
2024年05月24日新增
一个 TCP 连接可以发送多少次 HTTP 请求,取决于 HTTP 协议的版本。
在 HTTP/1.0 中,每个 HTTP 请求-响应使用一个单独的 TCP 连接。这意味着每次发送 HTTP 请求都需要建立一个新的 TCP 连接。
HTTP/1.1 引入了持久连接(Persistent Connection),默认情况下允许在一个 TCP 连接上发送多个 HTTP 请求。
通过使用 Connection: keep-alive 头部实现,保持连接打开状态,直到明确关闭为止。这极大地提高了效率,因为无需为每个请求都建立新的连接。
此外,HTTP/1.1 支持请求管道化(Pipelining),允许客户端在收到前一个响应之前发送多个请求。
HTTP/2 进一步优化了连接复用,允许在单个 TCP 连接上同时发送多个请求和响应,这些请求和响应被分割成帧并通过流传输。HTTP/2 的多路复用(Multiplexing)机制显著提高了并发性能和资源利用效率。
- Java 面试指南(付费)收录的字节跳动面经同学 1 技术二面面试原题:一个TCP连接可以发送多少次HTTP请求?
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。
UDP 问的不会特别多,基本上是被拿来和 TCP 作比较的。
TCP 是面向连接的,而 UDP 是无连接的。
TCP 就像是打电话一对一私聊,UDP 就像是拿个大喇叭在广播(😂)。
在数据传输开始之前,TCP 需要先建立连接,数据传输完成后,再断开连接。这个过程通常被称为“三次握手”、“四次挥手”。
UDP 是无连接的,发送数据之前不需要建立连接,发送完毕也不需要断开,数据以数据报形式发送。
换句话说:TCP 是可靠的,它通过确认机制、重发机制等来保证数据的可靠传输。而 UDP 是不可靠的,数据包可能会丢失、重复、乱序。
首先,我们要实现登录功能,这是使用 QQ 的第一步,为了保证账号和密码的安全性,我们可以选择 TCP + SSL/TLS 协议来进行登录。
因为 TCP 协议是一种可靠的传输协议,能够保证数据的完整性,而 SSL/TLS 能够对通信进行加密,保证数据的安全性。
接下来,我们需要考虑消息传递的实时性,如语音视频通话等,这时候我们可以选择 UDP 协议。UDP 的传输速度更快,对于实时性服务来说,速度是最重要的。
对于 TCP 协议来说,如果数据包在传输过程中丢失,TCP 协议会自动进行重传。
而对于 UDP 协议来说,我们可以通过应用层的重传机制来保证消息的不丢失。当接收方收到消息后,返回一个确认信息给发送方,如果发送方在一定时间内没有收到确认信息,就重新发送消息。
同时,每个消息都附带一个唯一的序列号,接收方根据序列号判断是否有消息丢失,如果发现序列号不连续,就可以要求发送方重新发送。这样还可以防止消息重复。
当然了,消息持久化也很重要,可以将消息保存在服务器或者本地的数据库中,即使在网络中断或者其他异常情况下,也能从数据库中恢复消息。
- Java 面试指南(付费)收录的华为一面原题:说下 TCP 和 UDP 的区别?
- Java 面试指南(付费)收录的奇安信面经同学 1 Java 技术一面面试原题:tcp 和 udp 的区别?QQ 用的协议?它如何保证消息的不丢失?
- Java 面试指南(付费)收录的招商银行面经同学 6 招银网络科技面试原题:UDP和TCP的区别?
- Java 面试指南(付费)收录的得物面经同学 9 面试题目原题:介绍一下计网里面的tcp和udp协议
PS:这是多年前的老题了,拉出来怀怀旧。
简单总结一下:UDP 协议是无连接方式的协议,它的效率高,速度快,占资源少,对服务器的压力比较小。但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ 采用的通信协议以 UDP 为主,辅以 TCP 协议。
UDP 在传输数据之前不需要先建立连接,远地主机的运输层在接收到 UDP 报文后,不需要确认,提供不可靠交付。总结就以下四点:
更准确地说,DNS 既使用 TCP 又使用 UDP。
当进行区域传送(主域名服务器向辅助域名服务器传送变化的那部分数据)时会使用 TCP,因为数据同步传送的数据量比一个请求和应答的数据量要多,而 TCP 允许的报文长度更长,因此为了保证数据的正确性,会使用基于可靠连接的 TCP。
当客户端想 DNS 服务器查询域名(域名解析)的时候,一般返回的内容不会超过 UDP 报文的最大长度,即 512 字节,用 UDP 传输时,不需要创建连接,从而大大提高了响应速度,但这要求域名解析服务器和域名服务器都必须自己处理超时和重传从而保证可靠性。
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。
IP 协议(Internet Protocol)用于在计算机网络之间传输数据包,它定义了数据包的格式和处理规则,确保数据能够从一个设备传输到另一个设备,可能跨越多个中间网络设备(如路由器)。
①、寻址:每个连接到网络的设备都有一个唯一的 IP 地址。IP 协议使用这些地址来标识数据包的源地址和目的地址,确保数据包能够准确地传输到目标设备。
②、路由:IP 协议负责决定数据包在网络传输中的路径。比如说路由器使用路由表和 IP 地址信息来确定数据包的最佳传输路径。
③、分片和重组:当数据包过大无法在某个网络上传输时,IP 协议会将数据包分成更小的片段进行传输。接收端会根据头部信息将这些片段重新组装成完整的数据包。
假设有两个设备 A 和 B 通过互联网通信,A 的 IP 地址是 192.168.1.1,B 的 IP 地址是 203.0.113.5。数据包的传输过程如下:
①、设备 A 发送数据包:
②、路由器转发数据包:
③、设备 B 接收数据包:
- Java 面试指南(付费)收录的华为面经同学 12 暑期实习一面面试原题:说说IP协议.
一个 IP 地址在这鞥个互联网范围内是惟一的,一般可以这么认为,IP 地址 = {<网络号>,<主机号>}。
IP 地址分为 A,B,C,D,E 五大类:
假如你有多个不用的绰号,你的朋友可以用其中任何一个绰号叫你,但你的身份证号码却是惟一的。但同时你的绰号也可能和别人重复,假如你不在,有人叫你的绰号,其它人可能就答应了。
一个域名可以对应多个 IP,但这种情况 DNS 做负载均衡的,在用户访问过程中,一个域名只能对应一个 IP。
而一个 IP 却可以对应多个域名,是一对多的关系。
我们知道,IP 地址有 32 位,可以标记 2 的 32 次方个地址,听起来很多,但是全球的网络设备数量已经远远超过这个数字,所以 IPV4 地址已经不够用了,那怎么解决呢?
ARP(Address Resolution Protocol,地址解析协议)是网络通信中的一种协议,主要目的是将网络层的 IP 地址解析为链路层的 MAC 地址。
①、ARP 请求
当主机 A 要发送数据给主机 B 时,首先会在自己的 ARP 缓存中查找主机 B 的 MAC 地址。
如果没有找到,主机 A 会向网络中广播一个 ARP 请求数据包,请求网络中的所有主机告诉它们的 MAC 地址;这个请求包含了请求设备和目标设备的 IP 和 MAC 地址。
②、ARP 应答
网络中的所有主机都会收到这个 ARP 请求,但只有主机 B 会回复 ARP 应答,告诉主机 A 自己的 MAC 地址。
并且主机 B 会将主机 A 的 IP 和 MAC 地址映射关系缓存到自己的 ARP 缓存中,以便下次通信时直接使用。
③、更新 ARP 缓存
主机 A 收到主机 B 的 ARP 应答后,也会将主机 B 的 IP 和 MAC 地址映射关系缓存到自己的 ARP 缓存中。
- Java 面试指南(付费)收录的快手面经同学 7 Java 后端技术一面面试原题:说一下 ARP 协议的过程
MAC 地址和 IP 地址都有什么作用?
为什么有了 MAC 地址还需要 IP 地址?
如果我们只使用 MAC 地址进行寻址的话,我们需要路由器记住每个 MAC 地址属于哪个子网,不然一次路由器收到数据包都要满世界寻找目的 MAC 地址。而我们知道 MAC 地址的长度为 48 位,也就是最多共有 2 的 48 次方个 MAC 地址,这就意味着每个路由器需要 256T 的内存,显然是不现实的。
和 MAC 地址不同,IP 地址是和地域相关的,在一个子网中的设备,我们给其分配的 IP 地址前缀都是一样的,这样路由器就能根据 IP 地址的前缀知道这个设备属于哪个子网,剩下的寻址就交给子网内部实现,从而大大减少了路由器所需要的内存。
为什么有了 IP 地址还需要 MAC 地址?
ICMP(Internet Control Message Protocol) ,网际控制报文协议。
比如我们日常使用得比较多的 ping,就是基于 ICMP 的。
ping,Packet Internet Groper,一个网络工具,主要用来测试网络连接的可达性和延迟。
Ping 的过程主要基于 ICMP(Internet Control Message Protocol,互联网控制消息协议)实现,其基本过程包括:
①、当执行 Ping 命令,如ping javabetter.cn,Ping 首先解析域名获取 IP 地址,然后向目标 IP 发送一个 ICMP Echo Request 消息。
②、当目标 IP 收到 ICMP Echo Request 消息后,它会生成一个 ICMP Echo Reply 消息并返回,即 Ping 响应消息。
③、发起 Ping 命令的设备接收到 ICMP Echo Reply 消息后,计算并显示从发送 Echo Request 到接收到 Echo Reply 的时间(通常称为往返时间 RTT,Round-Trip Time),以及可能的丢包情况。
Ping 通常会发送多个请求,以便提供平均响应时间和丢包率等信息,以便我们了解网络连接的质量。
- Java 面试指南(付费)收录的快手面经同学 7 Java 后端技术一面面试原题:说一下 Ping 的过程
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。
网络安全攻击主要分为两种类型,被动攻击和主动攻击:
被动攻击:是指攻击者从网络上窃听他人的通信内容,通常把这类攻击称为截获,被动攻击主要有两种形式:消息内容泄露攻击和流量分析攻击。由于攻击者没有修改数据,使得这种攻击很难被检测到。
主动攻击:直接对现有的数据和服务造成影响,常见的主动攻击类型有:
篡改:攻击者故意篡改网络上送的报文,甚至把完全伪造的报文传送给接收方。
恶意程序:恶意程序种类繁多,包括计算机病毒、计算机蠕虫、特洛伊木马、后门入侵、流氓软件等等。
拒绝服务 Dos:攻击者向服务器不停地发送分组,使服务器无法提供正常服务。
DNS 劫持即域名劫持,是通过将原域名对应的 IP 地址进行替换,从而使用户访问到错误的网站,或者使用户无法正常访问网站的一种攻击方式。
域名劫持往往只能在特定的网络范围内进行,范围外的 DNS 服务器能够返回正常的 IP 地址。攻击者可以冒充原域名所属机构,通过电子邮件的方式修改组织机构的域名注册信息,或者将域名转让给其它主持,并将新的域名信息保存在所指定的 DNS 服务器中,从而使用户无法对原域名来进行解析以访问目标地址。
DNS 劫持的步骤是什么样的?
怎么应对 DNS 劫持?
什么是 CSRF 攻击?
CSRF,跨站请求伪造(英文全称是 Cross-site request forgery),是一种挟持用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。
CSRF 是如何攻击的呢?
来看一个例子:
怎么应对 CSRF 攻击呢?
HTTP 头中的 Referer 字段记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施 CSRF 攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证 Referer 值来防御 CSRF 攻击。
以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
对一些敏感的操作,除了需要校验用户的认证信息,还可以通过邮箱确认、验证码确认这样的方式多重校验。
主要形式有流量攻击和资源耗尽攻击,常见的 DDoS 攻击有:SYN Flood、Ping of Death、ACK Flood、UDP Flood 等。
如何防范 DDoS?
针对 DDoS 中的流量攻击,最直接的方法是增加带宽,理论上只要带宽大于攻击流量就可以了,但是这种方法成本非常高。在有充足带宽的前提下,我们应该尽量提升路由器、网卡、交换机等硬件设施的配置。
针对资源耗尽攻击,我们可以升级主机服务器硬件,在网络带宽得到保证的前提下,使得服务器能够有效对抗海量的 SYN 攻击包。我们也可以安装专业的抗 DDoS 防火墙,从而对抗 SYN Flood 等流量型攻击。瓷碗,负载均衡,CDN 等技术都能有效对抗 DDos 攻击。
XSS 攻击也是比较常见,XSS,叫跨站脚本攻击(Cross-Site Scripting),因为会与层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,因此有人将跨站脚本攻击缩写为 XSS。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览网页的时候,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意攻击用户的特殊目的。
XSS 攻击一般分三种类型:存储型 、反射型 、DOM 型 XSS
XSS 是如何攻击的呢?
简单说,XSS 的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。
拿反射型举个例子吧,流程图如下:
如何应对 XSS 攻击?
<a href="xxx" 等,要校验内容,禁止以 script 开头的非法链接。对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如何安全将密钥传输给另一方。常见的对称加密算法有:DES、AES 等。
非对称加密:指的是加密和解密使用不同的密钥(即公钥和私钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。常见的非对称加密算法有 RSA。
采用非对称加密的方式,采用公钥进行加密,私钥解密的形式。其私钥长度一般较长,由于需要大数的乘幂求模等运算,其运算速度较慢,不合适大量数据文件加密。
采用对称加密的方式,其秘钥长度最长只有 256 个比特,加密和解密速度较快,易于硬件实现。由于是对称加密,通信双方在进行数据传输前需要获知加密密钥。
图文详解 63 道计算机网络面试高频题,这次吊打面试官,我觉得稳了(手动 dog)。整理:沉默王二,戳转载链接,作者:三分恶,戳原文链接。
没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。
系列内容:
GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程
微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。