首页 > 编程语言 >优秀的面试官!通过一个问题考察了所有网络编程知识点

优秀的面试官!通过一个问题考察了所有网络编程知识点

时间:2024-10-12 08:48:44浏览次数:4  
标签:知识点 面试官 浏览器 URL 编程 TCP 域名 DNS 服务器

一、写在开头

本文的主题是和大家一起探讨学习:“在浏览器中输入URL开始后,计算机所做的几件事”,这个问题是好几年前自己面试的时候,面试官考问过的,当时准备十分不充分,回答的一塌糊涂,今天拿出来再整理学习一遍,一同进步!

其实这个问题本身倒是不难,但它巧妙的是可以将我们所学过的网络编程知识给串联起来,面试官仅仅通过一个问题就可以考察出我们对于这部分知识的掌握程度。那么我们今天也以此为题展开网络编程的正式学习啦!

二、访问网页的底层运行机制

image

如上图所示,当我们在浏览器的搜索框中输入了“www.baidu.com”并回车后,浏览器就跳转到了百度的首页中,这个过程计算机做了哪些操作呢?

1. 在浏览器中输入指定的URL地址; 2. 浏览器通过DNS协议(域名解析协议),获取域名所对应IP地址; 3. 浏览器根据获取到的IP+端口,向目标服务器端发动一个TCP连接请求; 4. 经过三次握手后TCP连接成功,浏览器会在该TCP连接上发送一个HTTP请求报文; 5. 服务器处理HTTP请求后,反馈响应报文给浏览器; 6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。 7. 浏览器不与服务器交互时,会通过四次挥手关闭TCP连接。


三、解析底层

在第二章中我们将浏览器的操作分为了7个小点,接下来,我们就来分别解释一下其中所用到的技术,由于单篇文章篇幅不易过长,其中的知识点都是粗讲,达到贯穿理解即可,后续会针对每一个知识点,如TCP/UDP,HTTP,DNS等进行单独分析。

3.1 URL

在我们浏览器输入的一个可以访问我们想要的内容,这个输入就叫做URL,英文为:Uniform Resource Locators,释义:统一资源定位器。它可以标识网络中唯一的资源,并给出定位它的路径。与之相关的还有一个URI(Uniform Resource Identifier):统一资源标志符,它可以唯一标识一个资源。

URL是一种具体的URI,它不仅唯一标识资源,还提供定位地址,URI比喻成我们的身份证号的话,那URL就是我们具体的家庭住址。

URL的结构:

image

在这里插入图片描述
  • http:// :超文本传输协议,URL的前缀,属于应用层协议,通常有HTTP和HTTPS,文件传输URL中前缀为ftp等。
  • www.example.com: 域名,这里也可以为IP地址,它们之间具有一一映射关系,只不过域名更通俗易记。
  • 80: 端口,如果指明了访问网址的端口的话,端口会紧跟在域名后面,并用一个冒号隔开,当然有些时候,域名已配置好对应的默认访问地址的话,这里就不会存在端口号。
  • /path/to/myfile.html: 资源路径,从域名(端口)后以/开始到?前结束的这一段路径,作为访问具体资源的一个地址,从第一个/开始,表示从服务器上根目录开始进行索引到的文件路径,上图中要访问的文件就是服务器根目录下/path/to/myfile.html。
  • key1=value&key2=value2:参数,在http发送get请求时,参数会包含在URL中,与路径以?分割开始,key=value的形式出现,多参情况下,用&分割,有些请求的参数是放在body中的,比如post。
  • #SomewhereInTheDocument : 锚点,顾名思义,是在要访问的页面上的一个锚。要访问的页面大部分都多于一页,如果指定了锚点,那么在客户端显示该网页是就会定位到锚点处,相当于一个小书签。值得一提的是,在 URL 中,锚点以#开头,并且不会作为请求的一部分发送给服务端。

3.2 DNS

我们在上面提到了域名与IP地址映射关系,这里其决定作用的就是DNS(Domain Name System) 域名系统,具体流程如下:

  1. 本地缓冲查询:当我们在浏览器中输入一个域名后,会先到浏览器缓存中查询,是否已经存在该域名解析结果,如果存在则返回对应IP地址,否则进行下一步;
  2. 本地DNS服务器查询:本地缓存中没有后,浏览器会向本地配置的DNS服务器发送递归查询请求,如果本地DNS服务器也没有命中,则继续下一步;
  3. 根DNS服务器查询:如果本地DNS服务器也没有相应的解析结果,它会向根DNS服务器发送迭代查询请求。根DNS服务器负责管理顶级域名服务器的IP地址,它会根据顶级域名(例如.com)的信息返回对应的顶级域名服务器的IP地址;
  4. 顶级域名查询:本地DNS服务器向顶级域名服务器发送查询请求,并根据顶级域名的信息返回下一级域名服务器的IP地址。这个过程会一层一层地向下查询,直到找到负责解析的权威域名服务器;
  5. 权威域名查询:本地DNS服务器向权威域名服务器发送查询请求,并获取域名对应的IP地址。本地DNS服务器会将解析结果缓存起来,并返回给浏览器;
  6. 返回并缓存:浏览器收到本地DNS服务器返回的IP地址后,会将其存储在本地缓存中,并发起与该IP地址相关的网络请求。

3.3 TCP

在3.2部分,通过DNS解析,拿到了目标主机的IP地址后,浏览器就可以向目标服务器发送TCP连接请求,TCP协议是传输层协议,可以在建立了安全连接的基础上,控制数据传输,保证可靠性,并且支持双向通信,像HTTP,HTTPS都是建立在TCP协议之上的。(TCP连接最经典的就是3次握手!)

注意:TCP/IP协议是绑定来看的,建议TCP协议时,需要发送数据,发送数据就需要网络层的IP协议,这个协议一种分组交换的协议,不保证可靠传输,负责将数据包从源主机路由到目标主机。

3.4 HTTP

建立了TCP连接后,浏览器就可以向目标服务器发送HTTP请求报文啦,当然,有些网站配置了安全增强的HTTPS协议,之间的区别,我们后面会单独来聊,包括HTTP1.0,HTTP1.1等内容。

3.5 服务器处理并返回响应

服务器在接收到HTTP报文后,根据对应的接口、参数、cookies生成一个HTML响应,并返回给浏览器,浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。

四、总结

以上就是整个网络请求所涉及到的TCP/IP四层模型的实战内容,它也是我们网络编程学习中的重中之重,至于其中的每一层的细节,我们后面单个精讲!

标签:知识点,面试官,浏览器,URL,编程,TCP,域名,DNS,服务器
From: https://www.cnblogs.com/JavaBuild/p/18459756

相关文章

  • 学习之高阶编程列表推导式,字典推导式
    deftest_list_one():“”“快速生成一个[“data0”,“data1”,]列表”“”list1=[]foriinrange(100):list1.append(“data{}”.format(i))returnlist1deftest_list_two():“”"快速生成一个[“data0”,“data1”,]列表列表推导式:[xforxinxx]推导式......
  • 实验1 现代C++编程初体验
    实验1:task.cpp1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>5usingnamespacestd;67template<typenameT>8voidoutput(constT&c);910voidtest1();11voidtest2();......
  • c++知识点多关键字排序
    在C++中,可以使用std::sort函数结合自定义的比较函数对多关键字进行排序。以下是一个示例代码,演示如何根据两个关键字对结构体进行排序:#include<iostream>#include<vector>#include<algorithm>structItem{intfirstKey;intsecondKey;std::stringname;};//自定......
  • Java并发编程常见面试题
    1.简要描述线程和进程的关系,区别以及优缺点进程:操作系统为程序分配的资源集合,每个进程拥有独立的地址空间。线程:同一个进程可以包含多个线程,他们共享线程的地址空间和资源。一个进程中可以有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序......
  • Java并发编程-线程池
    ThreadLocal应用场景:两个线程争执一个资源。解决问题:实现每个线程绑定自己的专属本地变量,可以将ThreadLocal类理解成存放数据的盒子,盒子中存放每个线程的私有数据。线程池的用途选择快速响应用户请求:比如说用户查询商品详情页,会涉及查询商品关联的一系列信息如价格、优......
  • 一文搞懂redis的所有知识点
    简介:整理自黑马程序员苍穹外卖项目p50-p62Redis简介Redis的下载与安装Redis安装包的目录结构redis.window.conf配置文件修改密码:Redis服务的启动也可直接双击redis-server.exe文件启动Redis客户端连接服务端Redis图形化界面三款图形化界面工具下载地址1、A......
  • 实验一,现代C++编程初体验
    一、实验目的 体验C++的标准库,算法库用法。数据表示,分支循环,函数和标准库等,编程解决简单基础问题。二、实验准备 第二章C++语言简单设计第三章函数第九章函数模板 三、实验内容 1.实验任务1代码:1#include<iostream>2#include<string>3#include<vector>......
  • 找到你的编程“秘密武器”:提升工作效率的工具分享
    在如今竞争激烈、任务繁忙的工作环境中,开发者们始终在寻找能够提高效率的编程工具。无论是智能的代码编辑器,强大的版本控制工具,还是帮助自动化日常工作流程的脚本,正确的工具能让开发工作变得更加轻松,并大幅提升生产力。在这篇文章中,我们将分享几款广受好评的编程工具,帮助你在开......
  • Windows多线程编程 互斥量和临界区使用
    Windows多线程编程允许程序同时运行多个线程,提高程序的并发性和执行效率。多线程编程中的核心概念包括线程的创建、同步、调度、数据共享和竞争条件等。本文详细介绍了Windows多线程编程的关键技术点,并解释如何使用线程同步机制来保证线程安全。1.线程基础概念1.1线......
  • Python多进程中并行编程与进程池
    Python的并行编程可以采用multiprocessing或mpi4py模块来完成。multiprocessing是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器核心的进程能读取共享内存。在基于共享内存通信的多进程编程中,常常通过加锁或类似机制来实现互斥。mpi4py库实现了消息传......