计算机网络体系架构?
- OSI结构:理论上的
- 7应用层:定义了应用进程间通信和交互的规则,常见协议有HTTP、SFTP、DNS、WebSocket、RTMP
- 6表示层:数据的表示、安全、压缩。确保一个系统的应用层所发消息能被另一个系统的应用层读取。GIF、JEPG
- 5会话层:建立、管理、终止会话,是用户应用程序和网络之间的接口。RPC、SQL
- 4传输层:提供源端和目的端之间提供可靠的透明数据传输,传输层协议为不同主机上运行的进程提供了逻辑通信。TCP、UDP、SSH
- 3网络层:将网络地址翻译成对应的物理地址,实现不同网络之间的路径选择,寻址,路由。ICMP、IGMP、IP等
- 2数据链路层:在物理层提供比特流服务的基础上、建立像零件点之间的数据链路。
- 1物理层:建立、维护、断开物理连接。
- TCP/IP结构:实际上的 应用 传输 网络 链路层
- 五层结构:为了介绍原理而折中的,在这个基础上层层包装层层拆包
- 分层设计使得TCP/IP具有高度的模块化和灵活性,能够在不同类型的硬件和网络结构中使用
为什么要解析域名?
- ip可能会变,域名可以不变,更灵活
- 一个域名可能会对应多个ip地址以负载均衡
- 域名更容易记忆
DNS的迭代查询和递归查询?
递归查询举例:
客户端想要解析 www.example.com
的IP地址,发送请求到本地DNS解析器:
-
本地解析器查询根DNS服务器。
-
根DNS服务器返回 .com TLD服务器地址。
-
本地解析器查询 .com TLD服务器。
-
.com TLD服务器返回
example.com
的权威DNS服务器地址。 -
本地解析器查询
example.com
的权威DNS服务器。 -
权威DNS服务器返回
www.example.com
的IP地址。 -
本地解析器将IP地址返回给客户端。
迭代查询举例:
客户端想要解析 www.example.com
的IP地址,依次查询各个DNS服务器:
-
客户端查询本地DNS解析器。
-
本地解析器查询根DNS服务器。
-
根DNS服务器返回 .com TLD服务器地址。
-
本地解析器将 .com TLD服务器地址返回给客户端。
-
客户端查询 .com TLD服务器。
-
.com TLD服务器返回
example.com
的权威DNS服务器地址。 -
客户端查询
example.com
的权威DNS服务器。 -
权威DNS服务器返回
www.example.com
的IP地址。 -
客户端获取到IP地址。
结论
递归查询和迭代查询是DNS查询的两种方式,各有优缺点。递归查询对客户端友好,但增加了本地DNS解析器的负担;迭代查询对解析器负担小,但增加了客户端的复杂性。实际应用中,客户端通常会使用递归查询,通过本地DNS解析器处理大部分的查询过程。
DNS解析过程?
常见端口:
- 22:SSH
- 53:DNS解析
- 80:HTTP
- 443:HTTPS
- 1080:sockets
- 3306:mysql
常见状态码:
- 1XX:临时的响应,客户端应继续请求。
- 2XX:请求已成功被服务器接收。
- 3XX:用来重定向。
- 4XX:请求可能出错。
- 5XX:服务器在尝试处理请求时发生了错误。
-
404:表示客户端(如浏览器)请求的资源在服务器上不存在
-
501:状态码501表示服务器不支持请求的方法,或者服务器无法完成请求。具体来说,501状态码表示服务器没有能力处理请求所需的功能。这通常意味着服务器不支持当前请求的HTTP方法(如GET、POST、PUT、DELETE等)。
-
502:状态码502表示作为网关或代理的服务器从上游服务器收到无效响应。
-
503:服务器无法处理请求
-
504:网关超时
GET和POST的区别?
- 传参方式不同,一个在URL一个在请求体
- 幂等性
- GET大部分都被CDN缓存起来了
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
- 报文主体
- 报文首部
- 响应报文
- 报文首部
- 状态行
- 响应首部字段
- 通用首部字段
- 实体首部字段
-
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>
- 报文主体
- 报文首部
URI 和 URL 有什么区别?
- URI,统一资源标识符(Uniform Resource Identifier, URI)
- URL,统一资源定位符(Uniform Resource Location),它是 URI 的一种子集,主要作用是提供资源的路径。
HTTP 1-3的区别?
- 1.0
- 无状态协议:着每次客户端与服务器之间的请求和响应都是独立的、无关联的。服务器不会自动记录或记住客户端的任何请求上下文或状态。可以通过cookie和session来确保关联性。
- 非持久连接,但是建立连接会花费时间,可设置Connection:keep-alive强制开启长连接()
- 1.1:
- 优点:跨平台,灵活
- 一个域名可以建立6个TCP连接
- 持久连接
- 支持在前一个响应到达之前发送下一个
- 队头阻塞问题:如果第一个响应阻塞了,那么即使后面的响应准备好了也发不出去,通过并行多个TCP连接减缓
- 针对同一域名的请求有一定数量的限制,超过限制就会被阻塞。
- 2.0:
- 采用二进制协议(在应用层和传输层之间加了二进制分帧层),所以grpc基于2.0的话传递的时候是通过byteArray实现的,以前的是文本
- 只能建立一个
- 多路复用,一个TCP连接上进行多个HTTP请求或者响应,多个请求分解成独立的帧,交错发送,解决了HTTP 1.x的队头阻塞问题,乱序发送,在另一端再重新组合
- 头部压缩,减少带宽消耗,表示层实现gzip压缩
- 但是没有解决TCP的队头阻塞,因为TCP本身的可靠性和顺序性,虽然是乱序发送。但是TCP会按照顺序将这些数据包组成原始数据,如果某一个数据包没有按照顺序到达,就会保持连接等待数据包的返回,就会阻塞后续请求
- 3.0:
- 3.0 基于 QUIC 协议,Quick UDP Connections
- 真正实现了不同的流之间独立传输,2.0仍然需要保证顺序
- 在传输过程就完成了TLS三次握手
- 如何保证可靠性
- 内置的前向纠错和重传
- 编码:堆原始数据通过特定的编码算法进行编码生成纠错码
- 传输:连同纠错码一起发送
- 解码:接收到数据后解码并纠正,恢复原始数据
- 前向纠错会增加带宽需求,高效的重传才是主要的SACK,快速重传
- 流量控制和拥塞控制
- 内置的前向纠错和重传
HTTP长连接相关参数:
- keep-alive
- keep-alive timeout
- TCP中也有三个参数,闲置多久之后就会间隔一个时间发送侦测包,发生这么多次没有响应就断开连接
HTTP和HTTPS
- 在HTTP的基础上加入了SSL(安全套接字)/TLS(传输层安全)协议,确保传输过程是加密的。
- 解决了什么问题:
- 安全问题
- TLS握手:
- 客户端相服务器发送ClientHello消息,包括支持的TLS版本、随机数等等
- 服务器回应ServerHello,选择一个客户端提议的版本,并发送数字证书
- 客户端验证证书的合法性,生成一个对话密钥通过公钥加密后发送给服务器
- 服务器私钥解密得到对话密钥
- 加密通信
- 涉及到了对称加密和非对称加密
- 握手阶段密钥交换就是非对称
- 传输就是对称
- HTTPS就一定安全吗?
- 如果密钥泄露,就会被揭秘消息
- 每一次HTTPS都是新的密钥
- 如何保证的安全性和数据完整性?
- 拿到证书后会向CA询问证书与服务器是否匹配
- 还使用了消息验证码(MAC)来验证数据的完整性。每次传输的数据包都会生成一个 MAC 值,接收方使用相同的算法和密钥重新计算并验证。(通过哈希函数或者消息摘要算法对数据生成)
HTTP缓存技术?
- 通过头部字段
- 强制缓存
- Cache-Control进行控制
- Expires:过期时间
- 对比缓存
- ETag:标识资源版本
- Last-Modified:最后修改时间
- 强制缓存
- 缓存位置:浏览器、代理、CDN
输入一个url全过程?
当用户键入一个URL时,涉及了DNS、TCP、IP、HTTP/HTTPS、SSL/TLS协议
- 首先会向DNS服务器发起一个DNS请求
- DNS解析:检查浏览器缓存、检查本地DNS服务器、向根域名服务器发起请求,返回顶级域名服务器,请求顶级域名服务器后会返回权威域名服务器,再进行请求返回ip地址
- 得到ip之后就会发起TCP连接,如果是HTTPS的话,还有TLS(传输层安全协议)/SSL(安全套接字)的握手
- 客户端发起请求,携带着自己支持的版本这些+随机数clienthello
- 服务端选择版本后,回复一个随机数serverhello
- 然后服务端将CA证书(包含公钥、颁发机构、证书的有效信息这些)发回去。
- 然后客户端校验证书然后生成一个公钥加密的对话密钥加密信息
- 服务端私钥解密通信,最后就是加密通信啦
- 接下来就是HTTP请求的构造,包括请求行、请求头、请求体等等
- 请求行:方法、URL、HTTP的协议版本等
- 请求头:
- 主要有请求头部、通用头部、实体头部
- 请求首部字段就是一些:host、cookie以及一些客户端信息
- 通用的话就是keepalive这种
- 实体的话就是content-type、content-length等等这种
- 然后从应用层-传输层-网际层-数据链路层-物理层,层层包装发送数据
- 服务端收到消息,首先DMA拷贝到内存中,发起硬中断,然后cpu响应发起软中断,走内核网络协议栈2,3,4层,关联到socket的buffer里,就可以读写等
- 请求被Tomcat接收后,经过过滤器链(在web容器中),分发到dispatchServlet,然后请求handlermapping由哪个handler处理,到达handler的前面可能会经过一系列的拦截器
- 然后处理请求,最后返回响应,通常就是经过拦截器后置处理器等等返回给客户端。
- 客户端渲染。
TCP相关问题?
- 三次握手改两次会怎么样
- 1、如果两次就建立连接,无法防范SYN洪泛攻击
- 2、确认客户端接收到了消息,如果客户端没收到浪费了系统资源
- 3、防止因为网络堵塞而很久后才收到的SYN而建立连接浪费资源
- 每一次没收到会怎样?
- 第一次会重传到最大重传次数
- 第二次服务端阻塞在accept(),等待客户端ack
- 第三次重传超过次数后,accept()返回-1,建立连接失败。客户端发送消息,服务端会回传RST报文。
- 四个特性?
- 可靠性:ACK、校验和、seq、重传机制
- 面向连接:三次握手、三次挥手
- 字节流传输:序列号,流量控制
- 拥塞控制
TCP的流量控制:
- 三次握手协商窗口大小,单位是字节,最大是(2^16-1)<<14有个窗口扩展选项,大概1G
- 会约定每次最多能发多少
- 发送方窗口
- 接收方窗口
拥塞控制:
- 避免出现拥堵时,发送方的数据填满整个网络
- 发送方维护一个cwnd,发送窗口rwnd的值是cwnd和滑动窗口可以接收窗口的min,这里单位是MSS(一般1460字节)
- 慢启动:
- 探测网络拥堵情况,每收到一个ACK,cwnd+1,单位是MSS,呈指数递增
- 拥塞避免:
- 当cwnd到达慢启动阈值sshresh,进入拥塞避免
- 每收到一个ACK,cwnd=cwnd+1/cwnd,每个RTT就是+1
- 拥塞发生:
-
如果是RTO超时重传
- sshresh=cwnd/2
- cwnd=1
- 进去慢启动
- 如果是快速重传
- cwnd=cwnd/2
- sshresh=cwnd
- 进入快速恢复
-
- 快速恢复
- 快速恢复算法认为,还有 3 个重复 ACK 收到,说明网络也没那么糟糕,所以没有必要像 RTO 超时那么强烈。
- cwnd和sshresh已经被更新了
- cwnd=sshresh+3,重传重复的那几个ACK,即丢失的那几个数据包
- 再收到重复的cwnd=cwnd+1
- 新的的话,cwnd=sshresh,再次进入拥塞避免
TCP的超时重传机制?
- RTO,一定时间内没收到ACK,就触发,这个时间有算法
- 快速重传,发送的数据有序列号,保证有序
在上图,发送⽅发出了 1,2,3,4,5 份数据:
- 第⼀份 Seq1 先送到了,于是就 Ack 回 2;
- 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
- 后⾯的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
- 发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
- 最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。但是在这期间不知道345收到了吗。
- SACK,带确认的,ACK还是指向没收到的位置
- D-SACK:告诉发送方哪些报文重复接收了,比如ACK没有到达,发送方重传了
- ACK(Acknowledgment)号在TCP中代表的是接收方期望从发送方接收到的下一个字节的序列号。
- SACK一个代表在快速重传的时候接收到了哪些
- 一个代表了重复接收了哪些,在发送方没有收到ACK的情况重发的情况下
TCP和UDP的区别?
- 可靠性:校验和、序列号、ack,RTO,快速,拥塞控制,流量控制
- 传输形式(前者字节流,后者数据段报文)
- 传输效率:UDP不确认,不重传,没有超时,没有序列号,没有流量控制和拥塞控制,但是QUIC实现了
- 所需资源
- 首部字节20-60,UDP8个
- 面向连接
- 有序性
什么是UDP的广播和多播?
- 广播是指将UDP数据发送到网络中的所有设备。通常在局域网内的通信
-
- 网络地址:
192.168.1.0
(网络的第一个地址,用于标识网络) - 可用的主机地址:从
192.168.1.1
到192.168.1.254
- 广播地址:
192.168.1.255
(网络的最后一个地址,用于广播)
- 网络地址:
- 多播是一种比广播更精细的通信方式,允许数据报文段发送到一组特定的设备,是一种订阅机制,只有加入了特定多播组的设备才能接收到数据报。
-
- 比起广播效率更高
- 选择性
- 可以跨越网络,而广播限制在局域网
TCP和UDP可以共用一个端口吗?
- 端口空间是独立的,可以共用,四元组,TCP和UDP端口号不一样
IP协议的定义和作用?
- 定义数据包的格式和处理规则
- 作用:
- 寻址
- 路由
- 分片和重组
ICMP协议的功能?
- 面向无连接的协议,用于传输出错报告控制信息
- 包括报告错误、状态信息等
- 当遇到IP无法访问,会自动发送ICMP
ping的原理?
- 一个网络工具,主要用来测试网络连接的可达性和延迟。
-
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),以及可能的丢包情况。
Cookie和Session的区别?
- 一个在客户端一个在用户端
- 一个可以存储一些浏览器缓存,然后可以将sessionid存在http头带过去
- cookie安全性问题,遵循ascii,session存的类型就比较多
跨域问题?
- 只要协议、域名、端口号其中一个不一样浏览器就会认为是跨域
- 通过设置 HTTP 头部(如
Access-Control-Allow-Origin
)来明确允许特定的跨域请求 - 代理服务器: 在服务器端设置代理,将跨域请求转发给目标服务器,绕过浏览器的跨域限制
常见的TCP攻击手段?
- 重放攻击是一种网络攻击,攻击者截获并记录合法通信的一部分,然后在稍后的时间重放这些数据,以伪装成合法的一方进行欺骗或者恶意目的。
- 解决:时间戳,随机数
- 中间人攻击是:攻击方与通信两端创建独立的联系,然后交换数据,让通信两端以为是私密直接通信,事实上被完全控制。
- 解决:确保访问HTTPS网站
- 常见的:wifi欺骗,ssl劫持:就是指在访问不安全的HTTP站点的时候,就会重定向到安全的https,就可以劫持重定向的过程,到不安全的地方。
- SYN FLOOD洪范攻击,压满半连接队列,属于DDOS启用防火墙,syn cookie,收到请求后不分配资源,通过生成一个cookie验证后续的请求
- RST攻击,伪造重置,使关闭连接,使用TCP MD5签名等方法保护TCP头部,确保RST包的真实性。因为SSL/TLS不对TCP报头加密。
- 伪造ACK包拥塞攻击,属于DDOS
常见的攻击?
- CSRF攻击( Cross-site request forgery),跨域请求伪造,是一种挟持用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
- 防止:检查Referer字段,添加校验的token,敏感操作需要验证码验证。
- DOS攻击:拒绝服务,攻击者通过向目标系统发送大量无效请求或数据,耗尽系统的资源(如带宽、处理能力或内存),从而使合法用户无法访问该服务。
- DDOS:是指处于不同位置的多个攻击者(肉鸡)同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器,并利用这些机器对受害者同时实施攻击。
- DRDoS :中文是分布式反射拒绝服务,该方式靠的是发送大量带有被害者 IP 地址的数据包给中间服务(如DNS服务器),然后中间服务对 IP 地址源做出大量回应,从而形成拒绝服务攻击。
- 措施:
- 利用“蜜网”防护,加强对攻击工具和恶意样本的第一时间分析和响应。
- 利用云计算和虚拟化等新技术平台,提高对新型攻击尤其是应用层攻击和低速率攻击的检测和防护的效率。
- 使用分布式系统,做好监控
- 阿里云云盾
- 没有办法完全避免,只能说提高黑客进攻成本
RSA算法和AES算法区别?
- RSA非对称
- AES对称
拆包粘包?
- 要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
- 要发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。即 TCP 报文长度 - TCP 头部长度 > MSS。
- 解决?
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。
浏览器是怎么直到网站危险的?
- SSL/TLS证书问题:有效性,颁发机构CA,证书匹配等
- HTTP/HTTPS,HTTP会提示不安全
- 浏览器自身的安全数据库
- 浏览器会检查网站的内容策略安全头
- 用户报告这些