计算机与网络 - 网络基础篇(1)

1.1 网络基础

1.1.1 TCP/IP 网络模型有哪几层?
1.1.1.1 应用层
  • 功能:应用层是最靠近用户的一层,它提供了用户与网络的接口,使得用户可以通过应用程序访问网络服务。
  • 协议:HTTP (网页浏览)、HTTPS (安全的HTTP)、FTP (文件传输)、SMTP (邮件发送)、POP3 (邮件接收)、DNS (域名解析) 等。
  • 作用:应用层负责处理特定应用程序的细节,如数据格式、传输方式等。
1.1.1.2 传输层
  • 功能:传输层负责在网络中的两个节点之间提供可靠的数据传输服务。
  • 协议:TCP(传输控制)和UDP(用户数据报)。TCP提供可靠的、面向连接的服务,而UDP提供不可靠的、无连接的服务。
  • 作用:传输层确保数据正确无误地从源传送到目的地,包括错误检测和修复、流量控制和拥塞控制。
1.1.1.3 网络层
  • 功能:网络层负责将数据包从源传送到目的地,它处理数据包在整个网络中的路由选择。
  • 协议:IP(网际协议),它定义了数据包的地址和路由方式。
  • 作用:网络层通过IP地址来识别网络上的设备,并决定数据包的最佳路径,实现跨网络的通信。
1.1.1.4 网络接口层
  • 功能:网络接口层是物理层、数据链路层的结合,负责在物理媒介上实际传输数据。
  • 协议:以太网(Ethernet)、Wi-Fi、PPP(点对点协议)等。
  • 作用:网络接口层处理与网络硬件相关的事宜,如帧的封装、传输介质的访问控制、物理信号的编码和解码等。
1.1.1.5 总结

应用层、传输层、网络层、网络接口层的传输单位,分别是报文(message)、段(segment)、包(packet)、帧(frame

1.1.2 键入网址到网页显示,期间发生了什么?
1.1.2.1 孤单小弟 - HTTP
  • 用户在浏览器地址栏输入网址,这个网址通常以 HTTP 或 HTTPS 开头,表示这是一个超文本传输协议请求。
  • HTTP是应用层协议,定义了客户端和服务器之间请求和响应的标准。

1.1.2.2 真实地址查询 - DNS
  • 用户输入的网址是一个域名,而网络通信需要 IP 地址。DNS 服务将域名解析为 IP 地址。
  • 这个过程包括递归查询和迭代查询,最终将域名映射到服务器的 IP 地址。用户请求域名,检查本地 DNS 缓存。本地 DNS 服务器,查询根 DNS 服务器。根 DNS 服务器,查询顶级 DNS 服务器。顶级 DNS 服务器,查询权威 DNS 服务器。权威 DNS 服务器,返回 IP 地址给用户。

1.1.2.3 指南好帮手 - 协议栈
  • 通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。
  • 协议栈的几个部分,分别承担不同的工作。上下关系有一定的规则的,上面会向下面委托工作,下面收到工作并执行。

1.1.2.4 可靠传输 - TCP
  • 在传输层,TCP负责建立一个可靠的连接,确保数据的完整性和顺序。
  • 它通过三次握手过程建立连接,然后开始数据传输,并在数据传输结束后通过四次挥手过程关闭连接。

1.1.2.5 远程定位 - IP
  • IP 协议在网络层工作,负责将数据包从源地址路由到目的地址。
  • 它使用 IP 地址来标识网络中的设备,并根据路由表决定数据包的传输路径。
1.1.2.6 两点传输 - MAC
  • 在数据链路层,MAC 地址用于标识同一局域网内的设备。
  • 以太网协议使用 MAC 地址来封装数据帧,确保数据在局域网内的正确传输。

1.1.2.7 出口 - 网卡
  • 网卡是计算机与外部网络连接的硬件接口。
  • 它将计算机内部的数字信号转换为适合在网络传输的电信号或光信号,反之亦然。
1.1.2.8 送别者 - 交换机
  • 交换机在局域网内工作,它根据 MAC 地址表来转发数据帧。
  • 交换机可以减少网络拥塞,提高网络效率,确保数据帧快速准确地到达目的地。

1.1.2.9 出境大门 - 路由器
  • 路由器连接不同的网络,它根据 IP 地址和路由表来决定数据包的下一跳。
  • 路由器在广域网中工作,负责将数据包从一个网络传输到另一个网络。

1.1.2.10 互相扒皮 - 服务器与客户端
  • 在整个通信过程中,客户端(用户的计算机)和服务器之间不断交换数据。
  • 客户端发送请求,服务器响应请求。这个过程涉及到数据包的封装和解封装,以及协议的协商。

1.1.2.11 总结
  1. DNS 解析:DNS浏览器首先将输入的域名解析为IP地址。这通常通过查询DNS服务器完成。如果域名已经在本地DNS缓存中,解析过程会更快。
  2. 建立连接:TCP、TLS / SSL浏览器与目标服务器的IP地址建立一个TCP连接。这涉及到一个称为“三次握手”的过程,确保双方都准备好发送和接收数据。
  3. 客户端发送请求:HTTP / HTTPS一旦TCP连接建立(如果是HTTPS,则还包括TLS握手),浏览器会发送一个HTTP请求到服务器,请求特定的网页资源。
  4. 服务器处理响应:HTTP / HTTPS服务器接收到HTTP请求后,会处理这个请求。然后将HTTP响应发送回浏览器,这包括网页内容、状态码和其他响应头。
  5. 浏览器渲染页面:HTTP / HTTPS浏览器开始解析HTML文档,并根据HTML、CSS和JavaScript文件渲染页面。
  6. 关闭连接:TCP一旦所有资源都加载完成,TCP连接可以被关闭,或者保持打开以用于后续请求。
1.1.3 Linux 系统是如何收发网络包的?
1.1.3.1 网络分层模型?
  • OSI 七层模型:是一个概念性框架,用于标准化不同计算机系统之间的通信过程。物理层:负责传输原始比特流,涉及电气、机械、过程和功能标准,如电压、线速、物理链路等。数据链路层:负责在相邻网络节点之间传输帧,处理帧同步、差错控制、流量控制等。网络层:负责数据包从源到目的地的传输和路由选择。传输层:负责提供端到端的通信,确保数据的完整性和可靠性,如 TCP(传输控制协议)和 UDP(用户数据报协议)。会话层:负责建立、管理和终止应用程序之间的会话。表示层:负责数据的表示、安全和压缩,确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。应用层:为应用软件提供网络服务,如 HTTP(超文本传输协议)、FTP(文件传输协议)等。
  • TCP/IP 四层模型:是一个实际的协议族,用于实现网络通信。网络接口:与 OSI 模型的物理层和数据链路层相对应,负责在网络的物理设备之间传输 原始比特流。网络层:与 OSI 模型的网络层相对应,负责 数据包 的传输和路由选择。传输层:与 OSI 模型的传输层相对应,负责在网络中两个节点之间提供可靠的 通信。应用层:与 OSI 模型的会话层、表示层和应用层相对应,负责处理特定的 应用程序 细节。

1.1.3.2 Linux 网络协议栈
  1. 网络封装:Linux系统中,网络通信遵循OSI模型,但通常使用TCP/IP模型,该模型包含四个层次:链路层、网络层、传输层和应用层。每个层次都有特定的协议负责数据的封装和解封装。例如,链路层使用以太网协议,网络层使用IP协议,传输层使用TCP或UDP协议,而应用层则包括HTTP、FTP等协议。
  2. 网络包大小:网络包的大小受到多种因素的影响,包括MTU(最大传输单元)和协议头部的大小。以太网的MTU通常是1500字节,这意味着在不进行分片的情况下,一个以太网帧可以携带的最大数据量是1500字节。如果数据包超过这个大小,就需要在 IP 层进行分片。
  3. Linux 网络协议栈:Linux 网络协议栈是操作系统中处理网络通信的核心组件。它遵循 Berkeley 套接字 API,提供了一个抽象层,使得应用程序可以通过统一的接口进行网络通信。协议栈处理从物理层到应用层的所有网络通信任务。
1.1.3.3 Linux 接收网络包的流程
  1. DMA 技术:直接内存访问(DMA)是一种硬件特性,允许网络接口卡(NIC)直接将数据传输到内存中,而不需要 CPU 的介入。这样可以减少 CPU 的负载,提高数据传输效率。
  2. 中断处理方式:当网络数据到达时,NIC 会触发一个硬件中断,通知 CPU 处理接收到的数据。Linux 内核会响应这个中断,执行中断服务例程(ISR)来处理网络包。
  3. NAPI 机制的引入:New API(NAPI)是 Linux 内核中用于提高网络性能的一种机制。它允许内核在处理网络包时,批量处理多个包,而不是逐个处理,这样可以减少 CPU 的上下文切换和中断处理开销。
  4. 软中断的处理:软中断是 Linux 内核中用于处理中断的机制,它可以避免在硬中断上下文中执行过多的工作,从而减少对 CPU 的占用。网络包的处理通常由软中断来完成。
  5. 网络协议栈的处理:网络包在被 DMA 传输到内存后,会经过网络协议栈的各个层次进行处理。每个层次都会检查和解封装相应的协议头部,直到数据到达应用层。
  6. 应用层处理:最终,网络包中的数据会被传递给应用层,例如一个 HTTP 请求会被传递给 Web 服务器软件进行处理。
1.1.3.4 Linux 发送网络包的流程
  1. 第一次内存拷贝:当应用程序准备发送数据时,第一次内存拷贝发生在应用程序将数据从用户空间拷贝到内核空间的缓冲区。这是必要的,因为网络设备驱动程序需要访问这些数据以将其发送出去。
  2. 第二次内存拷贝:第二次内存拷贝发生在内核将数据从内核缓冲区拷贝到 NIC 的 DMA 缓冲区。这一步是为了准备数据,以便 NIC 可以直接将数据发送到网络上。
  3. 第三次内存拷贝(可选):第三次内存拷贝可能发生在某些特定的网络操作中,例如当数据需要被复制到另一个网络接口或者进行特殊的网络处理时。这通常涉及到更复杂的网络功能,如网络地址转换(NAT)或防火墙规则的应用。
1.1.4 如何设计一个应用层协议?

应用层协议是网络协议栈中最顶层的协议,它直接为应用程序提供网络通信服务。需要解决的核心问题包括:

  • 解析传输层数据:从字节流中解析出有意义的数据包。涉及识别协议头和数据部分,以及处理可能的分包和粘包问题。
  • 将数据交给应用程序:解析完数据后,需要传递给相应的应用程序,以便应用程序可以进一步处理或使用这些数据。

实现应用层协议的基本思路通常包括以下几个步骤:

  1. 定义协议头格式:协议头通常包含了用于识别协议、处理请求和响应、序列化方法、状态码等信息。
  2. 解析协议头:根据定义的协议头格式,解析出协议头中的信息,如请求类型、序列化方法、数据长度等。
  3. 解析数据部分:根据协议头中的信息,解析数据部分,这可能涉及到序列化和反序列化的处理。
#八股文##学习笔记#
全部评论

相关推荐

11-30 13:19
同济大学 Java
阿里云 java开发 (n-2)*16
点赞 评论 收藏
分享
11-27 22:42
已编辑
门头沟学院 Web前端
总结:面试官人很好,整个面试过程中就像是聊天一样,全程演示项目,中间穿插了一点八股- 蓝桥杯是什么- 问简历上的项目是实验室还是个人项目  面试官说都会把比赛项目给放到前面,所以以为这也是实验室作品。然后我就拿了挑战杯写的前端页面简单说了一下以下基本都是项目细节:- Mod 开发组与你是什么关系(甲乙方?)- 为什么分了开源核心 + 后台仓库(后台仓库代码不安全,需要审查)- 编辑人员提交流程(后台编辑 + 管理员提交 -> gitee pr + 审查后合并 + webhook 触发 cicd 同步到 oss)- Astro 是什么,SSG SSR 是什么(说了一下基于 vite 进行驱动与支持 ssg + ssr,然后说了一下 ssr 的动态拼接字符串;然后面试官说了什么 jeklly?)- 选了他的原因是什么(博客落地实践过,知道一些底层原理,内容驱动生成网站,符合 wiki 定位要求)- 框架可以插入 react 或者 vue 组件吗(可以,且可以一起使用)- 有试过放在一起吗(没有,提了一下 vite 放在过一起导致开发声明报错,其次是两个应用相互独立,通过各自的 app 创建函数来渲染页面,只要他们副作用不会相互影响我觉得问题都不算大,不过现在看来感觉还得想一想 vue react 底层,他们的更新机制不一样,会不会一个框架的占用线程太久导致了另一个框架更新不及时)- 整个项目内核升级是什么意思(说了用插件将所有的逻辑进行封装,最后进行复用,要求展示了一下除了简历还有哪个网站复用了)- 编译器和 polyfill 的关系,知不知道每一个 es 版本的区别(不会)- VSCode 插件展示一下,具体在 VSCode 做了什么,用途(mdx 转 ast 语法树,对节点进行分析,并读取工作目录下的资源进行查错;给一些编外的词条编辑人员使用)?- 网页插件展示一下?(没实现,说了一下对每一个用户都要开一个专用检查进程的原因)- 看一下你的分析器和 mdx 官方分析器的关系(完全独立,没来得及说存在的优化部分)本来要进笔试了,然后说了一下 yjs 是核心之一- 在线平台演示效果- yjs 是什么(协同编辑中编辑冲突的一个库)- 协同主要问题(说了并发冲突和 YATA 算法的作用,面试官似乎没做过这个领域)笔试:```ts// 写一个类似迅雷的下载管理器,用户可以不停往里面push url,管理器需要保证同一时间最多只有3个请求在并发下载。class Downloader {  urls = []  push(url) {  }}// 每个url均需要被传入以下fakeAxiosWrapper函数。你可以把这个函数当做一个封装好的axios函数,作用是请求远程api,不要改动这个函数。async function fakeAxiosWrapper(url) { return new Promise((resolve, reject) => { setTimeout(() => {      console.log(`download ${url} done`)      resolve()    }, 3000);  })}// 验证代码const downloader = new Downloader()downloader.push(`url1`)downloader.push(`url2`)downloader.push(`url3`)downloader.push(`url4`)downloader.push(`url5`)// 等待3s后,同时输出// download url1 done// download url2 done// download url3 done// 再等待3s后,同时输出// download url4 done// download url5 done```没写出来很可惜,因为以前写过一个类似的并发下载控制,结果这里没写好。面试官换了个节流,问了一下为什么 setInterval 可以用来证明你这个函数是节流的(宏任务队列首部)反问:工作时间(上午十点到晚上八点半)地点(深圳总部)实习时长(越久越好)技术栈(挺多跨端技术的,感觉进去又要开始上手新东西了)有没有什么可以改进的地方(没有,做的很好(不知道是不是客套话整体下来感觉最大的问题还是信息差与沟通点没到位,项目yjs部分展示的内容不是很多,然后还浪费了一些时间,只能说很可惜,下一次对于不会的内容就应该直接说不会(恼)。然后就是没问多少八股,这真的正常吗()
查看22道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务