just for recording the note of computer-network, to be added
基础知识
引语
:::note[前言]
计网的内容还是很有意思的,相较于计组、编译原理这类较为底层晦涩的原理课程,计网还是显得和蔼可亲多了,可以和实际生活多多结合举例便于理解
pl:后续想学习一下csdiy的相关课程
:::
生活中,我们经常需要浏览网址,那么就从输入一条url到页面展示的过程说起吧
解释起来可简单可复杂,小林coding中有详细介绍了过程,但大堆的术语概念还是太过繁杂,还是先从简单的概念引入一下吧
-
url通常包括
协议+主机+端口号+路径等(可能携带锚点,但在手动输入中并不常见),eg.https://noospic.me -
通过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 地址完成在互联网上的路由传输。
-
浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求(如果是https协议,还需要进行SSL/TLS握手才能进行连接)
-
浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
-
服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
-
浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
-
浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭
DNS
DNS(Domain Name System)- 域名系统,将域名转换为ip地址
DNS解析过程
-
先查询浏览器缓存是否有该域名对应的IP地址
-
若没有,则会去计算机本地的Host文件中查询是否有对应的缓存
-
若Host文件中也没有则会向本地的DNS服务器(通常由互联网服务提供商ISP提供,eg.中国移动)发送一个DNS查询请求
-
若本地DNS解析器有该域名的ip地址,就直接返回;若没有,则它会向根DNS服务器发出查询请求。根DNS服务器并不负责解析域名,但是它可以告诉本地DNS解析器应该向哪个顶级域名(.com/.net/..)的DNS服务器继续查询
-
本地DNS解析器随后向指定的顶级域名DNS服务器发出查询请求,顶级域名也不负责具体的域名解析,但它可以告诉本地DNS解析器应该向哪个权威DNS服务器(Authoritative Name Server)查询下一步的信息
-
本地DNS解析器最后向指定的权威DNS服务器发起查询请求。而权威DNS服务器中则包含了我们想要的ip-域名映射关系,当权威DNS服务器收到查询请求时会查找对应的域名对应的ip地址,并将结果返回给本地DNS解析器
-
本地DNS解析器将收到的ip地址返回给浏览器,并将域名解析结果缓存在本地,以便之后更快响应
-
浏览器发起连接:本地DNS解析器已经将IP地址返回给计算机,浏览器便可以通过IP地址与目标服务建立连接,开始获取网页内容
简而言之,除了浏览器缓存和本地host文件、本地DNS服务器、权威DNS服务器中可以得知域名-IP映射关系外,根域名服务器和顶级DNS服务器只能告诉来请求的本地DNS解析器下一条路该往哪走
:::note[ps]
-
Windows 系统hosts 文件的位置是
C:\Windows\System32\drivers\etc\hosts;Linux 系统hosts 文件的位置是/etc/hosts -
域名的层级关系
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记录
:::
递归查询和迭代查询
两种在DNS解析过程中用于获取域名解析信息的两种不同方式
- 递归查询
客户端(本机或一个配置为递归查询的本地DNS服务器)向上层DNS服务器发起查询请求,要求其返回完整的结果。DNS客户端仅需发送一次请求,等待解析结果即可。| 相当于找一个委托人来跑腿,自己坐享其成
- 迭代查询
客户端向上层DNS服务器发起查询请求,但不要求直接提供解析结果,而只是询问上层服务器一个更高级的域名服务器的地址,再自行向更高级的服务器发起查询请求,直至获取完整解析结果为止 | 相当于自己跑腿,一级一级问路
HTTPS
连接原理
https采用的是 对称加密+非对称加密混合方式,对传输的数据进行加密,从而实现更高的安全性
客户端(浏览器) 服务端
│ │
│ ─────── 1. 请求 ──────▶ │
│ │
│ ◀── 2. 返回证书(含公钥) │
│ │
│ ── 3. 验证证书合法性 ── │
│ │
│ ── 4. 生成对称密钥,用公钥加密后发送 ──▶
│ │
│ ◀── 5. 用私钥解密得到对称密钥 │
│ │
│ ───── 6. 使用对称密钥通信 ─────▶