Skip to content
Go back

计网-note

Edit page

just for recording the note of computer-network, to be added

基础知识

引语

:::note[前言]

计网的内容还是很有意思的,相较于计组、编译原理这类较为底层晦涩的原理课程,计网还是显得和蔼可亲多了,可以和实际生活多多结合举例便于理解

pl:后续想学习一下csdiy的相关课程

:::

生活中,我们经常需要浏览网址,那么就从输入一条url到页面展示的过程说起吧

解释起来可简单可复杂,小林coding中有详细介绍了过程,但大堆的术语概念还是太过繁杂,还是先从简单的概念引入一下吧

  1. url通常包括 协议+主机+端口号+路径 等(可能携带 锚点,但在手动输入中并不常见),eg.https://noospic.me

  2. 通过url如何访问想要的服务呢?答案是DNS服务器将域名解析为IP地址

    为什么最终是通过IP地址访问服务 polished by gemini

    IP地址是网络层的概念

    • 互联网协议套件 (TCP/IP) 是互联网通信的基础。在这个套件中,IP (Internet Protocol) 协议工作在网络层。网络层的核心功能就是负责在不同的网络之间寻址和路由数据包

    :::note

    • 网络OSI七层模型结构包括:应用层 -表示层 - 会话层 - 运输层 - 网络层 - 数据链路层 - 物理层

    • TCP/IP四层模型(广泛采用)结构包括: 应用层 - 传输层 - 网络层 - 网络接口

    • 教科书中的五层结构模型

      应用层:HTTP 报文  
      
      传输层:加上 TCP 首部  (区分应用进程及实现可靠传输)
      
      网络层:加上 IP 首部(目标 IP 出现!使IP数据包可以在互联网传输,即被路由器转发)  
      
      数据链路层:加上 MAC 地址首部与尾部 (帧首部是为了让帧能在一段链路或一个网络上传输,能被相应的目的主机接受;尾部是让目的主机检查所接收到的帧是否有误码)
      
      物理层:比特流传输

    :::

    • IP协议规定,网络上的每个设备(主机、服务器、路由器)都必须有一个唯一的IP地址(在特定网络范围内)才能被识别和定位。
    • 数据包的头部包含了源IP地址和目标IP地址。这是网络设备(尤其是路由器)用来决定如何转发数据包的唯一依据

    路由器的效率和设计:

    • 互联网由无数的路由器连接而成。路由器的主要工作是高效地将数据包从源头转发到目的地。
    • 路由器是专门为处理数字化的IP地址而设计的。它们查看数据包头部的目标IP地址,然后根据自己的路由表(包含如何到达不同IP地址网络的信息)将数据包发送到下一个合适的路由器或最终目的地。
    • 如果路由器需要解析和理解人类可读的、可变长度的URL字符串(其中还可能包含路径、查询参数等复杂信息),路由过程将变得极其缓慢和复杂,网络效率会大大降低。处理固定长度、结构化的数字IP地址要快得多。

    唯一性和精确性:

    • IP地址为网络上的每个接口提供了一个在全球(公网IP)或局部(私网IP)唯一的标识符。这使得数据包可以被精确地投递到目标机器。
    • URL虽然对人类友好,但对于机器来说,它是一个更高层次的抽象。一个域名背后可能对应多个IP地址(用于负载均衡),一个IP地址也可能托管多个域名(通过虚拟主机)。DNS解析的任务就是处理这种多对多关系,最终找到一个或多个具体的IP地址。

    分层架构:

    • 网络通信是分层设计的(例如OSI七层模型或TCP/IP四层模型)。URL是应用层(例如HTTP协议)的概念。而IP地址是网络层的概念。
    • 数据在发送时,从应用层逐层向下封装。当到达网络层时,会加上IP头部,其中包含目标IP地址。只有这样,数据包才能在网络中被正确路由。
    • 在接收端,数据包逐层向上解封装。网络层处理IP头部,确认是发给自己的,然后将数据交给上层协议(如TCP或UDP),最终应用层程序(如浏览器)才能处理HTTP请求和URL中的具体路径。

    折叠内容中包含较多术语,可能有点绕,总结来说,最终通过 IP 地址访问服务 是因为网络通信协议(比如 TCP/IP)只能处理 IP,而不识别域名。IP 地址是网络层的核心概念,网络层负责将数据包从源头路由到目标设备。而路由器在网络层工作,它们只识别 IP 地址,不会也不需要解析域名或 URL。域名只是应用层的抽象,由 DNS 系统解析为 IP 地址,然后在网络层中进行路由与转发。数据从浏览器发出,会经过应用层、传输层、网络层、链路层等层层封装,最终依靠 IP 地址完成在互联网上的路由传输。

  3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求(如果是https协议,还需要进行SSL/TLS握手才能进行连接)

  4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。

  5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。

  6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。

  7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭

DNS

DNS(Domain Name System)- 域名系统,将域名转换为ip地址

DNS解析过程

  1. 先查询浏览器缓存是否有该域名对应的IP地址

  2. 若没有,则会去计算机本地的Host文件中查询是否有对应的缓存

  3. 若Host文件中也没有则会向本地的DNS服务器(通常由互联网服务提供商ISP提供,eg.中国移动)发送一个DNS查询请求

  4. 若本地DNS解析器有该域名的ip地址,就直接返回;若没有,则它会向根DNS服务器发出查询请求。根DNS服务器并不负责解析域名,但是它可以告诉本地DNS解析器应该向哪个顶级域名(.com/.net/..)的DNS服务器继续查询

  5. 本地DNS解析器随后向指定的顶级域名DNS服务器发出查询请求,顶级域名也不负责具体的域名解析,但它可以告诉本地DNS解析器应该向哪个权威DNS服务器(Authoritative Name Server)查询下一步的信息

  6. 本地DNS解析器最后向指定的权威DNS服务器发起查询请求。而权威DNS服务器中则包含了我们想要的ip-域名映射关系,当权威DNS服务器收到查询请求时会查找对应的域名对应的ip地址,并将结果返回给本地DNS解析器

  7. 本地DNS解析器将收到的ip地址返回给浏览器,并将域名解析结果缓存在本地,以便之后更快响应

  8. 浏览器发起连接:本地DNS解析器已经将IP地址返回给计算机,浏览器便可以通过IP地址与目标服务建立连接,开始获取网页内容

    简而言之,除了浏览器缓存和本地host文件、本地DNS服务器、权威DNS服务器中可以得知域名-IP映射关系外,根域名服务器和顶级DNS服务器只能告诉来请求的本地DNS解析器下一条路该往哪走

:::note[ps]

  1. Windows 系统hosts 文件的位置是 C:\Windows\System32\drivers\etc\hosts;Linux 系统hosts 文件的位置是 /etc/hosts

  2. 域名的层级关系

    eg.xxx.example.com. 最后的点(.)是根域com是顶级域名(也称一级域名 TLD<->Top Level Domain),example二级域名->SLD,以此类推

    dig命令用于从DNS域名服务器查询主机地址信息

    常见的DNS记录类型

    类型目的
    A地址记录,用于指定域名的IPV4地址,如需将域名指向一个IP地址,就需要添加A记录|eg.部署的服务绑定域名,则添加一条dns记录: 域名(name)-> ip地址(value)
    AAAA指定主机名(域名)对应的IPV6地址记录
    CNAME将一个域名指向另一个域名
    NS域名服务器记录,将子域名托管给其他DNS服务器解析,就需要添加NS记录
image-20250616225050739

:::

递归查询和迭代查询

两种在DNS解析过程中用于获取域名解析信息的两种不同方式

  1. 递归查询

客户端(本机或一个配置为递归查询的本地DNS服务器)向上层DNS服务器发起查询请求,要求其返回完整的结果。DNS客户端仅需发送一次请求,等待解析结果即可。| 相当于找一个委托人来跑腿,自己坐享其成

  1. 迭代查询

客户端向上层DNS服务器发起查询请求,但不要求直接提供解析结果,而只是询问上层服务器一个更高级的域名服务器的地址,再自行向更高级的服务器发起查询请求,直至获取完整解析结果为止 | 相当于自己跑腿,一级一级问路

HTTPS

连接原理

https采用的是 对称加密+非对称加密混合方式,对传输的数据进行加密,从而实现更高的安全性

客户端(浏览器)            服务端
    │                          │
    │ ─────── 1. 请求 ──────▶ │
    │                          │
    │ ◀── 2. 返回证书(含公钥) │
    │                          │
    │ ── 3. 验证证书合法性 ──  │
    │                          │
    │ ── 4. 生成对称密钥,用公钥加密后发送 ──▶
    │                          │
    │ ◀── 5. 用私钥解密得到对称密钥 │
    │                          │
    │ ───── 6. 使用对称密钥通信 ─────▶

Edit page
Share this post on:

Previous Post
self-learn
Next Post
Docker-note