一、http状态码
2xx:成功
200:请求成功。一般用于GET与POST请求。
201:已创建。成功请求并创建了新的资源。请求已被实现,而且有一个新的资源已经依据请求的需要而建立(通常是在 POST 或 PUT 请求之后)。
202:已接受。已经接受请求,但未处理完成。最终该请求可能会也可能不会被执行。
3xx:重定向
301:永久重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。未来任何新的请求都应使用新的URI代替。
302:临时重定向。但资源只是临时被移动到新URI,客户端本次使用新的URI。未来的请求客户端应继续使用原有URI。
304 : 未修改。用于缓存控制。客户端发送带条件的 GET 请求(例如 If-Modified-Since
)后,如果资源自指定时间以来未被修改,服务器会返回此状态码,告诉客户端直接使用本地缓存版本。
4xx:客户端错误
400:客户端请求的语法错误,服务器无法理解。
401:未授权。请求需要用户认证。客户端必须提供认证信息(如用户名/密码)。通常第一次返回时,会带有 WWW-Authenticate
头,提示客户端如何认证。
403:资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404:未找到。服务器无法找到请求的资源。这是最常见的错误码之一,通常是因为 URL 拼写错误或资源已被删除。
5xx:服务端错误
500:服务器内部错误,无法完成请求。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。可能是代码 Bug、数据库连接失败等。
501:服务器不支持请求的功能,无法完成请求。
502:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应。
503:服务不可用。服务器当前无法处理请求(由于超载或停机维护)。通常,这是临时状态,可能伴随 Retry-After
头告知客户端何时可以重试。
504:网关超时。作为网关或代理的服务器,未能及时从上游服务器收到响应。
二、HTTP请求报文由3部分组成(请求行+请求头+请求体):
常见的请求头包括:
-
Host:指定请求的服务器的域名和端口号(HTTP/1.1必需字段)。
Host: www.example.com
-
User-Agent:告诉服务器客户端的类型(浏览器、操作系统等)。
User-Agent: Mozilla/5.0...
-
Accept:声明客户端可以处理的内容类型。
Accept: text/html,application/json
-
Content-Type:(通常在请求体中有时才有)声明请求体的媒体类型。
Content-Type: application/json
-
Content-Length:声明请求体的长度(以字节为单位)。
-
Authorization:包含用于验证客户端身份的凭证(如Token)。
Authorization: Bearer <token>
-
Cookie:将之前服务器通过Set-Cookie发送的cookie返回给服务器。
请求体是报文最后一部分,并不是所有请求都有请求体。它用于携带需要发送给服务器的数据。
-
GET, HEAD, DELETE, OPTIONS 等方法通常没有请求体。
-
POST, PUT, PATCH 等方法通常有请求体,用于提交表单数据、上传文件或发送API参数。
请求体中数据的格式由 Content-Type
头来指定。
-
application/x-www-form-urlencoded
:普通的表单数据。key1=value1&key2=value2
-
application/json
:JSON格式的数据。{"username": "john", "age": 30}
-
multipart/form-data
:用于上传文件。
请注意,在请求头和请求体之间,有一个空行(CRLF),这是必不可少的,因为它用来分隔报文的首部和主体。
三、http和https的区别
Http协议运行在TCP之上,明文传输
Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP
- 端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
- 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
- 开销:Https通信需要证书,而证书一般需要向认证机构购买;
四、对称加密和非对称加密
对称加密:是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
非对称加密:是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
HTTPS采用对称加密+非对称加密
-
用非对称加密的安全性来交换一个对称密钥。
-
用对称加密的高效率来加密实际传输的数据。
发送密文的一方使用对方的公钥进行加密处理“对称密钥”,然后对方用自己的私钥解密拿到“对称密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。
五、数字证书
客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密服务端发过来的签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。
六、https工作流程
javascript - 深入理解HTTPS工作原理 - 前端工匠公众号 - SegmentFault 思否
1.客户端发起一个HTTPS请求,先建立TCP连接,TCP连接成功,双方可以开始进行TLS握手。
2.客户端向服务器发送一条消息,内容包括TLS协议版本、客户端生成的随机数、支持的密码套件列表等。
3.服务器端响应客户端,内容包括TLS协议版本、服务端生成的随机数、从客户端列表中选择的一个密码套件、服务器的 SSL 证书。
3.客户端验证SSL证书:比如是否在有效期内,是否由可信的证书颁发机构(CA) 签发,域名是否与访问的域名一致,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.客户端使用伪随机数生成器生成对称密钥,然后用SSL证书的公钥加密这个对称密钥,发送给服务器端。
5.服务器端使用自己的私钥解密这个消息,得到对称密钥。至此,客户端和服务器端r双方都持有了相同的对称密钥。
6.服务器端使用对称密钥加密“明文内容A”,发送给Client。7.客户端使用对称密钥解密响应的密文,得到“明文内容A”。
8.客户端再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后服务器端使用对称密钥解密密文,得到“明文内容B”。
七、TCP与UDP的区别
特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
---|---|---|
连接性 | 面向连接的 传输数据前必须三次握手建立连接 | 无连接的 无需建立连接,直接发送数据 |
可靠性 | 可靠的 通过确认应答、重传机制、流量控制、拥塞控制确保数据不丢失、不重复、无差错、按序到达 | 不可靠的 尽最大努力交付,不保证数据一定到达,可能丢失、乱序 |
首部开销 | 大 (20-60字节) 包含大量控制信息(序列号、确认号、窗口大小等) | 小 (8字节) 只有源端口、目的端口、长度、校验和 |
传输速度 | 慢 由于建立连接、确认、重传等机制,延迟较高 | 快 没有控制开销,延迟低,实时性好 |
数据顺序 | 保证顺序 通过序列号和排序机制,接收方收到的数据是有序的 | 不保证顺序 即使发送有序,也可能乱序到达 |
拥塞控制 | 有 复杂的算法(慢启动、拥塞避免等)来适应网络状况,避免网络瘫痪 | 无 无论网络是否拥堵,都以恒定速率发送数据 |
通信模式 | 点对点 一条TCP连接只能有两个端点(一对一) | 支持一对一、一对多、多对多 支持广播和多播 |
八、TCP三次握手与四次挥手
(1). 三次握手(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):
首先,是三次握手,它的目的是在通信双方之间同步序列号并建立一条可靠的连接。
-
第一步:客户端发送一个 SYN 包(
SYN=1
)到服务器,并选择一个初始序列号seq = J(随机)
。此时客户端进入SYN-SENT
状态。 -
第二步:服务器收到SYN包后,如果同意连接,会回复一个 SYN+ACK 包(
SYN=1, ACK=1
)。这个包包含两个信息:一是服务器自己的初始序列号seq = K(随机)
,二是对客户端SYN的确认ack = J + 1
。此时服务器进入SYN-RCVD
状态。 -
第三步:客户端收到服务器的SYN+ACK包后,会再发送一个 ACK 包(
ACK=1
)进行最终确认。包中的确认号ack = K + 1
。服务器收到这个ACK后,双方就都进入ESTABLISHED
状态,连接建立成功,可以开始数据传输。
为什么TCP链接需要三次握手,两次不可以么,为什么
为了防止 已失效的链接请求报文突然又传送到了服务端,导致错误和资源浪费。
假设只有两次握手。客户端发送了一个SYN请求,但这个包在网络中滞留了(旧SYN包
)。客户端超时后重发了一个新的SYN包并成功建立连接。传输完成后,连接关闭。此时,那个旧SYN包
终于到达了服务器,服务器会认为这是一个新的连接请求,于是回复SYN-ACK并分配资源等待客户端数据传输。但客户端并不会理会这个回应,导致服务器的资源被白白浪费,一直空等。
(2). 四次挥手(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
-
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。
-
第二次挥手:服务器端收到FIN后,发送一个ACK确认包给客户端,服务器端进入CLOSE_WAIT状态,客户端收到ACK后进入
FIN-WAIT-2
状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务器端若发送数据,则客户端仍要接收。 -
第三次挥手:服务器端发送一个FIN,用来关闭服务器端到客户端的数据传送,服务器端进入LAST_ACK状态。
-
第四次挥手:客户端收到服务器的FIN包后,发送一个 ACK 包 进行确认,然后进入
TIME-WAIT
状态。服务器收到这个ACK后,就立即关闭连接。客户端会等待 2MSL(两倍报文最大生存时间)后,才最终关闭连接。
为什么客户端最后要等待2MSL
MSL 的定义:MSL (Maximum Segment Lifetime) 是报文最大生存时间。任何IP数据包在网络中存活的时间都不能超过这个值,超过的报文都会被网络设备丢弃。
- 服务器重传的FIN报文(最多经过1MSL到达客户端)。
- 客户端重传的ACK报文(最多经过1MSL到达服务器)。
-
保证连接可靠关闭:最后这个ACK包可能会丢失。如果客户端直接关闭,服务器会因收不到ACK而超时重传FIN包。处于
TIME-WAIT
状态的客户端收到重传的FIN后,可以重发ACK,确保服务器能正常关闭。 -
让旧报文在网络中消散:在网络状况复杂的情况下,一个连接中发送的报文可能会被延迟,假设我们关闭了一个连接(源IP、源端口、目的IP、目的端口这个四元组完全相同),然后又立即在原地址和原端口上建立了一个全新的连接。那个迟到的、属于旧连接的报文可能会被新连接接收,并被错误地解释为属于新连接的数据,造成数据混乱。等待2MSL时间,足以保证两个方向上的报文都已经完全消逝。
十、TCP协议如何来保证传输的可靠性
消除重复数据:接收方可以根据序列号丢弃重复的数据包。
保证数据有序:接收方可以根据序列号将乱序到达的数据包重新排序,再提交给应用层。
确认应答 (ACK):接收方收到数据后,必须向发送方发送一个确认报文(ACK包)。这个 ACK包中带有一个确认号,其值为 “期望收到的下一个字节的序列号”。通过这种方式,发送 方可以明确知道哪些数据已经被对方成功接收。
-
序列号与确认应答机制:
序列号 (Seq Number):TCP为每一个发送的字节都分配一个唯一的序列号。
-
超时重传机制:
发送方在发送一个数据包后,会启动一个定时器 (Timer)。
1.如果在定时器超时 (Timeout) 之前,收到了对应数据的ACK,则定时器取消。
2.如果直到定时器超时,还没有收到ACK,发送方就认为数据包已经丢失,会重新发送这个数据包。
智能的超时时间:TCP的超时时间(RTO, Retransmission Timeout)不是固定的,而是动态计算的。它根据数据包往返时间(RTT, Round-Trip Time)来自适应调整。如果网络延迟大,RTO就变大;如果网络畅通,RTO就变小,从而优化了重传效率。
-
连接管理机制:在传输数据之前,TCP必须通过三次握手建立可靠的连接,传输结束后通过四次挥手来可靠地断开连接。这确保了通信双方都做好了传输和接收的准备,并且所有数据都已经处理完毕。;
-
流量控制机制:
这是为了解决发送方和接收方之间速度不匹配的问题,防止发送过快导致接收方缓冲区溢出。
实现方式:滑动窗口 (Sliding Window)
接收方在每次发送ACK时,都会在TCP首部中的窗口大小 (Window Size) 字段告知发送方自己当前接收缓冲区的剩余空间大小(即接收能力)。
发送方会根据这个窗口值,动态调整自己发送数据的速度和数量,确保不会发送超过接收方处理能力的数据。
-
拥塞控制机制:通过慢启动、拥塞避免、快速重传和快速恢复算法,动态探测并适应网络带宽,防止发送过快导致网络拥堵。
十一、TCP的拥塞处理
这是为了解决发送方和网络之间速度不匹配的问题,防止发送过快导致网络链路拥堵甚至瘫痪。它是TCP最复杂的部分之一,主要包括四个算法:
-
1). 慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小;
2). 拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。
3). 快速重传:如果发送方连续收到3个重复的ACK,就推断某个数据包丢失了,而不必继续等待设置的重传计时器时间到期。
4). 快速恢复:在快速重传之后,不会像超时重传那样将cwnd直接重置为1,而是执行“乘法减小”,将cwnd设置为新的阈值(通常是当前值的一半),然后直接进入拥塞避免阶段,让性能恢复得更平滑。
十三、Get与POST的区别
特性 | GET | POST |
---|---|---|
语义 (Semantics) | 获取(Safe, Idempotent) | 提交/处理(Non-Idempotent) |
参数位置 | URL 的查询字符串 (Query String) | 请求体 (Request Body) |
数据大小限制 | 有(受限于URL长度,通常几KB) | 理论上无限制 |
安全性 | 参数在URL中明文显示,不安全 | 参数在请求体中,相对安全(但仍需HTTPS加密) |
缓存与书签 | 可被缓存、可收藏为书签 | 默认不被缓存、不可收藏为书签 |
幂等性 (Idempotent) | 幂等(多次请求效果相同) | 非幂等(多次请求可能产生不同效果) |
浏览器历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
TCP 数据包 | 只产生一个 TCP 数据包(Header和Data一并发送) | 产生两个 TCP 数据包(先发 Header,再发 Data) |
十四、Session 与 Cookie 的对比
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端(浏览器) | 服务器端(内存、数据库、文件等) |
安全性 | 较低。数据存储在客户端,可能被查看、篡改或禁用。 | 较高。敏感数据存储在服务器,客户端只看到无意义的ID。 |
生命周期 | 可设置为浏览器会话级(关闭浏览器即失效)或持久化(通过 Expires 或 Max-Age 设置过期时间) | 通常依赖于客户端的Cookie(Session ID)生命周期,也可在服务器端设置过期时间(如用户一段时间无活动则失效) |
存储容量 | 小(通常每个域名下最多4KB,且数量有限制,约50个) | 大(理论上只受服务器内存限制,但过大会影响性能) |
数据类型 | 只支持字符串(key-value形式) | 支持任意数据类型(对象、数组等) |
性能影响 | 不占用服务器资源。但每次HTTP请求都会自动携带,增加带宽。 | 占用服务器内存或CPU(查询数据库)。服务器资源开销大,尤其用户量多时。 |
跨域支持 | 可设置 Domain 和 Path 属性在一定范围内共享 | 默认不支持跨域,因为Session ID的Cookie通常受同源策略限制 |
十五、DDoS攻击
DDoS攻击是一种通过海量恶意流量耗尽目标资源,使其无法提供正常服务的网络攻击。它的核心特点是‘分布式’,来源难以追踪和屏蔽。
常见的类型有三类:一是流量型攻击,如UDP Flood,目的是打满带宽;二是协议型攻击,如SYN Flood,目的是耗尽服务器连接资源;三是更高级的应用层攻击,如HTTP Flood,模拟用户行为,消耗CPU和数据库资源。
关于防御,我认为需要一个综合的方案:
首先,在架构上要做好基础工作,比如使用CDN、负载均衡来分散流量,并隐藏源站IP。
其次,技术上是核心,对于大流量攻击,最主要的方式是使用云端高防服务进行流量清洗。对于应用层攻击,则需要配置WAF和速率限制策略。
最后,必须要有完善的监控告警和应急响应流程,以便在攻击发生时能快速发现并启动缓解措施。
“云端高防服务进行流量清洗” 的本质是:
通过DNS解析或IP牵引技术,将所有访问流量先引到具备超强带宽和清洗能力云端防护集群,在那里通过实时分析、智能算法和规则库将恶意攻击流量剥离并丢弃,最后仅将纯净的正常用户流量返回给源站服务器,从而保证业务在遭受海量DDoS攻击时依然稳定可用。