Web安全是指保护Web应用程序、网站以及相关网络资源免受各种威胁和攻击的过程。它涵盖了多个方面,以下是详细介绍:
1. Web安全的定义
Web安全主要是指在互联网环境下,保障Web应用程序、网站以及相关网络资源的机密性、完整性和可用性。它涉及防止未经授权的访问、数据泄露、恶意代码注入、服务中断等各种安全威胁。
正向代理和反向代理是代理服务器的两种主要类型,它们在部署位置、服务对象、用途等方面有本质区别。以下是详细对比和定义:
核心定义
代理类型 | 定义 | 服务对象 | 典型场景 |
---|---|---|---|
正向代理 | 位于客户端前方,代表客户端向外部服务器发起请求(隐藏客户端身份)。 | 客户端(用户) | 科学上网、内网访问外网、内容过滤 |
反向代理 | 位于服务器前方,代表服务器接收客户端请求(隐藏服务器身份,负载均衡)。 | 服务器 | 网站加速、高可用、安全防护 |
核心区别对比
维度 | 正向代理(Forward Proxy) | 反向代理(Reverse Proxy) |
---|---|---|
部署位置 | 客户端网络或客户端本地(如浏览器配置) | 服务器端网络(如机房入口) |
隐藏对象 | 隐藏客户端(服务器不知道真实请求来源) | 隐藏服务器(客户端不知道真实服务提供者) |
配置主体 | 由客户端主动配置(如设置代理IP/端口) | 由服务器管理员配置(客户端无感知) |
主要功能 | 突破访问限制、匿名访问、缓存加速 | 负载均衡、安全防护、SSL卸载、缓存加速 |
访问逻辑 | 客户端 → 正向代理 → 目标服务器 | 客户端 → 反向代理 → 实际服务器(集群) |
典型工具 | Shadowsocks、Squid、VPN | Nginx、HAProxy、Cloudflare CDN |
工作原理图示
正向代理
|
|
反向代理
|
|
典型应用场景
正向代理
- 科学上网:通过境外代理服务器访问被封锁的网站(如Google)。
- 企业内网管控:员工上网必须经过代理,用于日志审计或内容过滤。
- 本地缓存加速:代理缓存常用资源(如Squid缓存YouTube视频)。
反向代理
- 负载均衡:将用户请求分发到多台后端服务器(如Nginx轮询策略)。
- 安全防护:隐藏真实服务器IP,防御DDoS攻击(如Cloudflare)。
- SSL终结:由反向代理处理HTTPS加密/解密,减轻后端压力。
- 动静分离:代理服务器直接返回静态资源(如CDN边缘节点)。
关键联系
- 都是“中间人”:
- 均作为客户端与服务器之间的中介,转发请求和响应。
- 均可实现缓存:
- 正向代理缓存客户端常用数据,反向代理缓存热点内容。
- 均可提升安全性:
- 正向代理隐藏客户端,反向代理保护服务器。
常见误区澄清
- “VPN是反向代理” ❌
- VPN属于正向代理,它代表客户端访问外部资源。
- “CDN是正向代理” ❌
- CDN是反向代理的延伸,代表服务器向客户端分发内容。
- “Nginx只能做反向代理” ❌
- Nginx也可配置为正向代理(需手动启用
ngx_http_proxy_module
)。
- Nginx也可配置为正向代理(需手动启用
选择建议
- 用正向代理:
需要控制客户端出口流量或绕过访问限制时(如企业内网、跨境访问)。 - 用反向代理:
需要保护服务器、提升服务稳定性或优化访问速度时(如Web服务、API网关)。
总结
- 正向代理是“客户端的代言人”,反向代理是“服务器的守门人”。
- 两者互补,现代架构中可能同时存在(如企业员工通过正向代理上网,公司官网通过反向代理提供服务)。
- 反向代理是云计算和微服务架构的核心组件(如Kubernetes的Ingress、API网关)。
TCP(传输控制协议)通过多种机制确保数据的可靠传输,以下是其核心机制及工作原理:
1. 三次握手建立连接
- 目的:确保双方通信能力正常,同步初始序列号(ISN)。
- 过程:
- 客户端发送
SYN
(同步序列号)报文。 - 服务端回复
SYN-ACK
(确认+同步)。 - 客户端发送
ACK
确认。
- 客户端发送
- 作用:避免历史重复连接导致的资源浪费,为后续数据传输奠定基础。
2. 数据分块与序列号
- 分块(Segmentation):将数据分割为适合传输的MSS(最大报文段大小)。
- 序列号(Sequence Number):每个字节分配唯一序列号,标识数据顺序。
- 作用:接收方按序列号重组数据,解决乱序或重复问题。
3. 确认应答(ACK)与超时重传
- ACK机制:接收方收到数据后,发送
ACK
确认(值为期望收到的下一个序列号)。- 示例:发送序列号1-1000的数据,接收方回复
ACK 1001
。
- 示例:发送序列号1-1000的数据,接收方回复
- 超时重传:
- 发送方未收到
ACK
时,启动重传计时器(RTO动态调整)。 - 超时后重发数据,多次失败则断开连接。
- 发送方未收到
4. 滑动窗口与流量控制
- 滑动窗口:发送方维护一个窗口,允许连续发送多个报文段(无需逐个等待
ACK
)。- 窗口大小:由接收方通过
TCP头部
的窗口字段
动态通知(流量控制)。
- 窗口大小:由接收方通过
- 流量控制:防止接收方缓冲区溢出。若缓冲区满,窗口大小设为0,发送方暂停发送(通过零窗口探测保持同步)。
5. 拥塞控制
- 目的:避免网络过载,动态调整发送速率。
- 核心算法:
- 慢启动:窗口从1开始指数增长,直到阈值(
ssthresh
)。 - 拥塞避免:窗口线性增长,避免激进发送。
- 快重传:收到3个重复
ACK
时立即重传(无需等待超时)。 - 快恢复:重传后窗口降为阈值,进入拥塞避免阶段。
- 慢启动:窗口从1开始指数增长,直到阈值(
6. 四次挥手释放连接
- 过程:
- 主动方发送
FIN
。 - 被动方回复
ACK
(半关闭状态)。 - 被动方发送
FIN
。 - 主动方回复
ACK
,进入TIME_WAIT
状态(等待2MSL确保最后一个ACK
到达)。
- 主动方发送
- 作用:确保双方资源释放,处理延迟报文。
7. 其他辅助机制
- 校验和:通过CRC校验检测数据损坏,丢弃错误报文(触发重传)。
- 选择性确认(SACK):允许接收方告知缺失的数据块,减少不必要的重传。
总结
TCP通过连接管理、序列号、确认重传、滑动窗口、拥塞控制等机制,在不可靠的IP层上实现了:
状态码 | 定义 |
---|---|
1xx 报告 | 接收到请求,继续进程 |
2xx 成功 | 步骤成功接收,被理解,并被接受 |
3xx 重定向 | 为了完成请求,必须采取进一步措施 |
4xx 客户端出错 | 请求包括错的顺序或不能完成 |
5xx 服务器出错 | 服务器无法完成显然有效的请求 |
403: Forbidden
一、OSI,TCP/IP,五层协议的体系结构,以及各层协议
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
TCP三次握手
- 第一次握手🤝: 客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,客户端进程进入了 SYN-SENT状态,等待服务器的确认。
- 第二次握手🤝: 服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,服务器进程进入了SYN-RCVD状态,询问客户端是否做好准备。
- 第三次握手🤝: 客户端进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,连接建立,客户端进入ESTABLISHED状态,服务器端也进入ESTABLISHED状态。
为什需要三次,两次不行吗?
假如现在客户端想向服务端进行握手,它发送了第一个连接的请求报文,但是由于网络信号差或者服务器负载过多,这个请求没有立即到达服务端,而是在某个网络节点中长时间的滞留了,以至于滞留到客户端连接释放以后的某个时间点才到达服务端,那么这就是一个失效的报文,但是服务端接收到这个失效的请求报文后,就误认为客户端又发了一次连接请求,服务端就会想向客户端发出确认的报文,表示同意建立连接。 假如不采用三次握手,那么只要服务端发出确认,表示新的建立就连接了。但是现在客户端并没有发出建立连接的请求,其实这个请求是失效的请求,一切都是服务端在自相情愿,因此客户端是不会理睬服务端的确认信息,也不会向服务端发送确认的请求,但是服务器却认为新的连接已经建立起来了,并一直等待客户端发来数据,这样的情况下,服务端的很多资源就没白白浪费掉了。 采用三次握手的办法就是为了防止上述这种情况的发生,比如就在刚才的情况下,客户端不会向服务端发出确认的请求,服务端会因为收不到确认的报文,就知道客户端并没有要建立连接,那么服务端也就不会去建立连接,这就是三次握手的作用
TCP断联四次挥手
- 第一次挥手👋: 客户端进程发出连接释放FIN报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=x,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
- 第二次挥手👋: 服务端进程收到连接释放FIN报文,发出确认ACK报文,ACK=1,ack=x+1,并且带上自己的序列号seq=y,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。此时,服务端通知高层的应用进程,客户端向服务端的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务端若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务端的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,在这之前依然可以接收服务端发送过来的最后的数据。
- 第三次挥手👋: 服务端将最后的数据发送给客户端完成后,就向客户端发送连接释放FIN报文,FIN=1,ack=x+1,此时的序列号为seq=z,此时,服务端就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手👋: 客户端接收到服务端的连接释放FIN报文后,必须发出确认报文,ACK=1,ack=z+1,而自己的序列号是seq=x+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。此时服务端收到客户端发送过来的确认报文,就立即撤销自己的传输控制块TCB,进入CLOSED状态,注意此时的TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,客户端没有收到服务端发来的任何数据,证明服务端已正常关闭,此时客户端会撤销相应传输控制块TCB后,进入CLOSED状态。至此,TCP的连接才真正的断开了。(服务端结束TCP连接的时间要比客户端稍微早一些)
为什么TIME_WAIT状态还需要等2*MSL(Max SegmentLifetime,最大分段生存期)秒之后才能返回到CLOSED状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SENT状态到ESTABLISH状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
什么是二层与三层交换机?
通常情况下,OSI模型分为七层:应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。
二层交换机工作于OSI模型的二层(数据链路层),故而称为二层交换机,主要功能包括物理编址、错误校验、帧序列以及流控。 而三层交换机位于三层(网络层),是一个具有三层交换功能的设备,即带有三层路由功能的二层交换机,但它是二者的有机结合,并不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。