TCP/IP 网络模型详解(二)之输入网址到网页显示的过程

news2025/1/11 13:04:14

当键入网址后,到网页显示,其间主要发生了以下几个步骤:

一、解析URL

下图是URL各个元素所表示的意义:

右边蓝色部分(文件的路径名)可以省略。当没有该数据时,代表访问根目录下事先设置的默认文件

解析完URL之后,浏览器获取得到 Web服务器文件名 ,然后可以根据这些信息来生成 HTTP 请求信息了。

二、DNS

DNS(Domain Name System,域名系统)是互联网中用于将域名(如www.server.com)转换为相应 IP 地址的服务。

上面解析URL后得到的只是 Web服务器 的域名,之后还需要通过DNS解析域名获取对应的 IP 地址。

域名解析过程如下:

1)客户端首先向本地DNS服务器发送一个DNS请求,问域名www.server.com的IP是多少。

2)本地DNS服务器收到请求后,如果在本地缓存中能找到www.server.com,则直接返回它的IP地址;若没有,本地 DNS则会去请求根域名服务器,问能否告诉www.server.com 的 IP 地址吗?根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。

3) 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”

4)本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”

5)顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。

6)本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。

7)权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。

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

至此,DNS解析便结束了!

三、TCP传输

HTTP是基于TCP协议传输的。在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立,通常称为三次握手

1、一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。

2、然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。

3、服务端收到发起的连接,返回 SYN + ACK ,之后处于 SYN-RCVD 状态。

4、客户端收到服务端发送的 SYN + ACK 之后,再发送 ACK ,之后处于 ESTABLISHED 状态,因为它一发一收成功了。

5、服务端收到 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

在 Linux 中,可以通过 netstat -napt 命令查看 TCP 的连接状态,如下图:

TCP包头格式如下:

TCP 协议里面会有两个端口,一个是浏览器(客户端)的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。

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

四、IP定位

TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。

IP 报文头部格式如下:

版本(4位)首部长度(4位)服务类型TOS(8位)
总长度(16位)
标识(16位)
标志(3位)片偏移(13位)
TTL(8位) 协议(8位)
首部校验和(16位)
源IP地址(32位)
目标IP地址(32位)
选项
数据

因为 HTTP 是经过 TCP 传输的,所以 IP 包头的协议号为 06(十六进制),表示协议为 TCP。

当存在多个网卡时,需要根据路由表规则,来判断哪一个网卡作为源地址 IP。

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

将服务器的目标地址和子网掩码(Genmask)进行 与运算 ,然后与 Destination 相匹配。若有匹配成功,则用它网卡的IP 地址作为 IP 包头的源地址,否则会匹配默认网关,它目标地址和子网掩码都是 0.0.0.0 。后续就把包发给路由器,Gateway 即是路由器的 IP 地址。

五、MAC报文

生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。MAC 头部是以太网使用的头部。

在 MAC 包头里需要发送方 MAC 地址接收方目标 MAC 地址,用于两点之间的传输

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

1、0800 : IP 协议

2、0806 : ARP 协议(用于根据 IP 地址查询相应的以太网 MAC 地址)

MAC 地址是在网卡生产时写入到 ROM 里的,发送方的 MAC 地址可以直接从这里读取。接收方的 MAC 地址会先在本地ARP 缓存中查找,若查找不到则会通过 ARP 广播查询。

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

MAC 报文如下:

六、网卡

网络包只是存放在内存中的一串二进制数字信息。接着,网卡驱动程序会控制网卡数字信息转换为电信号在网线上传输。

网卡驱动会在网络包开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列,具体如下图:

七、交换机

网络包从网卡出来之后,便传输到了交换机。交换机会将网络包原样转发到目的地。

首先,交换机将电信号转换为数字信号,然后通过包末尾的 帧校验序列 校验错误,如果没问题就放到缓冲区。

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

交换机的 MAC 地址表主要包含两个信息:

1、一个是设备的 MAC 地址

2、另一个是该设备连接在交换机的哪个端口上。

当根据 MAC 地址查询到记录时,交换机会将网络包发送到相应的端口上。

若查询不到,这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。这时,交换机将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。接着,目标设备会作出响应,返回响应包。之后,交换机就可以将它的地址写入 MAC 地址表,下次也就不需要把包发到所有端口了。

以下两个属于广播地址:

1、MAC 地址中的 FF:FF:FF:FF:FF:FF

2、IP 地址中的 255.255.255.255

八、路由器

路由器会接收来自交换机的网络包,接着对包末尾的 帧校验序列 校验错误,如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

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

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

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

首先,查询路由表确定输出端口。根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。

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

知道对方的 IP 地址之后,首先会在 ARP 缓存中查询MAC 地址

如果找不到则发送 ARP 查询请求,并将查询的结果作为接收方 MAC 地址。

将输出端口的 MAC 地址作为发送方 MAC 地址字段,以太类型字段填写 0800 (十六进制)表示 IP 协议,这样组成一个新的网络包,之后便可以将其通过端口发送出去。

最后经过路由器之间的层层转发,网络包就到达了最终的目的地(服务器)。

在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

九、服务器

数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。

接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。

于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号,HTTP 的服务器正在监听这个端口号。

于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

网络包组装好后,从网卡出去,交由交换机转发到出城的路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。

从网卡出去,交由交换机转发到出城的路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。

客户端收到了服务器的响应数据包后,把收到的数据包的皮扒剩 HTTP 响应报文后,交给浏览器去渲染,页面就这样显示出来了!

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

觉得有帮助的话,打赏一下呗。。

           

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础STM32单片机编程入门(二十四) 内部FLASH详解及读写实战含源码

文章目录 一.概要二.内部FLASH地址空间排布三.内部FLASH主要特色四.内部FLASH读写操作1.FLASH数据读取2.FLASH数据擦除3.FLASH数据写入 五.内部FLASH的各种保护1.写保护2.读保护 六.FLASH读写例程七.CubeMX工程源代码下载八.小结 一.概要 STM32F103C8T6是一款强大而灵活的微控…

Language——基础

前言 开发语言的本质 不同数据类型之间的值传递 正则表达式 (1) 几乎所有语言都支持正则表达式 (2) ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$ 数据库 (1) 增删改查 一. Python 二.Java 主语言 1. 文件类型 (1) 源代码文件 java——java程序源代码 …

keepalived介绍以及配置主备库自动切换,一条龙服务

Keepalived是什么? Keepalived是一种用于实现高可用性(HA)的开源软件,它通过虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)来实现主备切换,从而提高服务的可用性。 虚拟路由冗…

Matplotlib知识点详解(巨详细!!!)

37.Matplotlib: 配置参数: 如果浏览器不显示图片,加上 %matplotlib inline 让图片可以显示中文 plt.rcParams[font.sans-serif]SimHei 让图片可以显示负号 plt.rcParams[axes.unicode_minus]False 支持svg矢量图 %config Inlineback…

[C++] 深入浅出list容器

文章目录 list介绍list接口的使用构造函数iterator迭代器capacity**element access**modifiers list中的迭代器失效问题常见容器及其迭代器类型特性单向迭代器(Forward Iterator)双向迭代器(Bidirectional Iterator)随机访问迭代器…

肆[4],VisionMaster全局触发测试说明

1,环境 VisionMaster4.3 2,实现功能 2.1,全局触发进行流程控制执行。 2.2,取像完成,立即运动到下一个位置,同步进行图片处理。 2.3,发送结果的同时,还需要显示图像处理的痕迹。 …

力扣爆刷第168天之TOP200五连刷106-110(每日温度单调栈、盛水最多滑动窗口、全排列回溯)

力扣爆刷第168天之TOP200五连刷106-110(每日温度单调栈、盛水最多滑动窗口、全排列回溯) 文章目录 力扣爆刷第168天之TOP200五连刷106-110(每日温度单调栈、盛水最多滑动窗口、全排列回溯)一、138. 随机链表的复制二、739. 每日温…

⌈ 传知代码 ⌋ 记忆注意力用于多模态情感计算!

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

【TS】TypeScript数组类型:掌握数据集合的类型安全

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript数组类型:掌握数据集合的类型安全引言1. TypeScript数组类…

Three.js结合物理引擎实现掉落效果

<template> </template><script setup> import * as THREE from three import gsap from gsap //导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入 dat.gui import { GUI } from three/addons/libs/lil-gui…

好用的抠图软件在哪里找?这篇文章就有几款好用的抠图工具

在图像处理的世界中&#xff0c;抠图技术无疑是一项至关重要的技能。 无论是设计师、摄影师还是普通的图像编辑爱好者&#xff0c;都可能需要从一张图片中精确地分离出某个对象或元素。但是&#xff0c;手动抠图不仅耗时而且技术要求高&#xff0c;这时候&#xff0c;一款优秀…

PTrade常见问题系列17

是否支持量化帐号的指定服务器分发? 是否可以支持部分量化帐号不根据原有分发规则&#xff0c;而是直接指定分发&#xff1f; 1、若需要增加VIP服务器专用于新增的帐号进行分配&#xff0c;可以参考【量化】量化Nginx用户指定服务器处理步骤.docx&#xff1b; 2、若所有服务…

【音视频之SDL2】Windows配置SDL2项目模板

文章目录 前言 SDL2 简介核心功能 Windows配置SDL2项目模板下载SDL2编译好的文件VS配置SDL2 测试代码效果展示 总结 前言 在开发跨平台的音视频应用程序时&#xff0c;SDL2&#xff08;Simple DirectMedia Layer 2&#xff09;是一个备受欢迎的选择。SDL2 是一个开源库&#x…

“AI+”时代,人工智能前景怎么样?

随着“互联网”到“AI”的转型&#xff0c;时代发展迎来了新的阶段。 在政策、技术和市场的三重驱动之下&#xff0c;人工智能正在快速响应各领域的广泛诉求。虽然人工智能的兴起“打消”了一些传统领域的念想&#xff0c;但同时也开辟了更加多元化的市场。 当下互联网大厂人…

AgentBench: Evaluating LLMs As Agents

AgentBench: Evaluating LLMs As Agents Github&#xff1a; https://github.com/THUDM/AgentBench 榜单&#xff1a;https://llmbench.ai/agent/data demos&#xff1a;https://llmbench.ai/agent/demo 备注&#xff1a;该论文介绍为AgentBench v0.2版本 一、介绍 现如今&am…

计算机网络01

文章目录 浏览器输入URL后发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么&#xff1f; URL解析 当在浏览器中输入URL后&#xff0c;浏览器首先对拿到的URL进行识别…

sdwan

分支互联网络解决方案 - 华为企业业务 分支互联网络解决方案 随着5G、AI、物联网等新兴技术与云紧密结合&#xff0c;企业业务智能化和云化加速。 企业分支WAN流量激增&#xff0c;传统以MPLS专线为主的广域互联网络难以支撑业务发展。SD-WAN成为应对云时代的必然选择。 SD…

将 magma example 改写成 cusolver example eqrf

1&#xff0c;简单安装Magma 1.1 下载编译 OpenBLAS $ git clone https://github.com/OpenMathLib/OpenBLAS.git $ cd OpenBLAS/ $ make -j DEBUG1 $ make install PREFIX/home/hipper/ex_magma/local_d/OpenBLAS/1.2 下载编译 magma $ git clone https://bitbucket.org/icl…

专业且免费的重复文件查找与删除工具,文本,图片,音频和视频等

AllDup是一款专业的重复文件查找与删除工具。作为一款免费软件&#xff0c;AllDup以其出色的功能和简洁的操作界面广受欢迎。它不仅可以有效地识别和删除电脑硬盘以及外部设备如USB闪存驱动器中的重复文件&#xff0c;还能对多媒体文件如图片、音频和视频等进行特殊处理&#x…