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

2023-11-02

浏览器解析

  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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个请求经历了什么(一) 的相关文章

  • 如何告诉 python HTMLParser 停止

    我有一个用例告诉我们当标签是link它的属性是rel dns prefetch然后就说预解析dns已启用 我做了一个标志pre resolve dns enabled并将其设置为 true 如下所示 class Extractor HTML
  • Django 应用程序是否可以知道用户的 Windows 域名?

    我需要制作一个简单的知识库类型应用程序以在公司内部网络中使用 为了使最终用户使用起来简单快捷 我想部分跳过所有登录 因为它只对我们信任的内部网络用户可见 并自动从用户中提取域用户名并放入它进入数据库 不希望人们浪费时间手动输入他们的名字 他
  • Docker Weave 和 WeaveDNS 问题

    我在本地计算机上运行的小型 weave 网络上设置 weaveDNS 时遇到问题 目前 问题表现为以下事实 当我运行 weave status 时 我在输出中没有看到 DNS 部分 如故障排除部分中所建议的那样 http docs weav
  • 将 Google 域链接到 Amazon ec2 服务器

    我正在使用 Amazon EC2 实例来为 node js 应用程序提供服务 我最近通过以下方式购买了域名谷歌域名 https domains google com我想使用该域名来访问我的 node js 应用程序 Google Domai
  • 如何平衡Web服务器带宽使用?

    我有一个 drupal 商务网站 用户一直在其中上传大量图像 每个商业订单有 n 个图像 我想平衡网络流量以节省带宽 每个服务器的带宽是有限的 我无法使用传统的负载平衡解决方案 因为平衡器服务器的带宽也有限 我的数据库将位于单独的服务器上
  • 从具有动态外部 IP 的计算机连接到 Azure SQL Server

    我正在尝试将具有动态外部 IP 的本地笔记本电脑连接到我们的 Azure SQL Server 为此 我创建了一个虚拟网络网关并将笔记本电脑连接到该网关 此外 我还向 SQL Server 添加了一个专用端点 之后 我可以使用telnet成
  • .htaccess 将子域重写到目录

    是否可以使用 htaccess将子域重写为目录 Example http sub domain example 显示内容 http domain example subdomains sub 尝试将其放入您的 htaccess file R
  • 在 JavaScript 中确定域名?

    使用有什么区别 if document domain toLowerCase indexOf domainName 1 and if window location href match 1 toLowerCase indexOf doma
  • .NET 中机器的域名?

    一定有一种简单的方法可以做到这一点 我不敢相信没有 我扫描了网络 发现有 20 种不同的方法来查找当前用户所在的域 但没有一种方法可以获取当前计算机的域 或工作组 在非托管 c 中 这是通过以下方式检索的 WKSTA INFO 100 bu
  • 每个域都有唯一的 IP 吗?

    我想知道每个域名地址是否都有唯一的IP地址 此外 这些IP位于哪里 这个重定向系统是如何工作的 当我们尝试通过写入域名来访问网站时 它有多少个重定向 谢谢 否 每个域没有自己的 IP 地址 多个域可以托管在同一台服务器上 并且位于同一 IP
  • 如何让 Docker 容器访问主机上的 dnsmasq 本地 DNS 解析器?

    Docker 容器可能会通过多种方式对 DNS 设置感到困惑 只需在 SO 或更广泛的互联网上搜索 Docker DNS 即可了解我的意思 建议的常见解决方法之一是 将 dnsmasq 设置为主机系统上的本地 DNS 解析器 将其绑定到do
  • 如何为digitalocean设置子域?

    我需要通过在 URL 中输入 sendy ambee app 来访问我的 Digitalocean 服务器 如果我输入 IP 地址 157 230 9 219 它就可以工作 但只要我输入 sendy ambee app 它就不起作用 Whe
  • Linux 中 AF_UNIX 数据报消息的最大大小是多少?

    目前我已达到 130688 字节的硬限制 如果我尝试在一条消息中发送更大的内容 我会收到一条消息ENOBUFS error 我已经检查过net core rmem default net core wmem default net core
  • Amazon S3:静态网站:自定义域或子域

    Amazon com 刚刚宣布可以在 S3 存储桶中托管静态网站 我访问了他们的设置页面http docs amazonwebservices com AmazonS3 latest dev index html WebsiteHostin
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 使用 IIS 发布:找不到服务器 DNS

    我正在尝试使用 IIS 发布我的项目 我能够通过 Visual Studio 发布它 La aplicaci n web se public correctamente file D www plataformafantasy com Co
  • CakePHP 多站点(如 WPMU + 域映射)...可能吗?

    所以我刚刚开始使用 CakePHP 想知道是否可以执行以下操作 一次安装 Cake 并使用超级管理员登录 然后 管理员有权访问指定的 子站点 并能够在这些子站点上创建 编辑内容和用户 最后 能够将域名 不是子域 而是唯一域 映射到路由 所以
  • 域名 foo.bar 指向 127.0.53.53 ——为什么?

    我今天刚刚注意到域名 foo bar 解析为 127 0 53 53 http foo bar http foo bar http whois domaintools com foo bar http whois domaintools c
  • NameResolutionFailure 与 ConnectFailure 问题

    这是一个相当奇怪的问题 但仍然是一个非常糟糕的问题 当用户在没有互联网的情况下进入我们的应用程序时 我们会返回一个NameResolutionFailure作为尝试通过以下方式进行 API 调用的错误消息HttpClient 好吧 没关系
  • 使用主机上的 consul DNS 解析容器

    目标 让 docker 容器使用主机提供的 DNS 主机是在另一个容器中运行的 consul 代理 来访问通过 traefik 反向代理提供的服务 设置 主机 Ubuntu 16 04 2 LTS Registrator 将新容器注册到 c

随机推荐

  • DRAM 内存介绍(一)

    参考资料 http www anandtech com show 3851 everything you always wanted to know about sdram memory but were afraid to ask SDR
  • (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比

    问题描述 假设你有8个球 其中一个略微重一些 但是找出这个球的惟一方法是将两个球放在天平上对比 最少要称多少次才能找出这个较重的球 解答思路 至少要称2次 将8个球分成3份 其中2份每份有3个球 设为A B 剩下一份有2个球 设为C 第一次
  • CSS鼠标特效【动画跟随】

    JS CSS body background 111
  • 从 Twitter 运维技术经验可以学到什么

    没有一个网站的性能像 Twitter 这样这么令人牵肠挂肚 看见那条大鲸鱼总是让人感觉很无奈 Twitter 的运维专家 John Adams 在 Velocity 2009 上做了一篇题为 Fixing Twitter 的技术分享 PDF
  • QML Canvas 保存画布内容

    作者 一去 二三里 个人微信号 iwaleon 微信公众号 高效程序员 不知大家想过没有 我们好不容易在 Canvas 上绘制了各种图形 该如何把它保存起来呢 比如 我们实现了一个画板 当用户制作完成自己的作品之后 是不是要将其保存起来 以
  • 关于keil编译STM32例程出现错误的解决方法

    文章目录 错误示例 我的实际操作一 实际没有解决 我的实际操作二 真相大白 用户名没有修改 还是中文 用户名已经修改 乱码原因 学习经验 错误示例 错误如下所示 OBJ LED axf error L6002U Could not open
  • 基于python的股票客户流失数据分析模型

    目录 1 案例背景 2 2 读取数据 2 3 划分特征变量和目标变量 3 4 模型的搭建和使用 3 5 模型的使用 4 6 ROC曲线对模型的评估 7 7 总结 10 8 参考文献 10 9 致谢 10 1 案例背景 在进行一笔股票交易时候
  • 机器学习库--dlib

    dlib是什么呢 见面了 总要认识一下吧 dlib其实就是一个跨平台的用C 编写的代码库 这个库的机器学习算法和工具可以用来解决现实世界的很多工程问题 它在工业界和学术界有着广泛的应用 主要在机器人 嵌入式设备 手机以及高性能计算设备上有着
  • 当事务遇上分布式锁

    文章目录 1 分布式锁的几种实现方式 2 MySQL使用自带锁进行分布式同步控制 2 1 环境准备 2 2 可重复读下的for update的验证 3 Redis实现分布式锁进行同步控制 3 1 Redisson 3 2 Redisson实
  • Unity Input输入类 手指触摸检测

    在移动设备上 用户通常使用触摸屏来进行交互 Unity提供了Touch类来获取用户的触摸输入 以下代码是获取触摸的一些方法与参数 下面的代码演示了如何检测用户是否在屏幕上触摸了一个手指 在上面的代码中 我们使用了Input touchCou
  • visual studio——快速折叠所有代码和展开所有代码

    1 折叠所有代码 先ctrl m 再ctrl o 这是字母O 2 展开所有代码 先ctrl m 再ctrl l 这是字母L
  • ViewModel 源码设计思路分析

    前言 转眼一年又过去大半了 在2022年 初定了大多计划 搬家 换公司 很多事情都一托再拖 这里分享一篇我在公司内部做的分享文章吧 删除了部分对公司内部代码的探讨 公司中的项目运用到了大量的组件封装 有的是对第三方组件进行二次封装 有的是从
  • STM32 电机教程 6 - 步进电机转动控制

    前言 上一讲给大家介绍了步进电机的基础知识 相信大家对步进电机的基本工作原理有了一定的了解 如果没看上一节内容 可以先看一下 https blog csdn net zhanglifu3601881 article details 1028
  • 《微光与红外成像技术》

    1 绪论 图像就是用任何技术手段 将景物目标重现为二维画面或三维立体图的视觉信息 微光泛指在夜间或在低照度下微弱的光或能量低到不能引起视觉的光 2 人眼视觉的基本理论 人眼的绝对视觉阈值在 1 0 9 l
  • QML MouseArea堆叠时传递组合事件

    有2块MouseArea 上层MouseArea接受press事件而位于其下方的MouseArea接受click事件 click被称为组合事件 2方MouseArea各自接受自己的 互不影响 先上代码 MouseArea id beneat
  • 我的创作纪念日(另外关于所有网盘数据失效的问题请看这里)

    机缘 最初成为创作者的初心 从小就喜欢抄书写便签 经常被别人说傻 你记这些东西有什么用呢 从六岁开始就接触电脑了 奈何喜欢电脑却一直被现实生活打趴下 接触 Linux 接触的比较晚 一五年才知道原来这个世界上真的有只有字符代码界面的系统 那
  • jetson nano基础使用笔记

    1 jetson nano金属外壳安装 两个开关的接线方法如下 需要使用跳线帽连接左边第五和第六个管脚 如果不安装外壳的话 必须将跳线帽拆除才能给主板正常供电 2 jetson nano更换国内源 1 备份初始源 打开终端 ctrl shi
  • React性能优化指南

    React性能优化方法总结 使用React开发的项目 可以从加载性能和运行时性能两个方面进行优化 加载性能优化的目标是让用户更早地看到界面 更早地和应用交互 运行时性能优化目标是降低卡顿 交互更流畅 运行时 1 避免不必要的渲染 我们知道R
  • Kotlin资料

    Kotlin中文官网 https huanglizhuo gitbooks io kotlin in chinese content GettingStarted Basic Syntax html
  • 一个请求经历了什么(一)

    浏览器解析 检查是否合法 解析出相应的协议 域名 端口 路径等 如果没有端口则按协议添加默认端口 判断是否有本地缓存 DNS解析 解析流程 浏览器代理 gt 计算机host gt 局域网DNS服务器 gt 更上层DNS服务器 gt gt 顶