Repository navigation
Expand file tree
/
Copy pathnetwork.md
More file actions
1921 lines (1117 loc) · 132 KB
/
Copy pathnetwork.md
File metadata and controls
1921 lines (1117 loc) · 132 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: 计算机网络面试题,63道计算机网络八股文(2.2万字80张手绘图),面渣逆袭必看👍
shortTitle: 面渣逆袭-计算机网络
description: 下载次数超 1 万次,2.2 万字 80 张手绘图,详解 63 道计算机网络面试高频题(让天下没有难背的八股),面渣背会这些计算机网络八股文,这次吊打面试官,我觉得稳了(手动 dog)。
author: 三分恶&沉默王二
date: 2025-09-19
category:
- 面渣逆袭
tag:
- 面渣逆袭
head:
- - meta
- name: keywords
content: 计算机网络,计算机网络面试题,面试题,八股文
---
2.2 万字 80 张手绘图,详解 63 道计算机网络面试高频题(让天下没有难背的八股),面渣背会这些计算机网络八股文,这次吊打面试官,我觉得稳了(手动 dog)。整理:沉默王二,戳[转载链接](https://mp.weixin.qq.com/s/FvxyiMyq0422yifcyoG8vg),作者:三分恶,戳[原文链接](https://mp.weixin.qq.com/s/yAlErlC09GnjaVvwUo3Acg)。
大家好,我是二哥呀,今天继续来给大家分享三弟的面渣逆袭!
这次带来的是计算机网络六十二问,三万字,七十图详解,大概是全网最全的计算机网络面试题。
建议大家收藏了慢慢看,秋招、春招、金九银十、金三银四冲!
## 基础
### 1.说下计算机网络体系结构
计算机网络体系结构通过将复杂的网络通信分解成不同的层次,来标准化交互的过程。常见的模型包括 OSI 七层模型、TCP/IP 四层模型和五层体系结构。

OSI 是理论上的网络通信模型,TCP/IP 是实际应用层面上的网络通信模型,五层结构是为了方便理解和记忆。
#### 说说 OSI 七层模型?
OSI(Open System Interconnection)七层参考模型是一个网络架构模型,由国际标准化组织(ISO)提出,用于描述和标准化各种计算机网络的功能和过程。这七层从高到低分别是:
- **应用层**:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
- **表示层**:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
- **会话层**:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
- **传输层**:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
- **网络层**:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
- **数据链路层**:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
- **物理层**:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针脚、电缆的规格和传输速率等。
#### 说说 TCP/IP 四层模型?
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 的实用性,同时提供了比四层模型更细致的分层,便于教学和理解网络的各个方面。
- 应用层:作为网络服务和最终用户之间的接口。它提供了一系列供应用程序使用的协议,如 HTTP(网页)、FTP(文件传输)、SMTP(邮件传输)等。使用户的应用程序可以访问网络服务。
- 传输层:提供进程到进程的通信管理,这一层确保数据按顺序、无错误地传输。主要协议包括 TCP 和 UDP。
- 网络层:负责数据包从源到目的地的传输和路由选择,包括跨越多个网络(即互联网)。它使用逻辑地址(如 IP 地址)来唯一标识设备。路由器是网络层设备。
- 数据链路层:确保从一个节点到另一个节点的可靠、有效的数据传输。交换机、网桥是数据链路层设备。
- 物理层:电缆、光纤、无线电频谱、网络适配器等。
#### TCP三次握手四次挥手工作在哪一层?
三次握手和四次挥手都是工作在传输层。传输层(Transport Layer)是 OSI 模型的第四层,负责提供端到端的通信服务,包括数据传输的建立、维护和终止。
TCP 作为一种面向连接的协议,通过三次握手建立连接,通过四次挥手终止连接,确保数据传输的可靠性和完整性。
#### 讲一下计算机网络?
计算机网络是指将多台计算机通过通信设备互联起来,实现资源共享和信息传递的系统。

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:说一些 OSI 七层参考模型
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的京东面经同学 2 后端面试原题:TCP三次握手四次挥手工作在哪一层?
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的京东面经同学 5 Java 后端技术一面面试原题:让自己讲一下网络
### 2.说一下每一层对应的网络协议有哪些?
一张表格总结常见网络协议:

### 3.那么数据在各层之间是怎么传输的呢?
对于发送方而言,从上层到下层层层包装,对于接收方而言,从下层到上层,层层解开包装。
- 发送方的应用进程向接收方的应用进程传送数据
- AP 先将数据交给本主机的应用层,应用层加上本层的控制信息 H5 就变成了下一层的数据单元
- 传输层收到这个数据单元后,加上本层的控制信息 H4,再交给网络层,成为网络层的数据单元
- 到了数据链路层,控制信息被分成两部分,分别加到本层数据单元的首部(H2)和尾部(T2)
- 最后的物理层,进行比特流的传输

这个过程类似写信,写一封信,每到一层,就加一个信封,写一些地址的信息。到了目的地之后,又一层层解封,传向下一个目的地。
GitHub 上标星 17000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 17000+ 的 Java 教程](https://javabetter.cn/overview/)
微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。

## 网络综合
### 4.从浏览器地址栏输入 url 到显示网页的过程了解吗?
这个过程包括多个步骤,涵盖了 DNS 解析、TCP 连接、发送 HTTP 请求、服务器处理请求并返回 HTTP 响应、浏览器处理响应并渲染页面等多个环节。
1. **DNS 解析**:浏览器会发起一个 DNS 请求到 DNS 服务器,将域名解析为服务器的 IP 地址。
2. **TCP 连接**:浏览器通过解析得到的 IP 地址与服务器建立 TCP 连接。这一步涉及到 TCP 的三次握手,用于确保双方都已经准备好进行数据传输了。
3. **发送 HTTP 请求**:浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。
4. **服务器处理请求**:服务器接收到 HTTP 请求后,根据请求的资源路径,经过后端处理,生成 HTTP 响应消息;响应消息包括状态行、响应头和响应体。
5. **浏览器接收 HTTP 响应**:浏览器接收到服务器返回的 HTTP 响应数据后,开始解析响应体中的 HTML 内容;然后构建 DOM 树、解析 CSS 和 JavaScript 文件等,最终渲染页面。
6. **断开连接**:TCP 四次挥手,连接结束。
我们以输入 www.baidu.com 为例:

#### 各个过程都使用了哪些协议?

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动商业化一面的原题:url 请求的全过程(要求详细)
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:输入 URL 会发生什么
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 8 Java 后端实习一面面试原题:浏览器键入网址全过程
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学19番茄小说一面面试原题:键入url到页面显示的流程
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的理想汽车面经同学 2 一面面试原题:输入www.baidu.com到浏览器显示出来的过程
### 5.说说 DNS 的解析过程?
DNS 的全称是 **Domain Name System**,也就是域名解析系统,它可以将域名映射到对应的 IP 地址上,比如说我们访问 www.javabetter.cn,实际上访问的是我在阿里云上一台丐版服务器,它的 IP 地址是 xxx.xxx.xxx.xxx。
当然了,也可以通过 IP 地址直接访问服务器,但不方便记忆,所以就有了域名系统。一个好的域名可以卖好多好多钱,像 javabetter.cn 这个域名,一年需要 39 块钱。
域名到 IP 之间的映射,就需要 DNS 来完成。

我来说说 DNS 的解析过程吧:

假设我们在浏览器地址栏里键入了 [paicoding.com](https://paicoding.com):
浏览器会首先检查自己的缓存中是否有这个域名对应的 IP 地址,如果有,直接返回;如果没有,进入下一步。

检查本地 DNS 缓存是否有该域名的记录。如果没有,向**根域名服务器**发送请求,根域名服务器将请求指向更具体的服务,如 `com` 顶级域名服务器。
顶级域名服务器再将请求指向权限域名服务器,通常由域名注册机构直接管理,`paicoding.com`是在阿里云上注册的,所以阿里云会提供对应的 DNS 解析服务,将域名和阿里云服务器绑定起来。
最终,浏览器使用获得的 IP 地址发起一个 HTTP 请求到目标服务器,然后该服务器返回所请求的网页内容。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 6 Java 通用软件开发一面面试原题:说说 DNS 的解析过程
### 6.说说 WebSocket 与 Socket 的区别?
- Socket 其实就是等于 **IP 地址 + 端口 + 协议**。
> 具体来说,Socket 是一套标准,它完成了对 TCP/IP 的高度封装,屏蔽网络细节,以方便开发者更好地进行网络编程。
- WebSocket 是一个持久化的协议,它是伴随 H5 而出的协议,用来解决 **http 不支持持久化连接**的问题。
- Socket 一个是**网编编程的标准接口**,而 WebSocket 则是应用层通信协议。
### 7.说一下你了解的端口及对应的服务?

### 8.平常有抓包吗(补充)?
>2024 年 12 月 25 日新增
我平常使用最多的就是 chrome 浏览器自带的 network 面板了,可以看到请求的时间、请求的信息,以及响应信息。

更专业的还有 fidder、wireshark 等工具。

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的同学 30 腾讯音乐面试原题:平时,你是用什么来抓包呢。
GitHub 上标星 17000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 17000+ 的 Java 教程](https://javabetter.cn/overview/)
微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。

## HTTP
### 8.说说 HTTP 常用的状态码及其含义?
HTTP 状态码用于表示服务器对请求的处理结果,可以分为 5 种:
- 1xx 服务器收到请求,需要进一步操作,例如 100 Continue。
- 2xx 请求成功处理,例如 200 OK。
- 3xx 重定向:需要进一步操作以完成请求;例如 304 Not Modified 表示资源未修改,客户端可以使用缓存。
- 4xx 客户端错误:请求有问题,例如 404 Not Found 表示资源不存在。
- 5xx 服务器错误,例如500 Internal Server Error 表示服务器内部错误。

#### 说一下 301 和 302 的区别?
- 301:永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。
- 302:临时性性移动,服务器从另外的地址响应资源,但是客户端还应该使用这个地址。
用一个比喻,301 就是嫁人的新垣结衣,302 就是有男朋友的长泽雅美。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 的响应号有哪些
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP的状态码
### 9.HTTP 有哪些请求方式?
HTTP 协议定义了多种请求方式,用以指示请求的目的。常见的请求方式有 GET、POST、DELETE、PUT。

- GET:请求检索指定的资源。应该只用于获取数据,并且是幂等的,即多次执行相同的 GET 请求应该返回相同的结果,并且不会改变资源的状态。
- POST:向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。数据被包含在请求体中。可能会创建新的资源或修改现有资源。
- DELETE:删除指定的资源。
- PUT:用于替换指定的资源。如果指定的资源不存在,创建一个新资源。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。可以用于检查资源是否存在,验证资源的更新时间等。
- OPTIONS:用于获取服务器支持的 HTTP 请求方法。通常用于跨域请求中的预检请求(CORS)。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。但由于安全风险(可能暴露敏感信息),很多服务器会禁用 TRACE 请求。
- CONNECT:建立一个到目标资源的隧道(通常用于 SSL/TLS 代理),用于在客户端和服务器之间进行加密的隧道传输。
#### HTTP 的 GET 方法可以实现写操作吗?
可以是可以,但是不推荐。
使用 GET 执行写操作可能导致严重的安全问题,如跨站请求伪造(CSRF)。
实际开发中,也应该杜绝使用 GET 方法执行写操作。在[技术派实战项目](https://javabetter.cn/zhishixingqiu/paicoding.html)中,我们会在接口上明确规定应该使用哪种请求方式。

客户端一旦使用错误 ❎,将会收到一个 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
```
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 有哪些方法,http 的 get 方法可以实现写操作吗,https 传递 url 安全吗,为什么数据在浏览器中,中间人攻击是什么
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 1 技术二面面试原题:什么是幂等?幂等方法了解哪些?
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的深信服面经同学 3 Java 后端线下一面面试原题:http请求除了get post的其他所有。
### 10.说⼀下 GET 和 POST 的区别?

GET 请求主要用于获取数据,参数附加在 URL 中,存在长度限制,且容易被浏览器缓存,有安全风险;而 POST 请求用于提交数据,参数放在请求体中,适合提交大量或敏感的数据。
另外,GET 请求是幂等的,多次请求不会改变服务器状态;而 POST 请求不是幂等的,可能对服务器数据有影响。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的京东面经同学 8 面试原题:get和post请求
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动同学 17 后端技术面试原题:get和post啥区别
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的虾皮面经同学 13 一面面试原题:http的get和post区别
### 11.GET 的长度限制是多少?
HTTP 中的 GET 方法是通过 URL 传递数据的,但是 URL 本身其实并没有对数据的长度进行限制,真正限制 GET 长度的是浏览器。
例如 IE 浏览器对 URL 的最大限制是 2000 多个字符,大概 2kb 左右,像 Chrome、Firefox 等浏览器支持的 URL 字符数更多,其中 FireFox 中 URL 的最大长度限制是 65536 个字符,Chrome 则是 8182 个字符。
这个长度限制也不是针对数据部分,而是针对整个 URL。
### 12.HTTP 请求的过程与原理?
HTTP 是基于 TCP/IP 协议的应用层协议,它使用 TCP 作为传输层协议,通过建立 TCP 连接来传输数据。
HTTP 遵循标准的客户端-服务器模型,客户端打开连接发出请求,然后等待服务器返回的响应。

- 在浏览器输入 URL 后,浏览器首先会通过 DNS 解析获取到服务器的 IP 地址,然后与服务器建立 TCP 连接。
- TCP 连接建立后,浏览器会向服务器发送 HTTP 请求。
- 服务器收到请求后,会根据请求的信息处理请求。
- 处理完请求后,服务器会返回一个 HTTP 响应给浏览器。
- 浏览器收到响应后,会根据响应的信息渲染页面。然后,浏览器和服务器断开 TCP 连接。
客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求。
#### 怎么利用多线程来下载一个数据呢?
可以采取分块下载的策略。首先,通过 HEAD 请求获取文件的总大小。然后根据文件大小和线程数,将文件进行切割。每个线程负责下载一个特定范围的数据。
可以通过设置 HTTP 请求头的 Range 字段指定下载的字节区间。例如,`Range: bytes=0-1023` 表示下载文件的前 1024 字节。
最后启动多线程下载。
代码片段 1:获取文件大小
```java
URL url = new URL("https://javabetter.cn/file.zip");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
int fileSize = connection.getContentLength(); // 获取文件大小
connection.disconnect();
```
代码片段 2:下载文件
```java
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:启动多线程下载
```java
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` 即可。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:什么是 HTTP?
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的招商银行面经同学 6 招银网络科技面试原题:HTTP传送请求的一次流程
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP是怎么样传输数据的?如果我从网上利用多线程来下载一个数据,那是要怎么下载呢?如果我只要下载数据的前面十个字节呢?
### 13.说一下 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 响应报文结构?
```http
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 状态码的响应。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的比亚迪面经同学 3 Java 技术一面面试原题:说一下 HTTP 的结构和 HTTPS 的原理
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的 小公司面经合集好未来测开面经同学 3 测开一面面试原题:HTTP 请求消息和响应消息的格式
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP常见的请求头部有些什么呢?【面试官应该是想引导我考虑到Range头,可惜没了解过捏】
### 14.URI 和 URL 有什么区别?

- URI,统一资源标识符(Uniform Resource Identifier, URI),标识的是 Web 上每一种可用的资源,如 HTML 文档、图像、视频片段、程序等都是由一个 URI 进行标识的。
- URL,统一资源定位符(Uniform Resource Location),它是 URI 的一种子集,主要作用是提供资源的路径。
它们的主要区别在于,URL 除了提供了资源的标识,还提供了资源访问的方式。这么比喻,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人——人类住址协议://地球/中国/北京市/海淀区/xx 职业技术学院/14 号宿舍楼/525 号寝/张三.男。
### 15.说下 HTTP1.0,1.1,2.0 的区别?
**HTTP1.0** 默认是短连接,HTTP 1.1 默认是长连接,HTTP 2.0 采用的**多路复用**。

#### 说下 HTTP1.0
- **无状态协议**:HTTP 1.0 是无状态的,每个请求之间相互独立,服务器不保存任何请求的状态信息。
- **非持久连接**:默认情况下,每个 HTTP 请求/响应对之后,连接会被关闭,属于短连接。这意味着对于同一个网站的每个资源请求,如 HTML 页面上的图片和脚本,都需要建立一个新的 TCP 连接。可以设置`Connection: keep-alive` 强制开启长连接。
#### 说下 HTTP1.1
- **持久连接**:HTTP 1.1 引入了持久连接(也称为 HTTP keep-alive),默认情况下不会立即关闭连接,可以在一个连接上发送多个请求和响应。极大减轻了 TCP 连接的开销。
- **流水线处理**:HTTP 1.1 支持客户端在前一个请求的响应到达之前发送下一个请求,以提高传输效率。
#### 说下 HTTP2.0
- **二进制协议**:HTTP 2.0 使用二进制而不是文本格式来传输数据,解析更加高效。
- **多路复用**:一个 TCP 连接上可以同时进行多个 HTTP 请求/响应,解决了 HTTP 1.x 的队头阻塞问题。
- **头部压缩**:HTTP 协议不带状态,所以每次请求都必须附上所有信息。HTTP 2.0 引入了头部压缩机制,可以使用 gzip 或 compress 压缩后再发送,减少了冗余头部信息的带宽消耗。
- **服务端推送**:服务器可以主动向客户端推送资源,而不需要客户端明确请求。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 23 QQ 后台技术一面面试原题:HTTP 1 和 2 的区别
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的同学 30 腾讯音乐面试原题:http2.0和http1.0区别
### 16.HTTP/3 了解吗?
HTTP/2.0 基于 TCP 协议,而 HTTP/3.0 则基于 QUIC 协议,Quick UDP Connections,直译为快速 UDP 网络连接。

基于 TCP 的 HTTP/2.0,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输的过程中,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,仍然会阻塞在它之后传输的流数据。
而基于 UDP 的 QUIC 协议可以更彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰。
同时,QUIC 协议在传输的过程中就完成了 TLS 加密握手,更直接了。
#### 目前使用最广泛的是哪个HTTP版本?
应该是 HTTP/2,在 2022 年 1 月达到峰值,占所有网站的 46.9%。
统计网站:[w3techs](https://w3techs.com/technologies/history_overview/site_element/all)

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 8 技术二面面试原题:HTTP 2.0 和 3.0 的区别
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 1 技术二面面试原题:目前使用最广泛的是哪个HTTP版本?
### 17.HTTP 长连接了解吗?
在 HTTP 中,长连接是指客户端和服务器之间在一次 HTTP 通信完成后,不会立即断开,而是保留连接以供后续请求复用。
这种机制可以减少了频繁建立和关闭连接的开销
#### 如何设置长连接?
可以通过 Connection: keep-alive 实现。在 HTTP/1.1 中,长连接是默认开启的。
#### 在什么时候会超时呢?
- HTTP 一般会有 httpd 守护进程,里面可以设置 **keep-alive timeout**,当 tcp 连接闲置超过这个时间就会关闭,也可以在 HTTP 的 header 里面设置超时时间
- TCP 的 **keep-alive** 包含三个参数,支持在系统内核的 net.ipv4 里面设置;当 TCP 连接之后,闲置了 **tcp_keepalive_time**,则会发生侦测包,如果没有收到对方的 ACK,那么会每隔 tcp_keepalive_intvl 再发一次,直到发送了 **tcp_keepalive_probes**,就会丢弃该连接。
```
1. tcp_keepalive_intvl = 15
2. tcp_keepalive_probes = 5
3. tcp_keepalive_time = 1800
```
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTP怎么保持长连接呢?
### 18.🌟说说 HTTP 与 HTTPS 有哪些区别?
HTTPS 是 HTTP 的增强版,在 HTTP 的基础上加入了 SSL/TLS 协议,确保数据在传输过程中是加密的。

HTTP 的默认端⼝号是 80,URL 以`http://`开头;HTTPS 的默认端⼝号是 443,URL 以`https://`开头。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 和 https 的区别,https 是怎么建立连接,https 是对称还是非对称加密
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的 小公司面经合集好未来测开面经同学 3 测开一面面试原题:说说 HTTP和 HTTPS 的区别
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学19番茄小说一面面试原题:https与http的区别,加密的实现
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的得物面经同学 9 面试题目原题:介绍一下http和https的区别?为什么https安全?
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的同学 30 腾讯音乐面试原题:http 和Https 有啥区别呢?https 安全在哪里
memo:2025 年 9 月 03 日修改至此,今天[有球友发私信说](https://javabetter.cn/zhishixingqiu/)拿到了京东的正式批 offer,并且业务看上去很核心,那真的要恭喜🎉啊,你付出多少就会有多少的收获,在没有开花结果之前,就是要坚持,鼓励自己。

### 19.为什么要用 HTTPS?
HTTP 是明文传输的,存在数据窃听、数据篡改和身份伪造等问题。而 HTTPS 通过引入 SSL/TLS,解决了这些问题。
SSL/TLS 在加密过程中涉及到了两种类型的加密方法:
- 非对称加密:服务器向客户端发送公钥,然后客户端用公钥加密自己的随机密钥,也就是会话密钥,发送给服务器,服务器用私钥解密,得到会话密钥。
- 对称加密:双方用会话密钥加密通信内容。

客户端会通过数字证书来验证服务器的身份,数字证书由 CA 签发,包含了服务器的公钥、证书的颁发机构、证书的有效期等。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的比亚迪面经同学 3 Java 技术一面面试原题:说一下 HTTP 的结构和 HTTPS 的原理
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的的腾讯面经同学 26 暑期实习微信支付面试原题:https的加密技术
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 3 Java 后端技术一面面试原题:https相比http有什么区别 对称加密和非对称加密 ca证书验证
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTPS是什么?他解决了HTTP什么问题?
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的虾皮面经同学 13 一面面试原题:https使用过吗 怎么保证安全
### 20.HTTPS是怎么建立连接的?
HTTPS 的连接建立在 SSL/TLS 握手之上,其过程可以分为两个阶段:握手阶段和数据传输阶段。

①、客户端向服务器发起请求
②、服务器接收到请求后,返回自己的数字证书,包含了公钥、颁发机构等信息。
③、客户端收到服务器的证书后,验证证书的合法性,如果合法,会生成一个随机码,然后用服务器的公钥加密这个随机码,发送给服务器。
④、服务器收到会话密钥后,用私钥解密,得到会话密钥。
⑤、客户端和服务器通过会话密码对通信内容进行加密,然后传输。
如果通信内容被截取,但由于没有会话密钥,所以无法解密。当通信结束后,连接会被关闭,会话密钥也会被销毁,下次通信会重新生成一个会话密钥。
#### HTTPS 会加密 URL 吗?
HTTPS 通过 SSL/TLS 协议确保了客户端与服务器之间交换的数据被加密,这包括 HTTP 头部和正文。
而 URL 是 HTTP 头部的一部分,因此这部分信息也是加密的。

但因为涉及到 SSL 握手的过程,所以域名信息会被暴露出来,需要注意。

另外,完整的 URL 可能在 Web 服务器的日志中记录,这些日志可能是明文的。还有,URL 在浏览器历史记录中也是可见的。
因此,敏感信息永远不应该通过 URL 传递,即使是在使用 HTTPS 的情况下。
#### 什么是中间人攻击?
中间人攻击(Man-in-the-Middle, MITM)是一种常见的网络安全威胁,攻击者可以在通信的两端插入自己,以窃取通信双方的信息。

在很多电影中,都会存在这样的场景:主角通过某种方式,将自己伪装成中间人,然后窃取通信双方的信息,阿汤哥的碟中谍中就有很多类似的手笔。
中间人攻击是一个缺乏相互认证的攻击,因此大多数加密协议都会专门加入一些特殊的认证方法,以防止中间人攻击。像 SSL 协议,就是通过验证服务器的数字证书,是否由 CA(权威的受信任的数字证书认证机构)签发,来防止中间人攻击的。
#### HTTPS怎么保证建立的信道是安全的?
主要通过 SSL/TLS 协议的多层次安全机制,首先在握手阶段,客户端和服务器使用得是非对称加密,生成的会话密钥只有服务器的私钥才能解密,而私钥只有服务器持有。
在数据传输阶段,即使攻击者拦截了通信数据,没有会话密钥也无法解密。
#### HTTPS 能抓包吗?
可以,HTTPS 可以抓包,但因为通信内容是加密的,需要解密后才能查看。

其原理是通过一个中间人,伪造服务器证书,并取得客户端的信任,然后将客户端的请求转发给服务器,将服务器的响应转发给客户端,完成中间人攻击。
常用的抓包工具有 Wireshark、Fiddler、Charles 等。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 和 https 的区别,https 是怎么建立连接,https 是对称还是非对称加密
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 13 Java 后端二面面试原题:http 有哪些方法,http 的 get 方法可以实现写操作吗,https 传递 url 安全吗,为什么数据在浏览器中,中间人攻击是什么
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 27 云后台技术一面面试原题:HTTPS怎么建立连接的?HTTPS怎么保证建立的信道是安全的?
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的虾皮面经同学 13 一面面试原题:https能不能抓包
memo:2025 年 9 月 20 日修改至此,[今天有球友发喜报](https://javabetter.cn/zhishixingqiu/)说拿到了美的的 offer,虽然不是大厂,但他自己感觉很开心,并且特意感谢了我对他的鼓励。有了保底也可以无所畏惧的继续向前冲了。

### 21.客户端怎么去校验证书的合法性?
推荐阅读:[HTTPS 握手过程中,客户端如何验证证书的合法性](https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/74)
首先,所有的证书都是由 CA 机构签发的,CA 机构是一个受信任的第三方机构,它会对证书的申请者进行身份验证,然后签发证书。
CA 就像是网络世界的公安局,具有极高的可信度。

CA 签发证书的过程是非常严格的:
- 首先,CA 会把持有者的公钥、⽤途、颁发者、有效时间等信息打成⼀个包,然后对这些信息进⾏ Hash 计算,得到⼀个 Hash 值;
- 然后 CA 会使⽤⾃⼰的私钥将该 Hash 值加密,⽣成 Certificate Signature;
- 最后将 Certificate Signature 添加在⽂件证书上,形成数字证书。

客户端(通常是浏览器,通常会集成 CA 的公钥信息)在校验证书的合法性时,主要通过以下步骤来校验证书的合法性。
- 浏览器会读取证书的所有者、有效期、颁发者等信息,先校验网站域名是否一致,然后校验证书的有效期是否过期;
- 浏览器开始查找内置的 CA,与服务器返回证书中的颁发者进行对比,确认是否为合法机构;
- 如果是,从内部植入的 CA 公钥解密 Certificate 的 Signature 内容,得到⼀个 Hash 值 H2;
- 使⽤同样的 Hash 算法获取证书的 Hash 值 H1,⽐较 H1 和 H2,如果值相同,则为可信赖的证书,否则告警。
假如在 HTTPS 的通信过程中,中间人篡改了证书,但由于他没有 CA 机构的私钥,所以无法生成正确的 Signature,因此就无法通过校验。
#### 如果服务端发送给客户端的加密算法是客户端没有的,这种情况会怎样?
如果客户端不支持服务器建议的任何加密算法,那么安全连接将建立失败。
当客户端向服务器发起一个 HTTPS 请求时,它会发送一个 ClientHello 消息。

这个消息包含了客户端支持的加密算法列表(称为密码套件),以及其他一些参数。
服务器收到 ClientHello 后,会从客户端提供的密码套件中选择一个它也支持的密码套件,并在 ServerHello 消息中返回给客户端。

如果服务器无法找到一个双方都支持的密码套件,那么它会发送一个警告消息,表示无法协商出一个共同的加密算法,随后连接将被终止。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的得物面经同学 1 面试原题:HTTPS,中间人伪造证书怎么办,伪造证书机构
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 34 Java 后端一面面试原题:客户端怎么检验ca证书的合法性
### 22.如何理解 HTTP 协议是无状态的?
HTTP 协议是无状态的,这意味着每个 HTTP 请求都是独立的,服务器不会保留任何关于客户端请求的历史信息。
换句话说,我家大门常打开,是人是神都欢迎,我不在乎,只要给钱,哦不,按规矩,一切好办。
- 每个 HTTP 请求都包含了所必须的信息,服务器在处理当前请求时,不依赖于之前的任何请求信息。
- 服务器不会记录任何客户端请求的状态,每次请求都像是第一次与服务器通信。
由于 HTTP 是无状态的,像用户的购物车状态就必须通过其他方式来保持,如在每次请求中传递用户的 ID,或者使用 Cookie 在客户端保存购物车状态。
#### 那有什么办法记录状态呢?
1. Cookies:服务器通过 Set-Cookie 响应头将状态信息存储在客户端,客户端在后续请求中发送该 Cookie 以维持状态。
2. Session:服务器生成一个唯一的会话 ID,存储在 Cookie 中,并在服务器端维护与该会话 ID 关联的状态信息。
3. Token:使用 JWT(JSON Web Token)等机制在客户端存储状态信息,客户端在每次请求中发送该 Token。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 8 Java 后端实习一面面试原题:http为什么是无状态的
### 23.说说 Session 和 Cookie 有什么联系和区别?
先来看看什么是 Session 和 Cookie :
- Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个 Cookie,客户端就把 Cookie 保存起来。在客户端下次向同一服务器再发起请求时,Cookie 被携带发送到服务器。服务端可以根据这个 Cookie 判断用户的身份和状态。
- Session 指的就是服务器和客户端一次会话的过程。它是另一种记录客户状态的机制。不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。客户端浏览器再次访问时只需要从该 session 中查找用户的状态。

> Session 和 Cookie 到底有什么不同呢?
- 存储位置不一样,Cookie 保存在客户端,Session 保存在服务器端。
- 存储数据类型不一样,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
- 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般有效时间较短,客户端关闭或者 Session 超时都会失效。
- 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
> Session 和 Cookie 有什么关联呢?
可以使用 Cookie 记录 Session 的标识。

- 用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的 Session,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入 Cookie 中,同时 Cookie 记录此 SessionID 是属于哪个域名。
- 当用户第二次访问服务器时,请求会自动判断此域名下是否存在 Cookie 信息,如果存在,则自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到,说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
> **分布式环境下 Session 怎么处理呢?**
分布式环境下,客户端请求经过负载均衡,可能会分配到不同的服务器上,假如一个用户的请求两次没有落到同一台服务器上,那么在新的服务器上就没有记录用户状态的 Session。
这时候怎么办呢?
可以使用 Redis 等分布式缓存来存储 Session,在多台服务器之间共享。

> **客户端无法使用 Cookie 怎么办?**
有可能客户端无法使用 Cookie,比如浏览器禁用 Cookie,或者客户端是安卓、IOS 等等。
这时候怎么办?SessionID 怎么存?怎么传给服务端呢?
首先是 SessionID 的存储,可以使用客户端的本地存储,比如浏览器的 sessionStorage。
接下来怎么传呢?
- 拼接到 URL 里:直接把 SessionID 作为 URL 的请求参数
- 放到请求头里:把 SessionID 放到请求的 Header 里,比较常用。
GitHub 上标星 17000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 17000+ 的 Java 教程](https://javabetter.cn/overview/)
微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。

## TCP
### 24.详细说一下 TCP 的三次握手机制
TCP(传输控制协议)的三次握手机制是一种用于在两个 TCP 主机之间建立一个可靠连接的过程。这个机制确保了两端的通信是同步的,并且在数据传输开始前,双方都准备好了进行通信。

①、第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN)
- **发起连接**:客户端发送一个 TCP 报文段到服务器。这个报文段的头部中,SYN 位被设置为 1,表明这是一个连接请求。同时,客户端会随机选择一个序列号(Sequence Number),假设为 x,发送给服务器。
- **目的**:客户端通知服务器它希望建立连接,并告知服务器自己的初始序列号。
- **状态**:客户端进入 SYN_SENT 状态。
②、第二次握手:SYN + ACK
- **确认并应答**:服务器收到客户端的连接请求后,如果同意建立连接,它会发送一个应答 TCP 报文段给客户端。在这个报文段中,SYN 位和 ACK 位都被设置为 1。服务器也会选择自己的一个随机序列号,假设为 y,并将客户端的序列号加 1(即 x+1)作为确认号(Acknowledgment Number),发送给客户端。
- **目的**:服务器告诉客户端,它的连接请求被接受了,并通知客户端自己的初始序列号。
- **状态**:服务器进入 SYN_RCVD 状态。
③、第三次握手:ACK
- **最终确认**:客户端收到服务器的应答后,还需要向服务器发送一个确认。这个 TCP 报文段的 ACK 位被设置为 1,确认号被设置为服务器序列号加 1(即 y+1),而自己的序列号是 x+1。
- **目的**:客户端确认收到了服务器的同步应答,完成三次握手,建立连接。
- **状态**:客户端进入 ESTABLISHED 状态,当服务器接收到这个包时,也进入 ESTABLISHED 状态
用大白话讲 TCP 三次握手就是:
三十年前的农村,电话还没有普及,所以,通信基本靠吼。
老张和老王是邻居,这天老张下地了,结果家里有事,热心的邻居老王赶紧跑到村口,开始叫唤老王。
- 老王:老张唉!我是老王,你能听得到吗?
- 老张一听,是老王的声音:老王老王,我是老张,我能听得到,你能听得到吗?
- 老王一听,嗯,没错,是老张:老张,我听到了,我有事要跟你说。
"你老婆要生了,赶紧回去吧!"
老张风风火火地赶回家,老婆顺利地生了个带把的大胖小子。握手的故事充满了幸福和美满。

#### 可以再举一个例子说明 TCP 三次握手吗?
当然可以,你(客户端)在一个拥挤的聚会上遇到了你想交谈的美女(服务器)。因为周围很吵,你们需要确认对方都准备好交流,并清楚地听到对方说的每一句话。
**①、第一次握手:打招呼**
- 你走向那个美女,大声说:“嘿,我是小二,我们可以聊聊吗?”(你发送了一个连接请求,告诉服务器你想深入交流,并提供了你的微信号`x`,也就是你们交谈的起点)
**②、第二次握手:对方回应**
- 美女一看你挺帅挺有气质,回答说:“嗨,我是小青,可以聊聊。”(服务器接受你的请求,同样愿意深入交流,告诉你它的微信号`y`,并确认了你的微信号`x+1`,表示它准备好了)
**③、第三次握手:确认准备就绪**
- 你听到美女的回答后,对她说:“太好了,我们以后就微信上聊吧。”(你确认了美女的回答,也告诉她你准备好开始了,通过发送确认号`y+1`)
④、聊天开始
这时候,你们两个就确认彼此都准备好深入交流了,可以开始你们的对话了。
#### 说说 SYN 的概念?
SYN 是 TCP 协议中用来建立连接的一个标志位,全称为 Synchronize Sequence Numbers,也就是同步序列编号。

SYN 不仅确保了序列号的同步,使得后续的数据能够有序传输,还能防止旧的报文段被误认为是新连接。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:TCP 为什么要三次握手
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的TP联洲同学 5 Java 后端一面的原题:Tcp三次握手,Syn的概念
### 25.🌟TCP 握手为什么是三次,为什么不能是两次?不能是四次?
使用三次握手可以建立一个可靠的连接。这一过程的目的是确保双方都知道对方已准备好进行通信,并同步双方的序列号,从而保持数据包的顺序和完整性。
#### 为什么 TCP 握手不能是两次?
---面试中可以不背,但需要理解 start---
- 为了防止服务器一直等,等到黄花菜都凉了。
- 为了防止客户端已经失效的连接请求突然又传送到了服务器。
要知道,网络传输是有延时的(要通过网络光纤、WIFI、卫星信号传输等)。
假如说客户端发起了 SYN=1 的第一次握手。服务器也及时回复了 SYN=2 和 ACK=1 的第二次握手,但是这个 ACK=1 的确认报文段因为某些原因在传输过程中丢失了。
如果没有第三次握手告诉服务器,客户端收到了服务器的回应,那服务器是不知道客户端有没有接收到的。
于是服务器就一直干巴巴地开着端口在等着客户端发消息呢,但其实客户端并没有收到服务器的回应,心灰意冷地跑了。

这就好像你找美女要联系方式了,人家回你了,你却没听见,还以为人家看不上你,赌气地跑了;剩下的美女却一直在等你。。。
还有一种情况是,一个旧的、延迟的连接请求(SYN=1)被服务器接受,导致服务器错误地开启一个不再需要的连接。

举个例子:假设你(客户端)给你的朋友(服务器)发送了一个邮件(连接请求)。因为某些原因,这封邮件迟迟没有到达朋友那里,可能是因为邮局的延误。于是你决定再发一封新的邮件。朋友收到了第二封邮件,你们成功地建立了连接并开始通信。
但是,过了很久,那封延误的旧邮件突然也到了你朋友那里。如果没有一种机制来识别和处理这种延误的邮件,你的朋友可能会以为这是一个新的连接请求,并尝试响应它,但其实你已经重新发了请求,原来的不需要了。这就导致了不必要的混乱和资源浪费。
---面试中可以不背,但需要理解 end---
- 第一次握手:客户端发送 SYN 包(连接请求)给服务器,如果这个包延迟了,客户端不会一直等待,它可能会重试并发送一个新的连接请求。
- 第二次握手:服务器收到 SYN 包后,发送一个 SYN-ACK 包(确认接收到连接请求)回客户端。
- 第三次握手:客户端收到 SYN-ACK 包后,再发送一个 ACK 包给服务器,确认收到了服务器的响应。
#### 为什么不是四次?
三次握手已经足够创建可靠的连接了,没有必要再多一次握手。
#### 什么是泛洪攻击?
泛洪攻击(SYN Flood Attack)是一种常见的 DoS(拒绝服务)攻击,攻击者会发送大量的伪造的 TCP 连接请求,导致服务器资源耗尽,无法处理正常的连接请求。
半连接服务拒绝,也称为 SYN 洪泛攻击或 SYN Flood。
所谓的半连接就是指在 TCP 的三次握手过程中,当服务器接收到来自客户端的第一个 SYN 包后,它会回复一个 SYN-ACK 包,此时连接处于“半开”状态,因为连接的建立还需要客户端发送最后一个 ACK 包。
在收到最后的 ACK 包之前,服务器会为这个尚未完成的连接分配一定的资源,并在它的队列中保留这个连接的位置。
#### 如果让你重新设计,怎么设计?
如果重新设计 TCP 的连接建立过程,可以考虑引入 SYN cookies,这种技术通过在 SYN-ACK 响应中编码连接信息,从而在不占用大量资源的情况下验证客户端。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 9 飞书后端技术一面面试原题:TCP 为什么要三次握手
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团同学 2 优选物流调度技术 2 面面试原题:为什么三次握手,有什么缺点,洪泛攻击,半连接服务拒绝,让你重新设计,怎么设计
### 26.三次握手中每一次没收到报文会发生什么情况?
- 第一次握手服务端未收到 SYN 报文
服务端不会进行任何的动作,而客户端由于一段时间内没有收到服务端发来的确认报文,等待一段时间后会重新发送 SYN 报文,如果仍然没有回应,会重复这个过程,直到发送次数超过最大重传次数限制,就会返回连接建立失败。
- 第二次握手客户端未收到服务端响应的 ACK 报文
客户端会继续重传,直到次数限制;而服务端此时会阻塞在 accept()处,等待客户端发送 ACK 报文
- 第三次握手服务端为收到客户端发送过来的 ACK 报文
服务端同样会采用类似客户端的超时重传机制,如果重试次数超过限制,则 accept()调用返回-1,服务端建立连接失败;而此时客户端认为自己已经建立连接成功,因此开始向服务端发送数据,但是服务端的 accept()系统调用已经返回,此时不在监听状态,因此服务端接收到客户端发送来的数据时会发送 RST 报文给客户端,消除客户端单方面建立连接的状态。
### 27.第二次握手传回了 ACK,为什么还要传回 SYN?
ACK 是为了告诉客户端传来的数据已经接收无误。
而传回 SYN 是为了告诉客户端,服务端响应的确实是客户端发送的报文。
### 28.第 3 次握手可以携带数据吗?
第 3 次握手是可以携带数据的。
此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,它已经建立连接成功,并且确认服务端的接收和发送能力是正常的。
第一次握手不能携带数据是出于安全的考虑,因为如果允许携带数据,攻击者每次在 SYN 报文中携带大量数据,就会导致服务端消耗更多的时间和空间去处理这些报文,会造成 CPU 和内存的消耗。
### 29.了解 TCP 半连接状态吗?
TCP 半连接指的是在 TCP 三次握手过程中,服务器接收到了客户端的 SYN 包,但还没有完成第三次握手,此时的连接处于一种未完全建立的状态。

如果服务器回复了 SYN-ACK,但客户端还没有回复 ACK,该连接将一直保留在半连接队列中,直到超时或被拒绝。
#### 说说半连接队列?
TCP 进入三次握手前,服务端会从 **CLOSED** 状态变为 **LISTEN** 状态, 同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。

顾名思义,半连接队列存放的是三次握手未完成的连接,全连接队列存放的是完成三次握手的连接。
- TCP 三次握手时,客户端发送 SYN 到服务端,服务端收到之后,便回复 **ACK 和 SYN**,状态由 **LISTEN 变为 SYN_RCVD**,此时这个连接就被推入了 **SYN 队列**,即半连接队列。
- 当客户端回复 ACK, 服务端接收后,三次握手就完成了。这时连接会等待被具体的应用取走,在被取走之前,它被推入 ACCEPT 队列,即全连接队列。
#### 什么是 SYN Flood ?
SYN Flood 是一种典型的 DDos 攻击,它在短时间内,伪造**不存在的 IP 地址**, 向服务器发送大量 SYN 报文。当服务器回复 SYN+ACK 报文后,不会收到 ACK 回应报文,那么 SYN 队列里的连接旧不会出对队,久⽽久之就会占满服务端的 **SYN** 接收队列(半连接队列),使得服务器不能为正常⽤户服务。

#### 那有什么应对方案呢?
主要有 **syn cookie** 和 **SYN Proxy 防火墙**等。
- **syn cookie**:在收到 SYN 包后,服务器根据一定的方法,以数据包的源地址、端口等信息为参数计算出一个 cookie 值作为自己的 SYNACK 包的序列号,回复 SYN+ACK 后,服务器并不立即分配资源进行处理,等收到发送方的 ACK 包后,重新根据数据包的源地址、端口计算该包中的确认序列号是否正确,如果正确则建立连接,否则丢弃该包。
- **SYN Proxy 防火墙**:服务器防火墙会对收到的每一个 SYN 报文进行代理和回应,并保持半连接。等发送方将 ACK 包返回后,再重新构造 SYN 包发到服务器,建立真正的 TCP 连接。
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的同学 30 腾讯音乐面试原题:tcp半连接是什么样一个状态?
### 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 状态。
大白话说四次挥手:
假如单身狗博主有一个女朋友—由于博主上班九九六,下班肝博客,导致没有时间陪女朋友,女朋友忍无可忍。
- 女朋友:狗男人,最近你都不理我,你是不是不爱我了?你是不是外面有别的狗子了?我要和你分手?
- 沙雕博主一愣,怒火攻心:分手就分手,不陪你闹了,等我把东西收拾收拾。