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

输入网址到网页显示,发生了什么--讲述

输入www.baidu.com作为网址,

孤身的人-HTTP

浏览器要做的第一步就是 解析URL,根据url里面的资源路径,确认服务器资源和路径,生成http请求消息,包括请求消息(请求行  消息头  请求体)

举例:访问https://example.com:8080/api/data?name=john  生成的http请求可能如下
Get    /api/data?name=John   HTTP/1.1

Host:example.com:8080

ACCEPT:*/*

Connection:keep-alive

只指路不带路-DNS

发送消息需要IP地址,通过DNS来查询
在查询之前    查询 浏览器 缓存    操作系统缓存   host文件缓存

然后本地DNS服务器   再去通过本地DNS服务器询问 根域名服务器  顶级域名服务器  权威域名服务器         www.server.com.(最后还有一个 点)            

根域名   .           顶级域名 .com           权威域名 server.com

导航地图-协议栈

应用程序调用socket库,来委托协议栈工作

可靠 面像字节流 面向连接的---TCP

在http传输数据之前,通常需要进行TCP连接建立,通常称为三次握手

建立了连接之后,TCP报文中的数据部分就开始存放 HTTP头部+数据   ,组装好TCP报文之后,开始交给网络层处理。

遇上了TCP的数据包现在找到了可靠大哥保护,下一步该往哪走呢?

远程定位---IP

此时,加上了 IP 头部的数据包表示 :“有 IP 大佬给我指路了,感谢 IP 层给我加上了 IP 包头,让我有了远程定位的能力!不会害怕在浩瀚的互联网迷茫了!可是目的地好远啊,我下一站应该去哪呢?”

两点传输--MAC

首先 发送方的MAC地址就比较简单  网卡生产时候写入的 读取出来加入到MAC头就可以了

对于接收方的MAC地址,略微复杂    
通过route -n 命令查询路由表    

匹配到响应的条目之后 找到对应的gateway也就是ip地址  然后利用ARP协议找到路由器的MAC地址。

至此,网络包的报文如下图。

至此,加上了MAC头部的数据包万分干旱写二,说道:感谢MAC,我现在有很多头部大哥,相信我可以到达重点。准备出门。

出口---网卡

把二进制的数据包转化为电信号,负责执行的是网卡


城门守卫--交换机


出境大门--路由器

首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

检查 MAC 头部中的接收方 MAC 地址

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

接下来就会进入包的发送操作

首先,我们需要根据路由表的网关列判断对方的地址。

  • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
  • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点

知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

数据包通过多个路由器道友的帮助,在网络世界途经了很多路程,最终抵达了目的地的城门!城门值守的路由器,发现了这个小兄弟数据包原来是找城内的人,于是它就将数据包送进了城内,再经由城内的交换机帮助下,最终转发到了目的地了。数据包感慨万千的说道:“多谢这一路上,各路大侠的相助!


http://www.kler.cn/a/516530.html

相关文章:

  • Formality:不可读(unread)的概念
  • 低代码可视化-转盘小游戏可视化-代码生成器
  • Java学习笔记(二十四)
  • PID 控制算法(二):C 语言实现与应用
  • 【玩转全栈】----Django基本配置和介绍
  • 2000-2010年各省第三产业就业人数数据
  • linux静态库+嵌套makefile
  • 【深度学习】 自动微分
  • python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算
  • Caesar
  • 【java】IP来源提取国家地址
  • PHP校园助手系统小程序
  • React 前端框架开发详细操作
  • 【AIGC提示词系统】赛博朋克·韵律:一个融合科技与艺术的对话系统设计
  • 如何构建一个简单的React应用?
  • 202009 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 使用qwen作为基座训练分类大模型
  • JAVA EE
  • 概率论里的特征函数,如何用卷积定理去理解
  • 代码随想录刷题day14(1)|(链表篇)142.环形链表 II
  • Linux内核中的InfiniBand核心驱动:verbs.c分析
  • 第10章 JVM类加载器(Java高并发编程详解:多线程与系统设计)
  • uniapp 在线更新应用
  • pyrender 渲染mesh
  • Linux-arm(1)ATF启动流程
  • 【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )