当前位置: 首页 > news >正文

输入网址到网页显示的过程

输入网址到网页显示的过程

  • 1. 浏览器解析 URL
  • 2. 域名解析
    • 解析的流程
  • 3. TCP通过三次握手建立连接
  • 4. 生成TCP段:在数据的前面加上 TCP 头部,生成TCP段
    • TCP 头部
  • 5. 生成IP数据报:在TCP段的前面加上 IP包头,生成IP数据报
    • IP包头
  • 6. 在IP 数据报的前面加上 MAC头部
    • MAC 头部
    • ARP查询MAC地址的过程
  • 7. 封装成帧,网卡发送数据
  • 8. 交换机
  • 9. 路由器转发
  • 10. 交换机
  • 11. 网卡接收数据
  • 12. 服务器处理请求进行数据回传
  • 13. 断开连接

在这里插入图片描述

1. 浏览器解析 URL

输入网址后,浏览器做的第一步工作是解析 URL,根据解析的信息,生成 HTTP 消息,发送请求给 Web 服务器
在这里插入图片描述
如果说输入的网址是https://www.baidu.com/s?wd=4399,最后解析结果是GET请求,Web 服务器www.baidu.com,参数wd=“4399”

2. 域名解析

发送给Web 服务器之前需要查询服务器域名对应的 IP 地址,因为实际发送请求是需要 IP 地址,而我们目前只知道域名www.baidu.com,因此需要进行DNS域名解析。

解析的流程

1.客户端发送DNS请求给DNS服务器,问 www.baidu.com 的 IP 是啥
2. DNS服务器查表,看是否有 www.baidu.com 对应的IP地址,如果有直接返回IP地址,没有则向根域名服务器发送DNS请求,根域名服务器 返回 顶级域名服务器地址 给本地 DNS服务器
3. 向顶级域名服务器发送DNS请求,顶级域名服务器 返回 权威域名服务器地址 给本地 DNS服务器。
4. 向权威域名服务器发送DNS请求,权威域名服务器查到之后将IP地址返回给本地 DNS 。
5. 本地DNS将该域名和对应的IP地址写入自身缓存,再将 IP 地址返回客户端。

一般来说很少到根域名服务器去寻找,因为浏览器,操作系统,本地DNS都可能会有对这个域名的缓存。

3. TCP通过三次握手建立连接

4. 生成TCP段:在数据的前面加上 TCP 头部,生成TCP段

TCP分段的原因:如果数据太大不太容易传输,并且数据丢失不需要重新传所有数据,只需要传丢失的TCP段。
如果 HTTP 请求消息比较长,超过了 MSS(Maximum Segment Size,最大报文段长度)的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。
在这里插入图片描述

TCP 头部

在这里插入图片描述
源端口号和目标端口号,为了区分哪一个应用或服务的。
序号,这个是为了解决包乱序的问题,防止数据分段之后无法按照正确顺序合并。
确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。
状态位,通过状态位的变更来建立和断开连接以及接收和发送消息等。
窗口大小,能够进行流量控制和拥塞控制。

5. 生成IP数据报:在TCP段的前面加上 IP包头,生成IP数据报

IP包头

在这里插入图片描述
源地址IP,即是客户端输出的 IP 地址;
目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06(十六进制),表示协议为 TCP。
标志,DF(dongt fragment),意思是“不能分片”。当DF=0时才允许分片。MF(more fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这是若干数据报片中的最后一个。
片偏移,较长的IP报文在分片后,某片在原分组中的相对位置。

IP数据报切片的原因:以太网规定MTU为1500字节。MTU是数据链路层所规定的,用于限制链路层数据部分的长度。网络层是链路层的数据部分。所以如果所传送的数据报长度超过链路层的MTU值,就必须把过长的数据进行分片处理。

例如:一数据报的总长度为3820字节,数据部分为3800字节(IP首部为固定20字节),需要分片传输。假设每片IP报文长度不超过1420字节。去掉固定首部长度20字节,每片报文数据部分长度不超过1400。于是分成3个数据报片,其数据部分长度分别为1400、1400、100字节。原始数据报首部被复制为各数据报片的首部。
参考文章:IP数据报格式

在这里插入图片描述
在这里插入图片描述

6. 在IP 数据报的前面加上 MAC头部

发送方的 MAC 地址在发送方电脑上存储,可以直接读取,那接收方的 MAC 地址如何获取呢,此时就需要 ARP 协议帮我们找到接收方的 MAC 地址。

MAC 头部

在这里插入图片描述

ARP查询MAC地址的过程

  1. 先查询 ARP 缓存,如果已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用 ARP 缓存中的地址。
  2. 当 ARP 缓存中不存在对方 MAC 地址时,ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。

7. 封装成帧,网卡发送数据

网卡会将包转为电信号,通过网线发送出去。要控制网卡还需要靠网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列( FCS)进而封装成帧。
在这里插入图片描述

8. 交换机

  1. 电信号到达网线接口,交换机里的模块进行接收
  2. 交换机里的模块将电信号转换为数字信号,然后通过包末尾的 帧校验序列( FCS) 校验错误,如果没问题则放到缓冲区
  3. 查找这个包的接收方的 MAC 地址是否在 MAC 地址表中
  4. 如果在将信号发送到相应的端口
  5. 如果不在将包转发到除了源端口以外的所有端口上,只有相应的接收者才接收包,而其他设备则会忽略这个包,当接收者接收包的时候,交换机就会更新MAC地址表,记录新发现的MAC地址和对应的端口。

9. 路由器转发

  1. 电信号到达网线接口部分,路由器中的模块进行接收
  2. 路由器里的模块会将电信号转成数字信号,然后通过包末尾的 帧校验序列( FCS) 校验错误。如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
  3. 路由器根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作
  4. 经过层层转发之后,网络包到达最终的目的地

10. 交换机

  1. 交换机接收来自路由器的数据包,并检查其源MAC和目的MAC地址。
  2. 根据数据包的目的MAC地址查找其内部的MAC地址表,以确定数据包应该转发到哪个端口。
  3. 确定了目的端口,交换机将数据包转发到连接到目的设备的端口。

11. 网卡接收数据

  1. 数据包抵达服务器后,服务器先扒开数据包的 MAC 头部,查看是否和自己的 MAC 地址符合,符合就将包收起来,如果不符合就丢弃。
  2. 接着扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
  3. 于是扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
  4. 于是服务器就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

12. 服务器处理请求进行数据回传

  1. 服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
  2. HTTP 响应报文加上 TCP、IP、MAC 头部,源地址是服务器 IP 地址,目的地址是客户端 IP 地址。
  3. 接着网卡发送响应数据包,由交换机转发到路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。最后跳到了客户端的路由器,路由器扒开 IP 头部发现是要找城内的人,于是又把包发给了城内的交换机,再由交换机转发到客户端。
  4. 客户端收到了服务器的响应数据包后,开始扒皮,把收到的数据包的皮扒到只剩 HTTP 响应报文后,交给浏览器去渲染页面,数据包就这样显示出来了。

13. 断开连接

客户端向服务器发起了 TCP 四次挥手,双方连接断开。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在勒索软件攻击中幸存下来:最佳备份实践、勒索拦截方案
  • 【Visual Studio】Visual Studio使用技巧及报错解决合集
  • 软件测试——测试用例
  • 【C++精华铺】12.STL list模拟实现
  • 【低照度图像增强系列(8)】URetinex-Net算法详解与代码实现(2022|CVPR)
  • 手机和电脑通过TCP传输(一)
  • 第一节Linux常见指令
  • CV11_模型部署pytorch转ONNX
  • 前端练习小项目——方向感应名片
  • Open-TeleVision——通过VR沉浸式感受人形机器人视野:兼备远程控制和深度感知能力
  • Base64文件流查看下载PDF方法-CSDN
  • python-矩阵加法(赛氪OJ)
  • BERT架构的深入解析
  • c# 依赖注入-服务的生命周期
  • 如何恢复电脑上删除的文件?快速恢复被删除文件的技巧【5个实用方法】
  • 时间复杂度分析经典问题——最大子序列和
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017前端实习生面试总结
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Docker容器管理
  • JavaScript实现分页效果
  • Mysql5.6主从复制
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • mysql常用命令汇总
  • select2 取值 遍历 设置默认值
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 动态规划入门(以爬楼梯为例)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 排序(1):冒泡排序
  • 无服务器化是企业 IT 架构的未来吗?
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在Unity中实现一个简单的消息管理器
  • 1.Ext JS 建立web开发工程
  • Spring Batch JSON 支持
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ibm)Java 语言的 XPath API
  • (rabbitmq的高级特性)消息可靠性
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (面试必看!)锁策略
  • (三)终结任务
  • *Django中的Ajax 纯js的书写样式1
  • .aanva
  • .net CHARTING图表控件下载地址
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net开发引用程序集提示没有强名称的解决办法
  • /var/lib/dpkg/lock 锁定问题
  • @property括号内属性讲解
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)