浏览器发出一个请求到收到响应步骤详解

2024-03-06 03:12

本文主要是介绍浏览器发出一个请求到收到响应步骤详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        在网络通信中,浏览器向Web服务器发送HTTP请求消息的过程是一个复杂而精密的环节,涉及到URL解析、DNS解析、数据拆分、路由表规则和MAC头部添加等一系列步骤。本文将深入探讨这一过程的每个环节,帮助读者更全面地了解浏览器与Web服务器之间的通信运作原理。

步骤详解

  • URL 进行解析,从而生成发送给 Web 服务器的请求信息。URL 实际上是请求服务器里的文件资源。对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。

要是上图中的蓝色部分 URL 元素都省略了,那应该是请求哪个文件呢?

        当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 这些文件,这样就不会发生混乱了。

  • 通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。但在发送之前,需要查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。有一种服务器就专门保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器。

域名解析的工作流程:

        浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。

        客户端向本地 DNS 服务器请求域名 www.server.com 的 IP 地址,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。

        如果没有,本地 DNS 依次向根域名服务器 (每个DNS服务器都有的最底层DNS服务器) 、顶级域名服务器和权威 DNS 服务器 (就是用户定义的ip的那个DNS服务器) 查询,最终获取到目标域名的 IP 地址,缓存到本地DNS服务器中

  • 应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作,如果 HTTP 请求消息比较长,超过了 MSS 的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。每个被拆分的数据加上 TCP 头信息 (应用层端口) ,然后交给 IP 模块来发送数据。

        协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。

        协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。

  • 委托 IP 模块将数据封装成网络包发送给通信对象。首先根据本地路由表规则,通过子网掩码来锁定与目标地址在同一子网的那个网卡的IP作为源地址 IP, 再提取目标地址数据为目标IP等形成 IP 包头,使请求获得远程定位能力。

  • 接下来网络包还需要在 IP 头部的前面加上 MAC 头部。通过IP只能找到一个局域网,加上 MAC 头部才能告诉以太网对方的 MAC 的地址,以太网就会帮我们把包发送给局域网中的目标服务器。发送方的 MAC 地址直接在网关获取,接收方的 MAC 地址获取需要借助ARP 协议,其会在以太网中以广播的形式获取到 MAC 地址。在后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用

  • 通过网卡驱动程序,将数字信息转换为电信号,基于已有的TCP/IP/MAC头部信息,能在交换机和路由器的转发下,将数据转发抵达到目的地

  • 上述就是请求的过程,其实对于后续的响应也是围绕上述的方案来进行消息的逆传输操作,只不过就多了一步浏览器接收到 HTTP 响应后,解析 HTML、CSS、JavaScript 等资源,并渲染成页面展示给用户的过程

读者问答

读者问:“笔记本的是自带交换机的吗?交换机现在我还不知道是什么”

笔记本不是交换机,交换机通常是2个网口以上。

        现在家里的路由器其实有了交换机的功能了。交换机可以简单理解成一个设备,三台电脑网线接到这个设备,这三台电脑就可以互相通信了,交换机嘛,交换数据这么理解就可以。

读者问:“如果知道你电脑的mac地址,我可以直接给你发消息吗?”

Mac地址只能是两个设备之间传递时使用的,如果你要从大老远给我发消息,是离不开 IP 的。

读者问:“请问公网服务器的 Mac 地址是在什么时机通过什么方式获取到的?我看 arp 获取Mac地址只能获取到内网机器的 Mac 地址吧?”

        在发送数据包时,如果目标主机不是本地局域网,填入的MAC地址是路由器,也就是把数据包转发给路由器,路由器一直转发下一个路由器,直到转发到目标主机的路由器,发现 IP 地址是自己局域网内的主机,就会 arp 请求获取目标主机的 MAC 地址,从而转发到这个服务器主机。

        转发的过程中,源IP地址和目标IP地址是不会变的(前提:没有使用 NAT 网络的),源 MAC 地址和目标 MAC 地址是会变化的。

总结

        通过本文的阐述,我们详细介绍了浏览器发送HTTP请求的全过程,从URL解析到网络包的发送,最终到达Web服务器。网络通信的背后是诸多协议和规则的支撑,每一个步骤都是精心设计和优化的。了解这一过程不仅有助于我们更好地理解网络通信的运作方式,也为我们解决网络故障和优化网络性能提供了重要参考。希望本文对读者有所帮助,让大家对网络通信有更深入的了解。

这篇关于浏览器发出一个请求到收到响应步骤详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/778703

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2