一个请求经历了什么(一)

浏览器解析

  1. 检查是否合法

  2. 解析出相应的协议、域名、端口、路径等(如果没有端口则按协议添加默认端口)

  3. 判断是否有本地缓存

DNS解析

解析流程

浏览器代理 => 计算机host => 局域网DNS服务器 => 更上层DNS服务器 => …… => 顶层DNS服务器

递归寻址

先寻找一级域名DNS服务器,再寻找二级域名DNS……

寻找服务器

当设置为DHCP时,在开机后会寻找DNS服务器,使用广播寻找,DNS服务器收到广播后主动通知,得到响应后缓存DNS服务器地址

TCP

与UDP的区别

TCP是可靠传输,确保包的传输和发送是同步并且顺序的。如果出现丢包,则会触发重发机制。常见于文件传输等重要内容传输。

UDP是不可靠传输,部分内容的丢失是允许的,不会对整体造成太大影响。常见于视频等流传输。

TCP为了可靠传输,建立了一套握手机制、慢启动机制和重发机制。因此传输速率低。

UDP传输只受限于硬件和部分软件限制,传输速率高

三次握手

TCP三次握手

  • 第一次握手:客户端向服务端发送连接请求:“我要连接你了,可以吗”
  • 第二次握手:服务端向客户端发送确认请求:“可以。你真的要连接吗”(防止延时请求造成的资源浪费)
  • 第三次握手:客户端向服务端发送确认请求:“要的,就现在”

四次挥手

四次挥手

  • 第一次挥手:发送端向接收端发送关闭请求:“我的数据传输完了,你可以关闭了”(发送端关闭数据通道,保留会话通道)
  • 第二次挥手:接收端向发送端发送确认报文:“好的,我收到了。正在处理”
  • 第三次挥手:接收端向发送端发送关闭请求:“我的内容已经全部接收完了,数据通道已经关闭,你可以关闭通道了”(接收端关闭数据通道,保留会话通道)
  • 第四次挥手:发送端向接收端发送确认报文:“好的,我已经关闭所有通道了,你也可以全部关闭了”(发送端进入计时等待(一般2s),接收端关闭会话通道)

注:计时等待:防止接收端报文延时造成接收端通道关闭不了

慢启动&拥塞控制&快速重传&快速恢复

两个概念:

ssthresh: 慢启动阈值,超过阈值则使用拥塞避免算法,不超过则使用慢启动算法
cwnd:发送窗口大小,即每次发送多少数据包
慢启动-拥塞避免

快速重传

快速恢复

假设设定初始发送报文数为1,慢启动增长倍数为2倍,初始ssthresh值为16,拥塞控制每次加1

慢启动:从初始cwnd开始,每次发送都是上一次的n倍,达到ssthresh后改为拥塞控制算法

拥塞控制:cwnd每次加一定数量,直到发生超时或重复确认。发生超时时将ssthresh减半,并将cwnd重置为初始大小,重新进入慢启动阶段;若发生重复确认,则将ssthresh减半,将cwnd设置为ssthresh的大小,重发所丢包,重新进入拥塞控制阶段

HTTP

基于TCP的封装

TCP是传输层协议,HTTP是应用层协议。

HTTP是基于TCP的封装,所以TCP拥有的一切特性,HTTP都会有。

HTTP在TCP基础上,封装了默认端口,封装了请求方法、payload、缓存、状态吗等。

HTTP不包括域名解析!!(但会将域名放入Host字段,处理跨域等)

短连接

三次握手,数据传输,四次挥手,就是一个典型的短连接。

长连接

HTTP1.1中默认使用长连接,在报文里增加Keep-alive字段。需要两边都支持,否则会导致连接未关闭长期占用资源(http version判断)

三次握手,数据传输,等待一定时间或主动断开,四次挥手

作用:复用连接,减少握手的损耗

管道连接

管道连接

不需要等待前面的事务处理完毕,就发送下个请求。

在网络状况良好时大幅提高效率,在网络状况不好的时候会造成额外的开销

缓存机制

目的:减少数据传输,加快响应速度,尽早释放资源,缓解源站压力
参考http://www.cnblogs.com/vajoy/p/5341664.html
这里写图片描述

缓存及缓存更新策略:

  1. 是否开启缓存;
  2. 不缓存则每次都请求,缓存之后,缓存时间内不请求,超过缓存时间后则比对etag和last modified。
  3. 当缓存没有发生变化时,返回302状态码,客户端或缓存服务器使用已有的缓存;否则更新本地缓存。
    注意:使用缓存不一定没有发送请求!

cookie与session

可参考https://my.oschina.net/kevinair/blog/192829

  1. HTTP是无状态的协议,浏览器无法判断请求者的身份,需要每次请求都带上自己的身份。而cookie就是类似身份证的存在。
  2. cookie一般由服务器应用派发,并存储在客户端
  3. cookie包含key,value,domain,path,expires,secure等属性,只有满足条件的未过期的cookie才会被携带
  4. session是过期时间为当前值的cookie,会话结束后将被丢弃

应用1:记住我登录
应用2:csrf攻击

代理服务器/缓存服务器

与网关的区别

网关:类似门的存在,帮助门内的包找到路径

代理服务器:类比快递中转站,不能直接到达目的地的包可以通过代理来到达

缓存服务器:类比零售网点,有货则直接提货,否则往上级网点取货

作用

代理服务器:减少寻址过程,更快的响应速度

缓存服务器:减少源站压力,加快响应速度

原理

维持和上一个客户端的连接,请求下一个服务器,记忆两个连接的映射

正向代理&反向代理

正向代理即是上面所述代理,是跳板或者中转站的存在

反向代理则是为了隐藏目的地,用户访问到的最终节点是反向代理,而反向代理会去向真正的源站请求数据。

区别在于隐藏的身份不同。正向代理可以隐藏客户端的真实身份,即将请求的源设定成代理服务器,让源站以为访问者是代理服务器(翻墙代理)。而反向代理隐藏了服务端的真实身份,对外宣传自己是源站。

以下章节敬请期待

源站处理

浏览器渲染

HTTPS

HTTP 2.0

客户端请求一个 API 接口的完整流程涉及多个层次的技术交互,涵盖了网络通信、协议规范、数据格式和安全性等多个方面。以下是详细的流程和技术细节: ### ### 1. 请求发送阶段 客户端(例如 Web 浏览器、移动应用、桌面应用或服务器)通过网络协议(如 HTTP/HTTPS)向服务器发送请求请求通常包括以下内容: - **URL**:指定要访问的 API 接口地址,例如 `https://api.example.com/data`。 - **HTTP 方法**:常见的方法包括 `GET`、`POST`、`PUT`、`DELETE` 等,用于指定操作类型。 - **请求头(Headers)**:包含元数据,例如 `Content-Type`(指定数据格式)、`Authorization`(认证信息)、`Accept`(接受的响应格式)等。 - **请求体(Body)**:在 `POST`、`PUT` 等方法中,请求体可能包含需要提交的数据,通常以 JSON 或 XML 格式编码。 在这阶段,客户端可能会使用 HTTP 客户端库(如 Python 的 `requests`、Java 的 `HttpURLConnection` 或 `OkHttp`)来构建和发送请求。 ### ### 2. 请求接收与处理阶段 服务器接收到请求后,会根据 API 接口的设计进行处理。这个过程包括: - **路由匹配**:服务器根据请求的 URL 和 HTTP 方法,将请求路由到对应的处理程序(例如一个控制器方法或函数)。这通常通过框架(如 Spring Boot、Express.js)提供的路由机制实现。 - **身份验证与授权**:服务器检查请求头中的认证信息(如 Token、API Key)以验证用户身份,并确定其是否有权限访问该资源。OAuth 2.0 和 JWT 是常见的认证与授权协议[^1]。 - **业务逻辑处理**:服务器执行与请求相关的业务逻辑,可能包括访问数据库、调用其他服务或进行计算。例如,一个获取用户信息的 API 可能会查询数据库并返回结果。 - **数据格式解析与生成**:服务器解析客户端发送的数据(如 JSON 或 XML),并生成响应数据。数据通常以 JSON 格式返回,因为它在现代 Web 开发中被广泛支持。 ### ### 3. 响应生成与返回阶段 服务器处理完请求后,会生成一个响应并将其返回给客户端。响应通常包括以下内容: - **状态码**:表示请求的结果,例如 `200`(成功)、`404`(未找到)、`500`(服务器内部错误)等。 - **响应头(Headers)**:包含元数据,例如 `Content-Type`(响应数据格式)、`Cache-Control`(缓存策略)等。 - **响应体(Body)**:包含实际的响应数据,通常以 JSON 或 XML 格式编码。 服务器使用 HTTP 服务器框架(如 Nginx、Apache 或内嵌的 Tomcat)来管理请求和响应。 ### ### 4. 响应接收与解析阶段 客户端接收到响应后,会解析响应内容并提取有用的信息。例如: - **状态码检查**:客户端首先检查状态码以确定请求是否成功。 - **响应头解析**:客户端可能解析响应头以获取元数据,例如缓存信息或分页数据。 - **响应体解析**:客户端将响应体中的数据(如 JSON 或 XML)解析为程序可以处理的格式(如对象或字典)。 例如,使用 Python 的 `requests` 库时,可以通过以下代码解析响应: ```python import requests response = requests.get('https://api.example.com/data') if response.status_code == 200: data = response.json() print(data) else: print(f"Error: {response.status_code}") ``` ### ### 5. 安全性与性能优化 在整个流程中,还需要考虑以下安全性和性能相关的问题: - **安全性**: - 使用 HTTPS 加密通信,防止中间人攻击。 - 实现身份验证和授权机制,防止未授权访问。 - 对输入数据进行验证,防止注入攻击(如 SQL 注入)。 - **性能优化**: - 使用缓存(如 Redis、CDN)减少服务器负载。 - 启用压缩(如 GZIP)减少传输数据量。 - 实现分页和过滤机制,避免次性返回过多数据。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值