【计网】网络协议栈学习总结 --- 浏览器上输入网址域名后点击回车,到底发生了什么?

在这里插入图片描述

未来的路不会比过去更笔直,更平坦,
但是我并不恐惧,
我眼前还闪动着道路前方野百合和野蔷薇的影子。
--- 季羡林 《八十抒怀》---

浏览器上输入URL后回车,到底发生了什么?

  • 1 前言
  • 2 解析URL形成http请求
  • 3 DNS域名解析
  • 4 网络协议栈封装
    • 4.1 传输层
    • 4.2 网络层
    • 4.3 数据链路层
  • 5 三次握手与四次挥手
  • 6 服务器响应请求

1 前言

经过对计算机网络的学习,我们了解了网络通信的过程,熟悉了网络协议栈各个层的工作机制与作用。那么现在我们回过头来看一个问题:

  • 浏览器上输入URL后回车,到底发生了什么?
    在这里插入图片描述

为什么我们从浏览器的地址栏中输入一个域名,就能给我们返回一个画面精美的网页。在我们点击回车的一瞬间到底发生了哪些事情?今天我们就来一起探索!

历史文章:
【计网】从零开始学习http协议 —理解http重定向和请求方法
【计网】从零开始学习http协议 —深入理解cookie和session
【计网】从零开始认识https协议 — 保证安全的网络通信
【计网】从零开始理解TCP协议 — 熟悉TCP报头结构并理解三次握手与四次挥手
【计网】从零开始理解TCP协议 — 拥塞控制机制,延迟应答机制,捎带应答,面向字节流
【计网】从零开始认识IP协议 — 认识网络层,认识IP报头结构
【计网】从零开始认识IP协议 — 理解网段划分,NAT策略,私有IP和公网IP,认识公网
【计网】网络层路由过程 ,理解IP分片与组装
【计网】从零开始认识arp协议

2 解析URL形成http请求

首先输入一个URL在地址栏中:
在这里插入图片描述
URL的结构中主要包含了:

  1. 协议方案名:一般都是https协议,底层是TCP协议。
  2. 服务器域名:想要访问的服务器域名。后面可以通过DNS解析成IP地址
  3. 文件路径:想要访问服务器中的网络根目录下的哪一个资源。

浏览器做的第一步就是解析 URL 得到里面的参数,将域名和需要请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上什么资源等等。

确定了需要访问的服务器与需要获取的资源之后,就会形成https请求。
https请求报文结构如下:
在这里插入图片描述

  1. 请求行中会记录基础信息:
    • 请求方法:GET或POST。GET通常用来获取资源(也可以进行传参,参数在URL后);POST可以提交数据给服务器,用来处理请求。
    • URL:想要访问的服务器以及想要获取的资源路径
    • http版本:表明使用的HTTP协议版本,如 HTTP/1.1 或 HTTP/2
  2. 请求报头提供关于客户端环境和请求本身的信息,如用户代理、接受的内容类型等。其中是以键值对的方式进行存储。
  3. 请求正文含要发送给服务器的数据,如表单数据

这时浏览器作为应用层的工作已经完成,接下来就是网络协议栈的工作了!

3 DNS域名解析

浏览器形成https报文之后,此时还不能进入到网络协议栈中,因为还有一项重要工作没有做:

  • 目前只有目标服务器的域名,没有目标服务器的IP地址啊?这样你浏览器知道这事是谁,网络协议栈可不认识域名,网络协议栈需要IP地址!

域名并不是目标服务器真正意义上的地址,互联网上每一台计算机都有自己的 IP 地址标识着,但是 IP 地址并不方便记忆,所以才设计出了域名。

  • 浏览器对域名进行解析时首先搜索浏览器的 DNS 缓存,浏览器缓存中维护着一张域名与 IP 地址的对应表;如果有目标域名,即可直接进行使用!
  • 浏览器缓存中没有的话就去操作系统缓存中寻找。
  • 如果还是没有,操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果。
  • 如果本地域名服务器中还是没有的话,那么就要求助上层域名服务器了。

这里引出一个域名等级的概念:

  • 根域名 :.root 或者 . ,根域名通常是省略的
  • 顶级域名,如 .com,.cn
  • 次级域名,如 163.com 里的 163,这个是用户可以进行注册购买的
  • 主机域名,比如 baike.baidu.com 里的baike,这个是用户可分配的

在这里插入图片描述

这时,本地域名服务器求助根域名服务器,根域名分析后发现是.com二级域名,所以就告诉本地域名服务器去.com服务器中寻找域名对应IP,这样一级一级向下寻找,最终找到域名的对应IP地址,这时本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来;操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来;至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来。

这时拥有了目的IP地址,可以进行网络协议栈的处理了!

4 网络协议栈封装

形成https请求报文之后,浏览器做完传输层工作就做完了,接下来就是操作系统网络协议栈的工作:
在这里插入图片描述

4.1 传输层

传输层获取到应用层的https报文,进行封装,通常是使用TCP协议,传输层TCP协议提供了一种面向连接的、可靠的字节流服务:
在这里插入图片描述

  1. 首先写入源端口号与目的端口号。目的端口号是根据URL解析得到的。
  2. 然后为这个报文赋予32位序号(本次报文的序号),以及32位确认序号(用来表示应答的序号)。
  3. 4位首部长度写入报头长度,根据实际情况写入6位标志位。
  4. 16位检验和用于检测报文是否被修改,16位紧急指针表示紧急数据的位置。
  5. 最终写完这个报头,赋予好对应的属性。

TCP传输层有许多特殊机制用来保证通信的可靠性:拥塞控制,流量控制,滑动窗口,超时重传机制…

形成TCP报文之后,继续向下传递,交给网络层进行处理。

4.2 网络层

网络层对传输层报文进行封装,网络层报头结构为:
在这里插入图片描述

  1. 根据版本号写入版本,一般是IPv4。写入报头长度。写入报文总长度(用于判断是否需要分片操作)。
  2. 写入这次分片的相关字段
  3. 写入源IP地址与目的IP地址
  4. 完成报头,形成完整报文,继续向下传递。

网络层发挥的作用是:数据报要通过怎样的路径(传输路线)才能到达对方主机,并传送给对方。

这个路径寻找过程类似问路,通过报文对路由器一次一次的中转路由,路由器通过自身的路由表(提前配置好的)指导下一个目标是哪一台主机,路由器最终会将报文发送到目标子网。

4.3 数据链路层

数据链路层的报头结构很简单:
在这里插入图片描述

  • 如果知道目的IP地址的MAC地址,那么就直接形成MAC帧发送到网络中,这样一份完整的报文就形成了。

如果不知道对方的MAC地址,那么就要先进行一下arp请求,获取到目标IP地址主机的MAC地址。arp请求会形成一个MAC帧发送到网络中进行广播,最终到达目标IP地址的主机,对方发送回来一份arp应答,这时我们的操作系统就知道了对方的MAC地址,可以发送报文过去了!!!

这里需要注意三张表:

  • 交换机中有 MAC 地址表用于映射 MAC 地址和它的端口:MAC 地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。
  • 路由器中有路由表用于映射 IP 地址(段)和它的端口:路由表是各种路由算法 + 人工配置逐步完善起来的。
  • 电脑和路由器中都有** arp 缓存表**用于缓存 IP 和 MAC 地址的映射关系:arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。

这里就可以形成一份TCP/IP协议下是如何通信的过程了

  1. 首先网络层穿下来一个数据包,数据链路层分析目的IP,发现不是同一子网的机器,所以根据MAC 地址表选择发送给默认路由器。
  2. 路由器获取到了数据链路层的数据包,进行解包分用之后,根据目标IP与路由表进行判断下一次要去的子网对应的端口,然后通过数据链路层封装从对应端口发送出去,并更换源IP地址为子节点的WAN口IP。
  3. 这样一次次跳转,最终到达目的子网的路由器,这个路由器通过** arp 缓存表**找到目标IP地址的MAC地址,发送最终的mac帧过去。
  4. 最终,目的主机收到了发给自己的MAC帧,可以获取到数据包了!

总结一下:

  • 网络层指定了从哪个主机(源 IP )发送到哪个主机(目的 IP )。目标 IP 地址在传输过程中不会改变,源IP地址会通过NAT机制进行及时更改,避免私有IP出现在公网中!
  • 数据链路层是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即源 MAC 地址,每个区间内的目的地址即目的 MAC 地址。显然,随着数据的传输**,源 MAC 地址和目的 MAC 地址会不断的发生变化**。这样一次一次的转发,最终就可以将数据包发送给目标主机了!

5 三次握手与四次挥手

上面发送报文的前提是已经建立了与目标主机的TCP连接,如果是第一次进行访问,那么会进行TCP三次握手:
在这里插入图片描述
这里的通信过程是传输层。

  1. 首先客户端发送SYN请求,进行连接请求
  2. 服务端收到请求后,讲自己的SYN请求与客户端应答一起发送回去
  3. 客户端收到应答之后,也会向服务端发送应答,但这份应答对方是否收到,客户端并不在意。

三次握手有以下作用:

  • 验证全双工:三次挥手可以验证网络的连通性,因为三次回收中客户端和服务端都进行了收发数据!
  • 确认双方意愿:三次挥手可以保证双方都想要建立连接!可以达成一个共识!
  • 成本低:四次挥手和五次挥手等不过也是为了完成前两个目的!而三次握手时成本最低的!

关闭连接时,会进行四次挥手:
在这里插入图片描述

  • 客户端发送FIN请求本质:是告诉服务端客户端给你的数据已经发完了,没有数据再进行传输了(注意正常的ACK还是会发送的)!我断开连接了!客户端可以调用shutdown接口关闭写端,那么还可以继续读取服务端发送的数据!
  • 服务端发送FIN请求:是告诉客户端给你的数据我都发完了,没有数据再写了!

四次挥手使用最小的通信成本,建立了断开连接的共识!双方都不和对方通信了!并且也知道对方不再和我进行通信了!注意:双方的连接可能不是同时断开,这取决于对方如何处理。同时断开时可以成为三次挥手

6 服务器响应请求

浏览器的 HTTPs请求报文通过 TCP 三次握手建立的连接通道发送,可能被分片若干报文段,这些报文段在服务器的网络层进行拼装,服务器在收到这些报文段后,按照网络层报头中的报文序号与13位偏移量以原来的顺序重组请求报文。然后向上传递数据,最终在应用层,将https请求获取完整,然后处理并返回一个 HTTP 响应。当然,HTTP 响应报文也要经过和 HTTP 请求报文一样的过程!

此时浏览器上输入URL后回车,到底发生了什么?已经讲解完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460337.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactNative Fabric渲染器和组件(5)

ReactNative Fabric渲染器和组件 简述 Fabric是ReactNative中新架构最核心的模块,本章我们会来了解一下自定义一个Fabric组件,然后在JS文件中声明之后如何,是怎么映射到原生构建一个View的。 关于Fabric架构理念官网已经有说明了&#xff0…

推荐一款优秀的pdf编辑器:Ashampoo PDF Pro

Ashampoo PDF Pro是管理和编辑 PDF 文档的完整解决方案。程序拥有您创建、转换、编辑和保护文档所需的一切功能。根据需要可以创建特定大小的文档,跨设备可读,还可以保护文件。现在您还能像编辑Word文档一样编辑PDF! 软件特点 轻松处理文字 如 Microso…

开发流程初学者指南——需求分析

目录 从零开始理解需求分析什么是需求分析?需求分析的目标需求分析的基本原则需求分析的各个阶段需求分析的常用方法和工具编写需求文档总结 从零开始理解需求分析 需求分析是软件开发过程中不可或缺的一环,它帮助我们明确用户的需求,确保最…

Linux中Web服务器配置和管理(Apache)

文章目录 一、WEB服务器介绍1.1、WEB服务器概述1.2、WEB服务器的发展历史1.3、WEB服务器的优点与缺点1.4、WEB服务器的工作流程 二、Apache介绍2.1、Apache是什么2.2、Apache的发展史与应用场景2.3、Apache的特点2.4、Apache的工作原理2.5、Apache的模块 三、安装使用Apache服务…

在VS Code中操作MySQL数据库

【基础篇】 【小白专用24.5.26 已验证】VSCode下载和安装与配置PHP开发环境(详细版)_vscode php-CSDN博客 ~~~~~~~~~~~~~~~~~~~~~~~~~ 在VS Code中下载插件 Prettier SQL VSCode 和 MySQL : 随后在VS Code中点击Database图标 在连接界面输入MySQL数据库…

Unity可视化Shader工具ASE介绍——自定义函数

阿赵的Unity可视化Shader工具ASE介绍目录   大家好,我是阿赵。   之前介绍过一些ASE的用法,发现漏了一个比较重要的,自定义函数的使用。这里补充一下。 一、 使用的场合 在使用ASE制作Shader的过程中,可能会遇到以下这些情况…

聊聊我在新加坡的近况

我是 2022 年 4 月初过来新加坡的,然后两个月后就把老婆孩子们也接了过来。时至今日,已经两年半有余了。 22 年 8 月初的时候,写过一篇文章「聊聊我在新加坡的生活和工作体验」,没想到成了一篇热门文章,在知乎上不知不…

贪心算法入门(一)

1.什么是贪心算法? 贪心算法是一种解决问题的策略,它将复杂的问题分解为若干个步骤,并在每一步都选择当前最优的解决方案,最终希望能得到全局最优解。这种策略的核心在于“最优”二字,意味着我们追求的是以最少的时间和…

深度强化学习-学习笔记

1.PPO (1)DeepMind公司发明的算法PPO (2)OpenAI公司发明的算法PPO2; 近端策略优化算法(proximal policy optimization,PPO) Actor 网络输出在给定状态 S下采取每个动作的概率分布&a…

pytest脚本常用的执行命令

pytest脚本常用的执行命令 一、一般执行的脚本,执行.py文件整个脚本二、执行.py文件脚本中的一个模块三、执行脚本,执行.py文件整个脚本,或则一个模块,查看对应的日志信息3.1.py文件执行allure的脚本3.2去dos框下去执行对应的脚本…

【水果数据集】水果品种识别 人工智能 机器学习(含数据集)

一、背景意义 随着智能农业和食品管理系统的发展,准确识别不同水果种类变得尤为重要。水果种类数据集是针对水果识别与分类的深度学习项目而建立的重要资源。通过自动化的水果识别系统,农场主能够实时监控水果的种类和成熟度,从而优化采摘和销…

Android平台RTSP|RTMP播放器高效率如何回调YUV或RGB数据?

技术背景 我们在做Android平台RTSP、RTMP播放器的时候,经常遇到这样的技术诉求,开发者希望拿到播放器解码后的YUV或RGB数据,投递给视觉算法,做AI分析,本文以ffmpeg和大牛直播SDK的SmartPlayer为例,介绍下相…

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP,局域网内所有的VLAN共享一棵生成树,被阻塞后的链路将不承载任何流量,无法在VLAN间实现数据流量的负载均衡,导致…

ios 快捷指令扩展(Intents Extension)简单使用 swift语言

本文介绍使用Xcode15 建立快捷指令的Extension,并描述如何修改快捷指令的IntentHandler,带参数跳转主应用;以及展示多个选项的快捷指令弹框(配置intentdefinition文件),点击选项带参数跳到主应用的方法 创建快捷指令 快捷指令是…

智能财务 | 数据与融合,激发企业财务数智化转型思考

数据与融合,激发企业财务数智化转型思考 用友持续深耕企业财务领域,见证中国企业走过了财务电算化、信息化时代,当下共同经历数智化时代。2023 年度,通过走访标杆企业,与高校教授、权威机构学者共同探讨等形式&#xf…

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零,看看是否能通过所有校…

DreamClear:中科院与字节联合推出!隐私安全优先的高性能图像修复技术

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

SpringBoot驱动的毕业生招聘信息平台

1 系统概述 1.1 概述  随着社会的快速发展,计算机的影响是全面且深入的。人们的生活水平不断提高,日常生活中毕业生对招聘平台方面的要求也在不断提高,需要招聘平台的人数更是不断增加,使得毕业生信息招聘平台的开发成为必需而且…

Mac程序坞窗口预览的方法来了

当你同一程序内打开的窗口过多的时候,在Mac上想要切换就只能打开程序然后在内部进行切换,没办法直达你想要打开的窗口,多了一步的操作,那么如何才能一步到位呢 如果程序坞有应用程序的缩略图,是不是就可以一步到位了&…

【C/C++】结构体的定义

零.导言 在上一篇博客中,我讲解了qsort函数,并在其中提到了结构体数组的排序,那么结构体是什么呢? 接下来我将详细讲解结构体的定义。 一,结构体是什么? 结构体是自定义的数据类型,可以存放自定义的数据。…