主要结合小林coding和本篇内容理解

前置内容

MAC地址

MAC地址,英文全称:Media Access Control Address,也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡中。
MAC地址的长度为48位(6个字节),通常用12个16进制数表示,如:00-50-56-C0-00-08。其中前3个字节(00-50-56)代表网络硬件制造商的编号,后3个字节(C0-00-08)代表该制造商所制造的某个网络产品(如网卡)的序列号。

MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。在OSI模型中,第二层数据链路层负责MAC位址;

广播地址:ff:ff:ff:ff:ff:ff

假设现有一台路由器,含有一个WAN端口及四个LAN端口。它的WAN端口会有一个如61.61.61.61的IP地址,也会有一个如00:0A:02:0B:03:0C的MAC地址。而它的四个LAN端口会各分配到一个例如192.168.1.0/24的IP地址,四个端口各会有一个不同的MAC地址。

MAC地址最高字节(MSB)的低第一位(LSb),表示这个MAC地址是单播还是多播。0表示单播。

IP

IP:用来标识一台主机,是逻辑地址

IPV4:4字节,IPV6:6字节,128位;IP地址组成:IP地址=网络地址+主机地址
子网掩码(netmask):作用是屏蔽(遮住)IP地址的一部分以划分成网络地址和主机地址两部分,并说明该IP地址是在局域网上,还是在远程网上。子网掩码不能单独存在,必须结合IP地址一起使用;

长度 为 4 * 8bit(1字节),由 连续的1 以及 连续的0 两部分组成,
网络地址: IP 地址中被子网掩码的连续的1 遮住的部分
主机地址: IP 地址中被子网掩码的连续的0 遮住的部分
两个特殊地址:
	广播地址:网络地址+后面补255:用于发广播;
	网络地址
	子网最大的主机数:2的主机地址的位数的次方 - 2(广播地址和网络地址)
A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。
网段地址就是子网地址,后面补齐0;

192.168.1.2/24:含义:IP是192.168.1.2,子网掩码是255.255.255.0,也就是24个1;

端口

两个字节:0-66536,自定义端口:1024-66535;
每一个应用程序都有端口,端口用来标识应用程序(进程),进程都有进程号,但进程号是变化的,所以不用进程号来表示应用程序
端口冲突的话,网络应用程序是启动不起来的
一个应用程序可以有多个端口,每个端口标识每个缓冲区;一个端口不可以标识多个应用程序
netstat命令:

网络设计模式

C/S模式:客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。

B/S模式:浏览器()/服务器(server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。

优缺点:

​ C/S模式:客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率****,所采用的协议相对灵活,工作量将成倍提升,开发周期较长。需要将客户端安插至用户主机上,对用户主机的安全性构成威胁**。

​ B/S模式:工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。,缓存数据不尽如人意,从而传输数据量受到限制,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活

OSI七层模型

OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架每一层都负责不同的功能,从物理连接到应用程序的处理。**这种模型有助于不同的系统之间进行通信时,更好地理解和管理网络通信的过程。
OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。
应用层:为应用程序提供服务(将抽象语言转换为编码)
表示层:解码;
会话层:建立连接;
传输层:Port,区分数据地送到哪一个应用程序;
网络层:Ip,给两台主机提供路径选择;
数据链路层:Mac,负责收发数据;
物理层:双绞线接口,光线的传输速率;
请添加图片描述
请添加图片描述
请添加图片描述
应用层(Application Layer):这是网络体系结构中的最顶层,提供用户接口和应用程序之间的通信服务。在这一层,用户可以访问各种网络应用程序,如电子邮件、文件传输和远程登录。
表示层(Presentation Layer):该层
负责数据的格式化、加密和压缩**,以确保数据在不同系统之间的交换是有效的和安全的。它还提供了数据格式转换和语法转换的功能。
会话层(Session Layer):会话层管理应用程序之间的通信会话,负责建立、维护和终止会话。它还提供了数据的同步和检查点恢复功能,以确保通信的完整性和持续性。
传输层(Transport Layer):传输层为应用程序提供端到端的数据传输服务,负责数据的分段、传输控制、错误恢复和流量控制。它主要使用 TCP(传输控制协议)和 UDP(用户数据报协议)来实现这些功能。
网络层(Network Layer):网络层负责数据包的路由和转发,以及网络中的寻址和拥塞控制。它选择最佳的路径来传输数据包,以确保它们能够从源主机到目标主机进行传输。
数据链路层(Data Link Layer):**数据链路层提供点对点的数据传输服务,负责将原始比特流转换为数据帧,并检测和纠正传输中出现的错误。**它还控制访问物理媒介的方式,以及数据帧的传输和接收。
物理层(Physical Layer):物理层在物理媒介上传输原始比特流,定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输,例如通过以太网、光纤和无线电波等媒介。
牛客面经补充:
在计算机网络中要做到正确的数据交换,就必须提前约定好相应的规则。OSI七层模型是一个协议栈,就是为了统一计算机网络标准,方便数据的交换。它自上而下依次为:

  1. 应用层:应用层是体系结构中的最高层,是应用进程间通信和交互的规则,进程指计算机中运行的程序。也是用户与应用程序之间的一个接口,操作程序(软件,Web应用),进而触发更下层的服务。 协议:HTTP、HTTPS、FTP、TFTP、SMTP等
  2. 表示层:对从应用层获取到的数据报文数据进行格式处理、安全处理和压缩处理。 格式:JPEG、ASCll、加密格式等
  3. 会话层:对当前主机进程和目标主机进程会话的建立、管理和终止行为。
  4. 传输层:对两台主机进程也就是应用层提供数据传输服务。定义了传输数据的进程端口号,负责数据包的排序、差错检验和流量控制等。 协议:UDP、TCP
  5. 网络层:主要进行逻辑地址的查询。 协议: ICMP、IGMP、IP(IPv4、IPv6)
  6. 数据链路层:建立相邻节点的逻辑连接,进行逻辑地址寻址、差错校验等。 协议:ARP、RARP、PPP 等
  7. 物理层:物理层上数据的单位是Bit比特,数据的传输都是通过0(或1)比特流来实现的,而0(或1)比特流与电压的高低有关。负责了最底层数据传输的建立、传输和断开。

TCP/IP四层模型

TCP/IP 四层模型是目前被广泛采用的一种模型,由以下 4 层组成:应用层、传输层、网络层、网络接口层请添加图片描述
应用层(Application Layer)类似于 OSI 模型中的应用层,负责处理用户与网络应用程序之间的通信。它包括诸如 HTTP、FTP、SMTP 等协议,用于实现不同类型的网络服务和应用。
传输层(Transport Layer):与 OSI 模型中的传输层相对应,提供端到端的数据传输服务。在 TCP/IP 模型中,主要有两个协议:TCP(传输控制协议)和 UDP(用户数据报协议),用于确保可靠的数据传输和简单的数据传输。
网络层(Internet Layer):相当于 OSI 模型中的网络层,负责数据包的路由和转发。它使用 IP(Internet Protocol)协议来定义数据包的传输路径,并处理不同网络之间的通信。
网络接口层(Link Layer):与 OSI 模型中的数据链路层和物理层相对应,负责管理网络硬件设备和物理媒介之间的通信。它包括以太网、Wi-Fi、蓝牙等各种物理层和数据链路层协议。
牛客面经补充
五层协议体系结构结合了OSI模型和TCP/IP模型的优点,既简洁又能将每一层描述清楚。在计算机网络中要做到正确的数据交换,就必须提前约定好相应的规则。它是一个协议栈,就是为了统一计算机网络标准,方便数据的交换。它自上而下依次为:

应用层:应用层是体系结构中的最高层,定义了应用进程间通信和交互的规则。本层任务就是通过应用进程间的信息数据流通完成特定的网络应用(软件、Web应用等)。因为不同的应用程序都需要不同的应用层协议,所以应用层协议较多,如万维网应用的HTTP协议、电子邮件的SMTP协议、文件传送的DTP协议等。请将应用层交互的数据称为报文,以免产生概念的混淆。 协议:HTTP、HTTPS、FTP、TFTP、SMTP等

运输层:运输层的任务是负责向两个计算机中进程之间的通信提供一种通用的数据传输服务,应用层通过运输层可以传输报文。通用是指不会针对特定的应用层协议进行详细的划分,多种应用层协议公用同一个运输层服务,所以运输层有复用的功能。当然也有分发的功能,指将接受到的信息分别交付到应用层不同的进程中。 协议:UDP、TCP

网络层:网络层的任务是负责为网络上不同的主机提供通信服务。在发送数据时,网络层将运输层产生的报文段或者用户数据报封装成分组或者包(packet)进行传送。由于网络层使用IP协议,所以分组或包(packet)也叫IP数据报,简称数据报。网络层还需要寻找合适的路由路线,让源主机运输层发送下来的数据报能通过路由器找到目的主机。 协议:ICMP、IGMP、IP(IPv4、IPv6)、ARP、RARP

数据链路层:数据链路层简称链路层。两个节点传输数据时,链路层将网络层交下来的数据报组装成帧,在链路上传送帧。每一帧都包括数据和控制信息(同步信息、地址信息、差错控制等)。 5. 物理层:物理层上数据的单位是Bit比特,数据的传输都是通过0(或1)比特流来实现的,而0(或1)比特流与电压的高低有关。物理层中比特流的传输不再加控制信息,需要注意的是比特流应从首部开始传送。

应用层常见协议

HTTP(HyperText Transfer Protocol):用于在客户端和服务器之间传输超文本数据,通常用于 Web 浏览器和 Web 服务器之间的通信。
FTP(File Transfer Protocol):用于在客户端和服务器之间传输文件,支持上传和下载文件的功能。
SMTP(Simple Mail Transfer Protocol):用于在邮件服务器之间传输电子邮件,负责发送邮件。
POP3(Post Office Protocol version 3):用于从邮件服务器上下载邮件到本地计算机,负责接收邮件。
IMAP(Internet Message Access Protocol):也是用于接收邮件的协议,与 POP3 类似,但提供了更丰富的功能,如在服务器上管理邮件等。
DNS(Domain Name System):用于将域名解析为对应的 IP 地址,从而实现域名和 IP 地址之间的映射。
HTTPS(HyperText Transfer Protocol Secure):是 HTTP 的安全版本,通过 SSL/TLS 加密传输数据,保证通信过程中的安全性。
SSH(Secure Shell):用于远程登录和执行命令,提供了加密的网络连接,保证了通信的安全性。
SNMP(Simple Network Management Protocol):用于网络设备之间的管理和监控,可以实现对网络设备的远程配置和监控。
Telnet:用于远程登录和执行命令,类似于 SSH,但不提供加密功能,通信数据不安全。

传输层常见协议

TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输服务,确保数据的可靠性、顺序性和完整性。TCP适用于对数据传输质量要求较高的场景,如文件传输、网页浏览等。
UDP(User Datagram Protocol):提供无连接的数据传输服务,不保证数据的可靠性,也不保证数据的顺序性和完整性。UDP适用于实时性要求较高、对数据传输质量要求不那么严格的场景,如音视频传输、在线游戏等。

网络层常见协议

IP(Internet Protocol):是互联网中最基本的协议,用于在网络中传输数据包。IP协议定义了数据包的格式、寻址方式和路由选择等信息,是整个互联网的基础。
ICMP(Internet Control Message Protocol):用于在IP网络中传递控制消息和错误信息。ICMP通常用于网络设备之间的通信,如路由器和主机之间的通信,以及用于检测网络连通性和故障诊断。
ARP(Address Resolution Protocol):用于将IP地址映射为MAC地址(物理地址)。ARP协议在局域网内部使用,通过发送ARP请求获取目标设备的MAC地址,从而实现数据包的传输。
RARP(Reverse Address Resolution Protocol):与ARP相反,用于将MAC地址映射为IP地址。RARP协议通常用于无盘工作站等设备,可以根据MAC地址获取对应的IP地址。
IPv6(Internet Protocol version 6):是IP协议的下一代版本,用于解决IPv4地址空间不足的问题。IPv6采用128位地址长度,提供了更大的地址空间,支持更多的设备连接到互联网。

网络接口层常见协议

以太网协议(Ethernet):是一种常见的局域网技术,使用MAC地址进行帧的传输和接收。
无线局域网协议(Wi-Fi):用于无线局域网的数据传输,通常基于IEEE 802.11标准。
点对点协议(PPP):用于建立点对点连接的协议,通常用于拨号连接和虚拟专用网(VPN)等场景。
数据链路层交换协议(DLC):用于在数据链路层进行数据交换和管理的协议,如HDLC、SLIP和PPP等。
请添加图片描述

arp协议

请添加图片描述

arp请求包:
请添加图片描述

网络通信过程

网络通信过程
在左侧:组包的过程是从上往下:
1、应用层填入数据,传输层加上端口,网络层加上IP地址,链路层加上MAC地址;
在右侧,解包的过程是从下往上:
2、链路层根据MAC地址找到主机,网路层根据IP地址找到设备,传输层根据端口找到应用程序(进程),应用层解析数据;
请添加图片描述

从输入URL到显示页面的全过程

解法一

参考连接:https://blog.csdn.net/Newbie___/article/details/107212575
在浏览器地址栏输⼊URL

2、浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤

如果资源未缓存,发起新请求
如果已缓存,检验是否⾜够新鲜,⾜够新鲜直接提供给客户端,否则与服务器进⾏验证。
检验新鲜通常有两个HTTP头进⾏控制 Expires 和 Cache-Control:
	HTTP1.0提供 Expires,值为⼀个绝对时间表示缓存新鲜⽇期
	HTTP1.1增加了Cache-Control: max-age=time,值为以秒为单位的最⼤新鲜时间

3、浏览器解析URL获取协议,主机,端⼝,path
4、浏览器组装⼀个HTTP(GET)请求报⽂
5、浏览器获取主机 ip 地址,过程如下:
浏览器缓存
本机缓存
hosts⽂件
路由器缓存
ISP DNS缓存
DNS递归查询(可能存在负载均衡导致每次IP不⼀样)
6、打开⼀个socket与⽬标IP地址,端⼝建⽴TCP链接,三次握⼿如下:
客户端发送⼀个TCP的SYN=1,Seq=X的包到服务器端口
服务器发回SYN=1, ACK=X+1, Seq=Y的响应包
客户端发送ACK=Y+1, Seq=Z、
7、TCP链接建⽴后发送HTTP请求
8、服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使⽤HTTP Host头部判断请求的服务程序
9、服务器检查HTTP请求头是否包含缓存验证信息,如果验证缓存新鲜,返回304等对应状态码
10、处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作
11、服务器将响应报⽂通过TCP连接发送回浏览器
12、浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保留重⽤,关闭TCP连接的四次握⼿如下:
主动⽅发送Fin=1, Ack=Z, Seq= X报⽂
被动⽅发送ACK=X+1, Seq=Z报⽂
被动⽅发送Fin=1, ACK=X, Seq=Y报⽂
主动⽅发送ACK=Y, Seq=X报⽂
13、浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些情况处理与2XX不同

14、如果资源可缓存,进行缓存

15、对响应进行解码(例如gzip压缩)

16、根据资源类型决定如何处理(假设资源为HTML⽂档)

17、解析HTML⽂档,构件DOM树,下载资源,构造CSSOM树,执⾏js脚本,这些操作没有严 格的先后顺序,以下分别解释:

16、构建DOM树:

Tokenizing:根据HTML规范将字符流解析为标记

Lexing:词法分析将标记转换为对象并定义属性和规则

DOM construction:根据HTML标记关系将对象组成DOM树

17、解析过程中遇到图⽚、样式表、js⽂件,启动下载

18、构建CSSOM树:

Tokenizing:字符流转换为标记流

Node:根据标记创建节点

CSSOM:节点创建CSSOM树

19、根据DOM树和CSSOM树构建渲染树 :

从DOM树的根节点遍历所有可⻅节点,不可⻅节点包括:
script , meta 这样本身 不可⻅的标签。
被css隐藏的节点,如 display: none
对每⼀个可⻅节点,找到恰当的CSSOM规则并应⽤
发布可视节点的内容和计算样式

20、js解析如下:
浏览器创建Document对象并解析HTML,将解析到的元素和⽂本节点添加到⽂档中,此时document.readystate为loading
HTML解析器遇到没有async和defer的script时,将他们添加到⽂档中,然后执⾏⾏内 或外部脚本。这些脚本会同步执⾏,并且在脚本下载和执⾏时解析器会暂停。这样就可以⽤document.write()把⽂本插⼊到输⼊流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的⽂档内容
当解析器遇到设置了async属性的script时,开始下载脚本并继续解析⽂档。脚本会在它 下载完成后尽快执⾏,但是解析器不会停下来等它下载。异步脚本禁止使⽤ document.write(),它们可以访问⾃⼰script和之前的⽂档元素
当⽂档完成解析,document.readState变成interactive
所有defer脚本会按照在⽂档出现的顺序执⾏,延迟脚本能访问完整⽂档树,禁止使⽤ document.write()
浏览器在Document对象上触发DOMContentLoaded事件
此时⽂档完全解析完成,浏览器可能还在等待如图⽚等内容加载,等这些内容完成载⼊ 并且所有异步脚本完成载⼊和执⾏,document.readState变为complete,window触发 load事件
21、显示⻚⾯(HTML解析过程中会逐步显示⻚⾯)

解法二

参考连接:https://mp.weixin.qq.com/s/afZ_IrBwf1dZ9TQk7p75cg
大致流程
1、URL 解析
2、DNS 查询
3、TCP 连接
4、处理请求
5、接受响应
6、渲染页面

URL解析

地址解析
首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。
HSTS
由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。详见:你所不知道的 HSTS。
其他操作
浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。
检查缓存请添加图片描述

DNS查询

基本步骤
请添加图片描述

1、浏览器缓存
浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。
2、操作系统缓存
操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。
3、路由器缓存
路由器也有自己的缓存。
4、ISP DNS 缓存
ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。
根域名服务器查询
在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:
请添加图片描述
需要注意的点
1、递归方式:一路查下去中间不返回,得到最终结果才返回信息(浏览器到本地DNS服务器的过程)
2、迭代方式,就是本地DNS服务器到根域名服务器查询的方式。
3、什么是 DNS 劫持
4、前端 dns-prefetch 优化

TCP连接

TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装:
请添加图片描述
1、应用层:发送 HTTP 请求
在前面的步骤我们已经得到服务器的 IP 地址,浏览器会开始构造一个 HTTP 报文,其中包括:
请求报头(Request Header):
请求方法、目标地址、遵循的协议等等
请求主体(其他参数)
其中需要注意的点:浏览器只能发送 GET、POST 方法,而打开网页使用的是 GET 方法
2、传输层:TCP 传输报文
传输层会发起一条到达服务器的 TCP 连接,为了方便传输,会对数据进行分割(以报文段为单位),并标记编号,方便服务器接受时能够准确地还原报文信息。整编:微信公众号,搜云库技术团队,ID:souyunku
在建立连接前,会先进行 TCP 三次握手。
3、网络层:IP协议查询Mac地址
将数据段打包,并加入源及目标的IP地址,并且负责寻找传输路线。
判断目标地址是否与当前地址处于同一网络中,是的话直接根据 Mac 地址发送,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 Mac 地址。
注意:在 OSI 参考模型中 ARP 协议位于链路层,但在 TCP/IP 中,它位于网络层。
4、链路层:以太网协议
以太网协议
根据以太网协议将数据分为以“帧”为单位的数据包,每一帧分为两个部分:
标头:
数据包的发送者、接受者、数据类型
数据:
数据包具体内容
Mac 地址
以太网规定了连入网络的所有设备都必须具备“网卡”接口,数据包都是从一块网卡传递到另一块网卡,网卡的地址就是 Mac 地址。每一个 Mac 地址都是独一无二的,具备了一对一的能力。
广播
发送数据的方法很原始,直接把数据通过 ARP 协议,向本网络的所有机器发送,接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃。
注意:接收方回应是单播。
服务器接受请求
接受过程就是把以上步骤逆转过来,参见上图。

服务器处理请求

请添加图片描述
HTTPD
最常见的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。
它会监听得到的请求,然后开启一个子进程去处理这个请求。整编:微信公众号,搜云库技术团队,ID:souyunku
处理请求
接受 TCP 报文后,会对连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证:
1、验证是否配置虚拟主机
2、验证虚拟主机是否接受此方法
3、验证该用户可以使用该方法(根据 IP 地址、身份信息等)
重定向
假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。
URL 重写
然后会查看 URL 重写规则,如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。
否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。
然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。
以 PHP 语言的 MVC 框架举例,它首先会初始化一些环境的参数,根据 URL 由上到下地去匹配路由,然后让路由所定义的方法去处理请求。

浏览器响应

浏览器接收到来自服务器的响应资源后,会对资源进行分析。
首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。
如果响应资源进行了压缩(比如 gzip),还需要进行解压。整编:微信公众号,搜云库技术团队,ID:souyunku
然后,对响应资源做缓存。
接下来,根据响应资源里的 MIME 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。

渲染页面

请添加图片描述
不同的浏览器内核,渲染过程也不完全相同,但大致流程都差不多。
基本流程
请添加图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐