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

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

参考:2.2 键入网址到网页显示,期间发生了什么? | 小林coding | Java面试学习

以下为自己做的笔记

HTTP

浏览器做的第一件事情是解析URL

没有路径名时,访问默认文件。

生成HTTP请求信息

确定了web服务器和文件名,根据这些信息生成HTTP请求消息。

DNS

现在需要将生成的HTTP文件发送给web服务器。

我们现在只知道主机名,但没有IP地址,怎么在网络世界中知道去哪呢?现在就需要DNS服务器查询域名对应的IP地址。

域名的层级关系   www.server.com.  最后这个点代表根域名

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。

所有的DNS服务器找到根域服务器,向下顺层摸瓜就找到了需要解析的域名的DNS服务器。得到返回的IP地址。

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问 本地 DNS 服务器。

协议栈

知道IP后,就可以把传输工作交给协议栈了。

如上图协议栈中,上层是TCP、UDP,下层是IP

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

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

可靠传输--TCP

TCP报文头部:

首先,源端口号目标端口号是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。

接下来有包的号,这个是为了解决包乱序的问题。

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

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

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

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯-能做的就是控制自己,也即控制发送的速度。不能改变世界,就改变自己嘛。

TCP传输前进行三次握手

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

TCP报文生成,接下来,交给网络层。

远程定位--IP

IP报文头部:

两点传输--MAC

以太网中传输是两点匹配的方式

MAC头部格式:

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

查路由表(知道该发给谁)>有了IP,ARP协议帮我们找MAC地址

接收方的MAC地址就有了

不用每次都广播,先查ARP缓存,没有再广播。

MAC报文生成

出口--网卡

FCS(帧校验序列)用来检查包传输过程是否有损坏

转换为电信号,通过网线发送出去

交换机

交换机的端口不具有 MAC 地址

包到达交换机后查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。地址表中有两个信息:

设备的MAC地址

设备连接在交换机的哪个端口

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

找不到MAC地址时,发送到所有端口。

通过交换机到达路由器,离开子网了。从路由器出境。

路由器

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方。

MAC 头部的作用就是将包送达路由器。路由器接收包,路由表查询转发目标,(根据路由表的网关列判断到没到达终点),确定下一个IP地址后,ARP协议查询MAC地址,将其作为目标MAC,传输到下个节点。

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

扒皮

到达服务器后,开始对数据包进行扒皮

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

扒开IP头,发现IP符合,根据协议项,知道是TCP协议。

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

知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

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

这时收发方转换,但原理相同。

http://www.dtcms.com/a/335456.html

相关文章:

  • Tomcat Connector连接器原理
  • Bee1.17.25更新Bug,完善功能.不支持NOSQL,分库分表Sharding(2.X版有)
  • Rust Async 异步编程(一):入门
  • AI评测的科学之道:当Benchmark遇上统计学
  • uniapp中uni.showToast和 uni.showLoading同时使用时出现提示中断冲突问题。
  • Maven 开发实践
  • Java ConcurrentHashMap 深度解析
  • Mitt 事件发射器完全指南:200字节的轻量级解决方案
  • Git 命令指南:从 0 到熟练、从常用到“几乎全集”(含常见报错与解决)建议收藏!!!
  • Leetcode 深度优先搜索 (2)
  • Java多线程进阶-JUC之ReentrantLock与Callable
  • Oracle algorithm的含义
  • 【牛客刷题】01字符串按递增长度截取并转换为十进制数值
  • 26. 值传递和引用传递的区别的什么?为什么说Java中只有值传递
  • 告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验
  • 【JavaEE】多线程 -- 单例模式
  • 基于Python的情感分析与情绪识别技术深度解析
  • 锂电池SOH预测 | Matlab基于KPCA-PLO-Transformer-LSTM的的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集
  • CVPR2 2025丨大模型创新技巧:文档+语音+视频“大模型三件套”
  • 音频分类标注工具
  • 91.解码方法
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 17.5 展示购物车缩略信息
  • JMeter(进阶篇)
  • 3D打印——给开发板做外壳
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • Trae 辅助下的 uni-app 跨端小程序工程化开发实践分享
  • Docker之自定义jkd镜像上传阿里云
  • Spring AI 集成阿里云百炼平台
  • vscode无法检测到typescript环境解决办法