【计算机网络】输入网址到显示网页,期间发生了什么?

2023-05-16

摘要:如图1所示,从输入网址,按下回车键之后的数据传输流程发生了什么。

注意:各位大佬,如果有哪里写的不清楚,请在邮件pigmn@sina.com友善的交流。

图1 网址键入到网页显示流程

1.浏览器解析URL

浏览器第一步就是要对URL进行解析,从而生成发送给web服务器的请求信息。

图1 解析URL

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

2.HTTP请求信息

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

图2 Http请求报文和响应报文结构

3.DNS地址查询

浏览器在发送之前http消息之前,还需要查询服务器域名对应的IP地址,然后委托操作系统发送消息给对方。

域名解析的工作流程如下所示:

1.客户端首先会发出一个DNS请求,问www.baidu.com的ip是啥,并发给本地DNS服务器(也就是客户端TCP/IP设置中填写的DNS服务器地址)。

2.本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.baidu.com,则它直接返回IP地址。如果没有,本地DSN会去问它的根域名服务器,根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。

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

4.本地dns收到顶级域名服务器的地址后,发起请求问“请告诉我www.baidu.com这个域名的IP地址”

5.顶级域名服务器说:“我给你负责www.server.com区域的权威dns服务器的地址,你去问它”

6.本地dns于是询问权威dns服务器,baidu.com的权威dns服务器,它是域名解析结果的原出处,

7.权威dns服务器查询后将对应的IP地址x.x.x.x告诉本地dns

8.本地dns在将ip地址返回客户端,客户端和目标建立连接。

我们这样就完成了dns的解析过程。

总结一下:一共我们涉及到了4种dns服务器。

  • 本地dns服务器:它的级别最小,它的地址就是TCP/IP设置中填写的DNS服务器地址。
  • 根域名服务器(.):它的级别最大,但是它不负责dns域名解析工作,但是它会告诉你.com或者.cn的顶级域名服务器地址。
  • 顶级域名服务器(.com|.cn):它的级别比根域名服务器小一级。
  • 权威dns服务器(.baidu.com):它的界别比顶级域名服务器小一级,它就是域名解析的原出处。本地dns服务器得到ip地址后,就会缓存到本地dns服务器。

4.协议栈

当操作系统收到浏览器的委托后,将HTTP的传输工作交给操作系统中的协议栈。

浏览器通过调用Socket库,来委托协议栈工作,如图1所示,协议栈有两块,分别是负责收发数据的TCP和UDP协议,他们两个会接收应用层的委托执行收发数据的操作。

协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。

IP协议中包含了ICMP协议和ARP协议:

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

IP下面的网卡驱动负责控制网卡硬件,而最下面的网卡负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。

5.TCP(运输层)

HTTP是基于TCP协议传输的,所以我们要了解些tcp协议。

5.1TCP的报文格式

如图3所示:

图3 TCP报文格式

  1. 源端口号和目标端口号:确定数据从哪个应用发送到哪个应用。
  2. 序号:为了解决包乱序的问题。
  3. 确认号:确认发出去对方是否收到,如果没有收到就应该重新发送,直到送达,这个是为了解决丢包问题。
  4. 状态位:SYN是发起一个连接,ACK是回复,RST是重新连接,FIN时结束连接等。TCP时面向连接的,因而双方要维护连接的状态,这些带状态的包发送,会引起双发的状态变更。
  5. 窗口大小:TCP要做流量控制,通信双方各生命一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快或太慢。(拥塞避免)

5.2 TCP的三次握手

TCP在传输数据之前,要先进行三次握手,如图4所示:

图4:TCP三次握手

  • 一开始,客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口,处理LISTEN状态。
  • 然后客户端主动发起连接SYN,之后处于SYN-SENT状态。
  • 服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-REVD状态。
  • 客户端收到服务端发送的SYN和ACK之后,发送对SYN确认的ACK,之后处于ESTABLISHED状态,因为它一发一收就成功了。
  • 服务端收到ACK的ACK,处于ESTABLISHED状态,因为它也一发一收了。

所以三次握手目的是保证双方都有发送和接受的能力。

TCP报文生成

TCP协议里面有两个端口,一个是浏览器监听的端口(通常是随机生成的),另一个是WEB

服务器监听的端口(HTTP默认端口是80,HTTPS默认端口号时443)。

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

6.IP网络层

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

IP数据包的数据格式如下所示:

图5 IP数据包格式

在IP协议里面需要有源地址IP和目的地址IP:

  • 源地址IP,即是客户端输出的IP地址;
  • 目标地址,即通过DNS域名解析得到的Web服务器IP。

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

假如客户端有多个网卡,就有多个IP地址,那就需要根据路由表规则,来判断哪一个网卡左元源地址IP。

最后,就会生成IP报文。

7.MAC(数据链路层、网络接口层)

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

图6 Mac帧格式

mac头部是以太网使用的头部,它包含了接收方和发送方的mac地址等信息。

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

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

如果获取发送方和接收方的mac地址?

发送方的mac地址获取比较简单,mac地址是在网卡生产时写入到rom里的,只要将这个值读取出来写入到mac头部就好了。

接收方的mac地址有点复杂,这时就需要ARP协议帮我们找到路由器的mac地址。ARP协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个IP地址是谁的?请告诉我你的mac地址”,得知后,就会将结果缓存起来,叫做ARP缓存。

至此,就生成了mac报文。

8.网卡

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。负责这一操作的得失网卡,控制网卡需要网卡驱动程序。

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

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

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

9.交换机

交换机的设计是将网络包原样转发到目的地。交换机工作在MAC层,也称为二层网络设备。

交换机的包接收操作

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

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

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

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

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

  • 一个是设备的 MAC 地址,
  • 另一个是该设备连接在交换机的哪个端口上。

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

这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包

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

以下两个属于广播地址:

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

10.路由器

路由器与交换机的区别

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。

这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

不过在具体的操作过程中,路由器和交换机是有区别的。

  • 因为路由器是基于IP设计的,俗称三层网络设备,路由器的各个端口都具有MAC地址和IP地址;
  • 而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有MAC地址。

路由器的基本原理

路由器的端口具有mac地址,因此它就能够成为以太网的发送方和接收方;同时还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。

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

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

11.服务端与客户端

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

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

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

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

服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。

HTTP 响应报文也需要穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络】输入网址到显示网页,期间发生了什么? 的相关文章

  • 后端: linux后台运行 nohup: ignoring input and appending output to ‘nohup.out’

    Unix Linux下一般比如想让某个程序在后台运行 xff0c 很多都是使用 amp 在程序结尾来让程序自动运行 但是如果终端关闭 xff0c 那么程序也会被关闭 但是为了能够后台运行 xff0c 那么我们就可以使用nohup这个命令 n
  • css: css3动画(淡入淡出)

    64 keyframes 规则用于创建动画 xff0c 并且必须 把它捆绑到某个选择器 xff0c 否则不会产生动画效果 您必须定义动画的名称和时长 如果忽略时长 xff0c 则动画不会允许 xff0c 因为默认值是 0 xff08 动画的
  • 小程序:插件未授权使用

    问题1 登录用户不是该小程序的开发者 替换 project config json 文件下的appid 问题2 插件未授权使用 由于我个人是个体工商户 xff0c 添加不了 社交 gt 直播 类型 xff0c 所以开发者工具登录我的微信没法

随机推荐

  • 03 SCons 自动构建工具编译hello.c

    安装mingw 我的电脑已经安装过 xff0c 下面主要说下配置环境 我们将mingw的路径和scons的虚拟环境路径添加到临时的环境变量 这样做的好处是使用的时候添加 xff0c 不与其它版本的全局的环境变量冲突 后期我编译ARM程序时把
  • flutter报错: Gradle threw an error while downloading artifacts from the network. Retrying

    项目之前是可以正常运行的 xff0c 突然就报这个错误了 Gradle threw an error span class token keyword while span downloading artifacts span class
  • webpack:1 概念

    loader的作用 xff1a 是用来处理不同类型的文件 xff0c 操作的是文件 plugin的作用 xff1a 是一个扩展器 xff0c 不操作文件 xff0c 用来增强功能 其它webpack的使用看webpack原汁原味的 官网 高
  • 数据库: mongodb导入json数据

    登录聚合数据 xff0c 找些免费的api请求后下载成json文件 xff0c 去掉多余的格式只保留数组格式 xff0c 选择json文件即可导入成功 可以看资源 xff1a 新闻头条新闻头条新闻头条 carc1subject1 json
  • webpack: 4 loader汇总(style-loader等)

    所有的loader必须匹配规则 xff0c 否则不生效 配置文件中 xff0c module中rules的use执行顺序是从后往前执行 url loader 用于将文件转换为base64 URI的webpack加载程序 options li
  • webpack: 5 报错,错误

    webpack 报错 xff1a Uncaught ReferenceError is not defined webpack webpack打包jquery的插件 xff08 EasyLazyLoad xff09 时 xff0c 报错 方
  • Vue:无限滚动-通过vant组件

    一 xff1a 下拉刷新上拉加载功能 1 实现原理 xff1a 通过vant的List和PullRefresh两个组件实现 xff08 PullRefresh组件标签包裹List组件标签 xff09 2 我遇到的问题 Load方法触发的次数
  • webpack:打包示例-打包多入口

    入口 entry 前台 index 39 public assets js index 39 打包入口项 list 39 public assets js list 39 search 39 public assets js search
  • kubernetes基础——一文读懂k8s

    容器 容器与虚拟机对比图 左边为容器 右边为虚拟机 容器技术是虚拟化技术的一种 xff0c 以Docker为例 xff0c Docker利用Linux的LXC LinuX Containers 技术 CGroup Controll Grou
  • curl错误28:Resolving timed out after 15009 milliseconds解决方案

    报错信息如字面意思就是连接超时了 xff0c 解决方案如下 xff1a 1 检查Curl的超时参数 xff0c 如果设置小于1s的超时时间 xff0c curl会直接返回超时错误 xff08 28 xff09 xff0c 并不会发起任何的请
  • Linux 可视化桌面远程连接

    Linux xff08 一 xff09 防止系统文件修改导致DNS清空 chattr 43 i etc resolv conf xff08 二 xff09 安装vnc yum install y tigervnc tigervnc serv
  • C-Free5注册码,秘钥,解决办法

    C Free5注册码 xff0c 秘钥 xff0c 解决办法 用户名 xff1a 123123 电子邮件 xff1a 111 64 qq com 注册码 xff1a mJ2Em9jdm7jGwYTpmp2H6KmehtvO 显示让重启电脑
  • Ubuntu16.04将python命令指向python3

    第一步 xff1a 将原来的python文件进行备份 sudo cp usr bin python usr bin python bak 第二步 xff1a 删除原来指向python2的文件 sudo rm usr bin python 第
  • 素数伴侣

    题目 xff1a 解析 xff1a 本题目采用了匈牙利算法 xff0c 起初以为只是找到所有的素数伴侣 xff0c 但是题目有一个条件 xff0c 那就是每个数字只能使用一次 xff0c 组成拥有最多的素数伴侣 代码产出 xff1a spa
  • 接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题

    新建的springboot项目是2 3 1的版本 xff0c 打包到金蝶中部署就一直栈内存溢出 后来把pom文件中的父依赖换成了2 2 4版本 xff0c 打包部署到金蝶中就能运行了 xff0c 我也不知道具体原因 如果有知道具体原因的请不
  • 如何解决centos虚拟机每次启动都要自己登录root问题

    解决办法 xff1a 可以通过修改 etc gdm custom conf文件 xff0c 实现root用户免密码自动登陆 1 输入命令vi etc gdm cutstom conf 2 在 daemon 下增加 需要插入时按i进行插入模式
  • 关于word中最后一个分节符导致的空白页删除问题

    主要原因 xff1a 一般最后一个空白页出现的原因有两个 xff0c 一个是分节符或者分页符导致 xff0c 另一个是上一页内容太多顶出来导致多一些 xff08 这种情况可以选择调节前面内容长度 xff0c 并设置前页最后一个字符的行距 x
  • 逐层贪婪预训练(解决梯度消失的第一个成功方案,但现在除了NLP领域外很少使用)

    起因 背景 xff1a 梯度消失 vanishing gradient problem DNN的训练中 xff0c 由于梯度消失 xff0c 即输出层的错误在反向传播的过程中会显著地越来越小 xff0c 所以靠近输入层的层的梯度就接近0 x
  • 前端——块元素和内联元素的概念以及区别

    一丶块元素 xff1a 1 前后有换行符 xff0c 独占一行 xff0c 默认情况下 xff0c 垂直排列 2 默认情况下高度有内容决定 xff08 就比如由里边的图片和文字决定高度 xff09 xff0c 宽度是父级的宽度 xff0c
  • 【计算机网络】输入网址到显示网页,期间发生了什么?

    摘要 xff1a 如图1所示 xff0c 从输入网址 xff0c 按下回车键之后的数据传输流程发生了什么 注意 xff1a 各位大佬 xff0c 如果有哪里写的不清楚 xff0c 请在邮件pigmn 64 sina com友善的交流 图1