键入网址到网页显示,期间发生了什么?(计算机网络)

一、浏览器首先会对URL进行解析

下面以http://www.server.com/dir1/file1.html为例

525e3631e977456abc28d9dd4035bbe1.png当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html

对URL进行解析之后,浏览器确定了 Web 服务器和文件名,就会根据这些信息来生成 HTTP 请求消息。

但是光有web服务器名www.server.com是不够的,只知道一个人的名字肯定是找不到人的,我们还需要服务器的IP地址。

而DNS服务器就可以通过服务器名提供它的IP地址(相当于一个电话本,通过人名查询电话号码),

DNS域名是分层级的,越靠右层级越高。

例如www.server.com实际上是www.server.com.(多了后面的.)

  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(server.com)

edb5c7e9a37f43c89051eb3939682f0d.png

在寻找IP地址时,会先在浏览器缓存中寻找是否有和目标服务器名对应的IP地址,如果没有,则会到操作系统缓存中寻找,如果没有再问hosts文件中寻找,还是没有,才会到本地DNS服务器中去寻找,如果还是没有,那么本地DNS服务器会到根DNS服务器中进行询问,根服务器发现是.com后缀,就说你去问.com顶级域名服务器吧,而.com顶级域名服务器会让你去问负责www.server.com的权威域名服务器,权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS服务器。

本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈

53ef4f00c5644469bb230a23e6c76b0b.png

协议栈包括上下两部分,上半部分是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。下半部分用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。

IP 中还包括 ICMP 协议和 ARP 协议。

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

随后HTTP报文需要依次组装TCP头部,IP头部和MAC头部来形成网络包,组装完成后如图所示:

f5b9485955744be1bdbb602f75484222.png

下面对组装过程进行讲解。

二、组装TCP头部

534ed1fa355a4104a4a6009f2c5c8844.png

源端口号目标端口号:确认数据应该发给哪个应用。

序号:解决包乱序的问题。

确认号:确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。

状态位SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。

窗口大小:TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快或太慢。

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它会控制发送的速度。

在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立,通常称为三次握手,目的是保证双方都有发送和接收的能力

TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看。

如果 HTTP 请求消息比较长,超过了 MSS 的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送。

19e943a58eb946788d753df370e5864a.png

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
  • 数据会被以 MSS 的长度为单位进行拆分,并对每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。

2092d1ae67544ec7873a0e7a3a439a23.png

三、组装IP头部

b66e2e6b403e43f5b3f485e93f522f96.png

假设客户端有多个网卡,就会有多个 IP 地址,那 IP 头部的源地址应该选择哪个 IP 呢?

这个时候就需要根据路由表规则,来判断哪一个网卡作为源地址 IP。

在 Linux 操作系统,我们可以使用 route -n 命令查看当前系统的路由表。

7ad60385be404a3285f39926b3ed04d0.png

我们的目标IP地址和每一条目的子网掩码(Genmask)进行 与运算,得到结果如果与该条目的 Destination 相同,代表两者相匹配,即使用该网卡。

如果其他所有条目都无法匹配,就会自动匹配默认网关,它目标地址和子网掩码都是 0.0.0.0,并且后续就把包发给路由器,Gateway 即是路由器的 IP 地址。

四、组装MAC头部

770f7617927d49b1bb68e1f8711907ad.png

一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:

  • 0800 : IP 协议
  • 0806 : ARP 协议

发送方和接收方的MAC地址如何确认?

发送方:MAC 地址是在网卡生产时写入到 ROM 里的,读取出来写入到 MAC 头部就可以了。

接收方:需要 ARP 协议帮我们找到路由器的 MAC 地址。

ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。

然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。

如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

(发包时先查询 ARP 缓存,当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 广播查询。)

在 Linux 系统中,我们可以使用 arp -a 命令来查看 ARP 缓存的内容。

到这里就成功的形成了一个网络包,接下来需要进行网络包传输。

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此需要将数字信息转换为电信号,才能在网线上传输。

负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序

网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

db412e8785bb477b9c280c1b47825166.png

  • 起始帧分界符是一个用来表示包起始位置的标记
  • 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏

最后网卡会将包转为电信号,通过网线发送出去。

五、交换机

电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。

然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。

计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址

将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。

交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口

当 MAC 地址表找不到指定的 MAC 地址会怎么样?

找不到有两种情况:具有该地址的设备还没有向交换机发送过包。或者这个设备一段时间没有工作导致地址被从地址表中删除了。

交换机就会将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。

以下两个属于广播地址:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF
  • IP 地址中的 255.255.255.255

六、路由器

路由器和交换机是有区别的。

路由器是基于 IP 设计的,俗称三层网络设备,各个端口都具有 MAC 地址和 IP 地址;

交换机是基于以太网设计的,俗称二层网络设备,端口不具有 MAC 地址。

首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。

如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

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

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。转发会查询路由表,同上文的与运算匹配。

7aeac85333ee4e709431863ecb98edf7.png

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

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

发送后会经过一些交换机和路由器最后到达终点。在此过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

数据包抵达了服务器后,服务器开始拆快递

9a247d8e7f60460f951b75f9e74146cf.png

然后把客户端需要的页面封装在 HTTP 响应报文里。

HTTP 响应报文也需要 TCP、IP、MAC 头部,然后由服务端发给客户端。

客户端收到的数据包后同样开始拆包,得到 HTTP 响应报文后,交给浏览器去渲染页面,网页就可以正常显示了。

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

总结

1.域名解析获得IP地址。

2.HTTP报文通过依次组装TCP头部,IP头部和MAC头部形成网络包。

3.网卡在网络包开头添加报头和起始帧分界符,在网络包末尾添加 FCS(帧校验序列)。

4.交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。路由器查询路由表进行转发。(网络包需要经过多个交换机和路由器的转发才能到达目的地)

5.服务器拆包后发送HTTP 响应报文,响应报文组装 TCP、IP、MAC 头部后发给客户端。

6.客户端拆包后渲染页面。

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

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

相关文章

Idea 导入Mysql8.0驱动jar包

库是模块可以依赖的已编译代码的集合。在IntelliJ IDEA中,可以在三个级别上定义库: 全局 (可用于许多项目), 项目(可用于项目中的所有模块)和模块 (可用于一个模块) 简单…

密码学学习笔记(二十三):哈希函数的安全性质:抗碰撞性,抗第一原象性和抗第二原象性

在密码学中,哈希函数是一种将任意长度的数据映射到固定长度输出的函数,这个输出通常称为哈希值。理想的哈希函数需要具备几个重要的安全性质,以确保数据的完整性和验证数据的来源。这些性质包括抗碰撞性、抗第一原象性和抗第二原象性。 抗碰…

LeedCode刷题---双指针问题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 双指针简介 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 对撞指针:一般用于顺序结构中&…

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎,用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染,并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染(PBR)&…

论文学习-Bert 和GPT 有什么区别?

Foundation Models, Transformers, BERT and GPT 总结一下: Bert 是学习向量表征,让句子中某个词的Embedding关联到句子中其他重要词。最终学习下来,就是词向量的表征。这也是为什么Bert很容易用到下游任务,在做下游任务的时候&a…

python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图 下面代码可以驱动电脑接受声音数据,并实时展示音波图: import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import pyaudio import wave import os import op…

【改进YOLOV8】融合动态蛇形卷积&DCNV2的草莓分级分割分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展,图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行分离,从而更好地理解图像内…

后端部署-阿里云服务器-开设端口-域名解析-安全证书-备案

本文以阿里云的轻量级数据库为例子。 前言 要搭建一个完整的后端系统一般的步骤: 获得一台服务器----->开设端口----->搭建后台所需要的语言和应用---->利用公网ip地址测试后端程序------->购买域名和证书-------->域名绑定和解析------->icp备…

SpringBoot——嵌入式 Servlet容器

一、如何定制和修改Servlet容器的相关配置 前言: SpringBoot在Web环境下,默认使用的是Tomact作为嵌入式的Servlet容器; 【1】修改和server相关的配置(ServerProperties实现了EmbeddedServletContainerCustomizer)例如…

C语言小游戏:三子棋

目录 🌍前言 🚅目录设计 💎游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 👀怎么设置人下棋 👀怎么设置电脑下棋 ✈如何判断输赢 ✍结语 🌍前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…

利用DateFormat、Date、Calendar等相关类,编程实现如下功能

(1)用户输入2个日期,第一个日期用整数形式输入,把输入的整数设置为日历对象1的年月日的值。第二个日期以字符串形式输入,形如“2022-10-25”,并设置为日历对象2的年月日的值。将2个日期以“xx年xx月xx日”的…

C++12.4

沙发床的多继承 多继承代码实现沙发床沙发床继承于沙发和床 代码&#xff1a; #include <iostream>using namespace std;//封装 沙发 类 class Sofa { private:string sitting;double *size; public://无参构造函数Sofa() {cout << "Sofa::无参构造函数&quo…

接口自动化测试用例

1、接口文档 根据开发、产品的接口文档&#xff0c;以及评审&#xff0c;进行设计接口测试用例&#xff0c;它不像UI测试&#xff0c;有个界面&#xff0c;对于简单的系统&#xff0c;需求文档不提供也能覆盖所有功能&#xff0c;接口测试虽说可以抓包&#xff0c;但抓包无法覆…

STM32串口接收不定长数据(空闲中断+DMA)

玩转 STM32 单片机&#xff0c;肯定离不开串口。串口使用一个称为串行通信协议的协议来管理数据传输&#xff0c;该协议在数据传输期间控制数据流&#xff0c;包括数据位数、波特率、校验位和停止位等。由于串口简单易用&#xff0c;在各种产品交互中都有广泛应用。 但在使用串…

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的&#xff1a; 1.掌握HDFS的客户端操作&#xff0c;包括上传文件、下载文件、重命名、查看目录等&#xff1b; 2.掌握HDFS的Java API使用&#xff0c;能够利用Java API实现上传、下载等常用操作&#xff1b; 实验内容&#xff1a; HDF…

深度学习——第3章 Python程序设计语言(3.3 Python数据类型)

3.3 Python数据类型 目录 1. Python数值数据类型 2. Python库的导入和使用 3. Python序列数据类型 4. Python组合数据类型 计算机能处理各种类型的数据&#xff0c;包括数值、文本等&#xff0c;不同的数据属于不同的数据类型&#xff0c;有不同的存储方式&#xff0c;支持…

EM32DX-C2【C#】

1说明&#xff1a; 分布式io&#xff0c;CAN总线&#xff0c;C#上位机二次开发&#xff08;usb转CAN模块&#xff09; 2DI&#xff1a; 公共端是&#xff1a; 0V【GND】 X0~X15&#xff1a;自带24v 寄存器地址&#xff1a;0x6100-01 6100H DI输入寄存器 16-bit &#x…

nginx部署和安装-后端程序多端口访问-后端代理设置

部分补充 查看nginx是否安装http_ssl_module模块 ./nginx -V 看到有 configure arguments: --with-http_ssl_module, 则已安装。 如果没有安装&#xff1a;参考文档 nginx官网地址&#xff1a;nginx: download 这里下载nginx-1.18.0稳定版tar.gz 下载后&#xff0c;利用…

2023年多元统计分析期末试题

一、简答题 1、试述距离判别法、Fisher判别法和贝叶斯判别法的异同。 二、 2、设 X {X} X~ N 2 {N_2} N2​(μ&#xff0c;Σ)&#xff0c;其中 X {X} X ~ ( X 1 {X_1} X1​, X 2 {X_2} X2​, X 3 {X_3} X3​)&#xff0c;μ ( μ 1 {μ_1} μ1​&#xff0c; μ 2 {μ_2} …

长度最小的子数组

长度最小的子数组 描述 : 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 题目…