大纲
基础
TCP/IP网络模型有哪几层?
TCP/IP网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
- 应用层:负责向用户提供一组应用程序,比如HTTP、DNS、FTP等;
- 传输层:负责端到端的通信,比如TCP、UDP等;
- 网络层:负责网络包的封装、分片、路由、转发,比如IP、ICMP等;
- 网络接口层:负责网络包在物理网络中的传输,比如网络包的封帧、MAC寻址、差错检测,以及通过网卡传输网络帧等。
不过,我们常说的七层和四层负载均衡,是用OSI网络模型来描述的,七层对应的是应用层,四层对应的传输层。
键入网址到网页显示,期间发生了什么?
Linux系统是如何收发网络包的?
一、HTTP
HTTP 常见面试题
HTTP基本概念
HTTP 是什么?
HTTP是超文本传输协议,是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超⽂本」数据的「约定和规范」。
HTTP常见的状态码有哪些?
1xx
类状态码属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
- 「200 OK」是最常⻅的成功状态码,表示⼀切正常。如果是⾮
HEAD
请求,服务器返回的响应头都会有 body 数据。 - 「204 No Content」也是常⻅的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 「206 Partial Content」是应⽤于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,⽽是其中的⼀部分,也是服务器处理成功的状态。
3xx
类状态码表示客户端请求的资源发⽣了变动,需要客户端⽤新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改⽤新的 URL 再次访问。
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要⽤另⼀个 URL 来访问。
301 和 302 都会在响应头⾥使⽤字段Location
,指明后续要跳转的 URL,浏览器会⾃动重定向新的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」表示服务器当前很忙,暂时⽆法响应客户端,类似“⽹络服务正忙,请稍后重试”的意思。
HTTP常见字段有哪些?
Host字段:客户端发送请求时,⽤来指定服务器的域名。
Connection字段:Connection 字段最常⽤于客户端要求服务器使⽤「HTTP ⻓连接」机制,以便其他请求复⽤。
Content-Length字段:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据⻓度。
Content-Type字段:⽤于服务器回应时,告诉客户端,本次数据是什么格式。
Content-Encoding字段:说明数据的压缩⽅法。
Accept-Encoding字段:客户端在请求时,⽤该字段说明⾃⼰可以接受哪些压缩⽅法。
GET与POST
GET和POST有什么区别?
GET 的语义是请求获取指定的资源。 GET ⽅法是安全、幂等、可被缓存的。
POST 的语义是根据请求负荷(报⽂主体)对指定的资源做出处理,具体的处理⽅式视资源类型⽽不同。POST 不安全,不幂等,(⼤部分实现)不可缓存。
HTTP缓存技术
HTTP缓存有哪些实现方式?
对于⼀些具有重复性的 HTTP 请求,⽐如每次请求得到的数据都⼀样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过⽹络获取服务器的响应了,这样的话HTTP/1.1 的性能肯定⾁眼可⻅的提升。
HTTP 缓存有两种实现⽅式,分别是强制缓存和协商缓存。
什么是强制缓存?
强缓存指的是只要浏览器判断缓存没有过期,则直接使⽤浏览器的本地缓存,决定是否使⽤缓存的主动性在于浏览器这边。
强缓存是利⽤下⾯这两个 HTTP 响应头部(Response Header)字段实现的,它们都⽤来表示资源在客户端缓存的有效期:
Cache-Control
,是一个相对时间;Expires
,是一个绝对时间。
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话, Cache-Control 的优先级⾼于 Expires。
Cache-control 选项更多⼀些,设置更加精细,所以建议使⽤ Cache-Control 来实现强缓存。具体的实现流程如下:
- 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response头部加上Cache-Control,并在Cache-Control中设置了过期时间大小;
- 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
- 服务器再次收到请求后,会再次更新Response头部的Cache-Control。
什么是协商缓存?
当我们在浏览器使⽤开发者⼯具的时候,你可能会看到过某些请求的响应码是304
,这个是告诉浏览器可以使⽤本地缓存的资源,通常这种通过服务端告知客户端是否可以使⽤缓存的⽅式被称为协商缓存。
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用使用本地缓存。
协商缓存可以基于两种头部来实现。
第一种:请求头部中的If-Modified-Since
字段与响应头部中的Last-Modified
字段实现,这两个字段的意思是:
- 响应头部中的
Last-Modified
:标识这个响应资源的最后修改时间; - 请求头部中的
If-Modified-Since
:当资源过期了,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进⾏对⽐(Last-Modified),如果最后修改时间较新(⼤),说明资源⼜被改过,则返回最新资源, HTTP 200 OK;如果最后修改时间较旧(⼩),说明资源⽆新修改,响应HTTP 304 ⾛缓存。
第二种:请求头部中的If-None-Match字段与响应头部中的Etag
字段,这两个字段的意思是:
- 响应头部中的
Etag
:唯一标识响应资源; - 请求头部中的
If-None-Match
:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值,服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。
第⼀种实现⽅式是基于时间实现的,第⼆种实现⽅式是基于⼀个唯⼀标识实现的,相对来说后者可以更加准确地判断⽂件内容是否被修改,避免由于时间篡改导致的不可靠问题。
协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使⽤,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。
HTTP特性
HTTP/1.1的优点有哪些?
- 简单:HTTP 基本的报⽂格式就是 header + body ,头部信息也是 key-value 简单⽂本的形式, 易于理解,降低了学习和使⽤的⻔槛。
- 灵活和易于扩展:HTTP 协议⾥的各类请求⽅法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发⼈员⾃定义和扩充。
- 应用广泛和跨平台
HTTP/1.1 的缺点有哪些?
- 无状态双刃剑
- 明⽂传输双刃剑
- 不安全
HTTP/1.1的性能如何?
HTTP 协议是基于 TCP/IP,并且使⽤了「请求 - 应答」的通信模式。
- 长连接
- 管道网络传输
- 队头阻塞
HTTP与HTTPS
HTTP与 HTTPS 有哪些区别?
- HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
- HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP默认端口是80,HTTPS默认端口是443。
- HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
HTTPS 解决了 HTTP 的哪些问题?
HTTP由于是明文传输,所以安全上存在三个风险:
- 窃听风险
- 篡改风险
- 冒充风险
HTTPS 在 HTTP 与 TCP 层之间加⼊了 SSL/TLS 协议,可以很好的解决了上述的风险:
- 信息加密
- 校验机制
- 身份证书
HTTPS是如何解决上面的三个风险的?
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
HTTPS是如何建立连接的?其间交互了什么?
SSL/TLS协议基本流程:
- 客户端想服务器索要验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
HTTPS的应用数据是如何保证完整性的?
HTTPS一定安全可靠吗?
HTTP/1.1、HTTP/2、HTTP/3演变
HTTP/1.1 如何优化?
如何避免发送HTTP请求?
如何减少HTTP请求次数?
如何减少HTTP响应的数据大小?
HTTPS RSA 握手解析
TLS握手过程
RSA握手过程
RSA算法的缺陷
HTTPS ECDHE握手解析
HTTPS如何优化?
HTTP/2 牛逼在哪?
HTTP/3强势来袭
既然有HTTP协议,为什么还要有RPC?
既然有HTTP协议,为什么还要有WebSocket?
二、TCP
TCP三次握手与四次挥手面试题
TCP重传、滑动窗口、流量控制、拥塞控制
TCP实战抓包分析
TCP半连接队列和全连接队列
如何优化TCP?
如何理解是TCP面向字节流协议?
为什么TCP每次建立连接时,初始化序列号都要不一样呢?
SYN报文什么时候情况下会被丢弃?
已建立连接的TCP,收到SYN会发生什么?
四次挥手中收到序的FIN包会如何处理?
在TIME_WAIT状态的TCP连接,收到SYN后会发生什么?
TCP连接,一端断电和进程崩溃有什么区别?
拔掉网线后,原本的TCP连接还存在吗?
tcp_tw_reuse 为什么默认是关闭的?
HTTPS 中 TLS 和 TCP 能同时握手吗?
TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
TCP协议有什么缺陷?
如何基于UDP协议实现可靠传输?
服务端没有isten,客户端发起连接建立,会发生什么?
用了TCP协议,数据一定不会丢吗?
TCP四次挥手,可以变成三次吗?
TCP序列号和确认号是如何变化的?
三、IP
IP基础知识全家桶
ping 的工作原理
断网了,还能ping通127.0.0.1吗?
四、网络安全
说说有哪些安全攻击?
DNS 劫持了解吗?
什么是 CSRF 攻击?如何避免?
什么是 DoS、DDoS、DRDoS 攻击?
什么是 XSS 攻击,如何避免?
对称加密与非对称加密有什么区别?
RSA 和 AES 算法有什么区别?
资料
- 小林图解网络
- 二哥的Java进阶之路:面渣逆袭-计算机网络
- JavaGuide-计算机网络常见面试题总结