计算机网络(简称网络)是由若干结点和链接这些结点的链路组成。结点能够是计算机,集线器,交换机或路由器。html
(这图些许有些草率了)各个主机之间经过交换机链接,而路由器负责链接多个不一样的网络 web
交换机工做于数据链路层。交换机内部的CPU会在每一个端口成功链接时,经过将MAC地址和端口对应,造成一张MAC表。在从此的通信中,发往该MAC地址的数据包将仅送往其对应的端口,而不是全部的端口。所以,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。算法
简略的归纳一下交换机的基本功能:数据库
1. 像集线器同样,交换机提供了大量可供线缆链接的端口,这样能够采用星型拓扑布线。浏览器
2. 像中继器、集线器和网桥那样,当它转发帧时,交换机会从新产生一个不失真的方形电信号。缓存
3. 像网桥那样,交换机在每一个端口上都使用相同的转发或过滤逻辑。服务器
4. 像网桥那样,交换机将局域网分为多个冲突域,每一个冲突域都是有独立的宽带,所以大大提升了局域网的带宽。微信
5. 除了具备网桥、集线器和中继器的功能之外,交换机还提供了更先进的功能,如虚拟局域网(VLAN)和更高的性能。markdown
老式的交换机只支持两层(到MAC数据链路层),因此须要路由器去解析IP,而如今不少交换机已经支持了三层(到IP层)网络
路由器一般位于OSI模型的网络层,是链接两个或多个网络的硬件设备,在网络间起网关的做用。它可以理解不一样的协议,例如某个局域网使用的以太网协议,因特网使用的TCP/IP协议。能够分析各类不一样类型网络传来的数据包的目的地址,把非TCP/IP网络的地址转换成TCP/IP地址,或者反之;再根据选定的路由算法把各数据包按最佳路线传送到指定位置。因此路由器能够把非TCP/ IP网络链接到因特网上。
原理
网络中的设备相互通讯主要是用它们的IP地址,路由器只能根据具体的IP地址来转发数据。计算机之间的通讯只能在具备相同网络地址的IP地址之间进行,若是想要与其余网段的计算机进行通讯,则必须通过路由器转发出去。不一样网络地址的IP地址是不能直接通讯的,即使它们距离很是近,也不能进行通讯。路由器的多个端口能够链接多个网段,每一个端口的IP地址的网络地址都必须与所链接的网段的网络地址一致。不一样的端口它的网络地址是不一样的,所对应的网段也是不一样的,这样才能使各个网段中的主机经过本身网段的IP地址把数据发送到路由器上。
又称协议转换器,在网络层以上实现网络互联
网关实质上是一个网络通向其余网络的IP地址(网关的IP地址是具备路由功能的设备的IP地址)。
在各个设备之间的传输是须要MAC地址的。
又称物理地址,MAC地址,是数据链路层和物理层使用的地址。实际上就是适配器地址或适配器标识符EUI-48,当这块适配器插入某台计算机后,适配器上的标识符就成为了这台机器的MAC地址了。
若是链接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个MAC地址。当路由器经过适配器链接到局域网时,适配器的硬件地址就用来标志路由器的某个接口,路由器若是须要同时链接到两个网络上,那么他就须要两个适配器和两个硬件地址。
IP地址就是给每一台主机(或路由器)的每个接口分配一个在全世界范围内惟一的32位的标识符。IP地址是网络层及以上各层使用的地址,是一种逻辑地址。
A/B/C类地址都由两个固定的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所链接到的网络,一个网络号在整个互联网范围内是惟一的。第二个字段是主机号(host-id),标志该主机(路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是惟一的。因而可知,一个IP地址在整个互联网范围内是惟一的。这三类地址都是单播地址,是最经常使用的。
子网
IP地址 = 网络号 + 子网号 + 主机号
子网掩码是一个网络或一个子网的重要属性,路由器交换信息时,必须将本身所在网络的子网掩码告诉相邻路由器
A类地址的默认子网掩码是255.0.0.0
B类地址的默认子网掩码是255.255.0.0
C类地址的默认子网掩码是255.255.255.0
常见的IP书写方式如 192.168.100.1/24,24对应的实际上是子网掩码
咱们常说的计算机的网络模型,在各个协议层之间数据传输的时候经历的过程是什么
支持网络应用协议和程序的运行,相似于微信/云服务等
经常使用协议HTTP(超文本传输协议)、FTP(文件传输协议),SNMP ,SMTP(邮件),DNS,DHCP
DHCP动态主机配置协议,使用UDP协议工做, 给内部网络自动分配IP地址。DHCP服务器先广播一次,若无响应广播四次,无响应则DHCP失败
HTTP 协议主要由三大部分组成:
起始行(start line)
:描述请求或响应的基本信息;头部字段(header)
:使用 key-value 形式更详细地说明报文;消息正文(entity)
:实际传输的数据,它不必定是纯文本,能够是图片、视频等二进制数据。其中起始行和头部字段并成为 请求头
或者 响应头
,统称为 Header
;消息正文也叫作实体,称为 body
。HTTP 协议规定每次发送的报文必需要有 Header,可是能够没有 body,也就是说头信息是必须的,实体信息能够没有。并且在 header 和 body 之间必需要有一个空行(CRLF)
相似于
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
复制代码
首部分为请求首部和响应首部,而且部分首部两种通用
通用字段 | 做用 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 浏览器想要优先使用的链接类型,好比 keep-alive |
Date | 建立报文时间 |
Pragma | 报文指令 |
Via | 代理服务器相关信息 |
Transfer-Encoding | 传输编码方式 |
Upgrade | 要求客户端升级协议 |
Warning | 在内容中可能存在错误 |
请求首部
请求首部 | 做用 |
---|---|
Accept | 能正确接收的媒体类型 |
Accept-Charset | 能正确接收的字符集 |
Accept-Encoding | 能正确接收的编码格式列表 |
Accept-Language | 能正确接收的语言列表 |
Expect | 期待服务端的指定行为 |
From | 请求方邮箱地址 |
Host | 服务器的域名 |
If-Match | 两端资源标记比较 |
If-Modified-Since | 本地资源未修改返回 304(比较时间) |
If-None-Match | 本地资源未修改返回 304(比较标记) |
User-Agent | 客户端信息 |
Max-Forwards | 限制可被代理及网关转发的次数 |
Proxy-Authorization | 向代理服务器发送验证信息 |
Range | 请求某个内容的一部分 |
Referer | 表示浏览器所访问的前一个页面 |
TE | 传输编码方式 |
响应首部
响应首部 | 做用 |
---|---|
Accept-Ranges | 是否支持某些种类的范围 |
Age | 资源在代理缓存中存在的时间 |
ETag | 资源标识 |
Location | 客户端重定向到某个 URL |
Proxy-Authenticate | 向代理服务器发送验证信息 |
Server | 服务器名字 |
WWW-Authenticate | 获取资源须要的验证信息 |
管理收发双方数据分包传输的协议,对收到的报文进行差错检测
网络层是为主机之间提供逻辑通讯,而传输层为应用进程之间提供端到端的逻辑通讯
TCP的传输单元是报文段,分为首部和数据两部分
应用层协议和传输层协议的对应关系: 为了使不一样操做系统的计算机的应用进程能够互相通讯,传输层使用协议端口号,简称为端口,虽然通讯的终点是应用进程,但只要把报文交到目的主机的目的端口,最后的交付目的进程由TCP或UDP完成。
常见端口
TCP报文首部的前20个字节是固定的,后面有4n字节是根据须要增长的选项。
对网络数据包进行存储转发,路由器经过路由算法算出数据包从哪一个出口出去就是粗略的存储转发
网络层向上只提供简单灵活的,无链接的,尽最大努力交付的数据报服务,网络层不提供服务质量的承诺,可能会出错,丢失,重复,失序等问题,若是主机中的通讯须要可靠的,则由传输层负责(包括差错处理,流量控制等)
主要的协议是IP,与IP协议配套使用的还有三个协议:
IP转发
IP首部记录的是源IP地址和目的IP地址,不会记录通过的路由器的IP地址。
因此当路由器接收到一个待转发的数据报,从路由表得出下一跳路由器的IP地址后,送交数据链路层的网络接口软件,网络接口软件用ARP将下一跳路由器的IP地址转换成MAC地址,放在链路层的MAC帧的首部,而后根据这个硬件地址找到下一跳路由器。
路由表:每一行对应一个网络,每一条路由记录(目的网络地址,子网掩码,0下一跳地址)
复制代码
管理数据包点对点(终端,路由器,switch转换器等两个物理机器)之间的发出与接收,wifi就是在数据链路层
数据链路层的协议数据单元——帧
APR协议
根据IP地址解析出MAC地址,能够划分在网络层,也能够划分在数据链路层。
还有一个旧的逆地址解析协议RARP,根据硬件地址找IP地址,如今由DHCP替代。
每一台主机都有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这个映射表会常常更新(新增或超时删除:网络中的主机是变更的,而更换网络适配器物理地址也是变更的)
管理每个数据的每个比特在物理媒体(电缆,光纤,无线电波等)上是如何传输的
新链接的笔记本链接上网须要一个IP地址,本地路由器地址,DNS服务器地址。解析获取这些数据使用的是DHCP协议(应用层),而支持DHCP的传输层协议是UDP
用户的IP地址
,本地路由器IP地址
,DNS服务器的名字和IP地址
要将域名转换成IP是由于计算机只认识数字(IP),而不认识域名。固然若是你输入的直接是IP地址或者是有了DNS缓存,则不需这一步
DNS缓存指DNS返回了正确的IP以后,系统就会将这个结果(域名与IP的映射)临时储存起来。而且它会为缓存设定一个失效时间
(例如N小时),在这N小时以内,当你再次访问这个网站时,系统就会直接从你电脑本地的DNS缓存(浏览器,操做系统,路由等)中
把结果交还给你,而没必要再去询问DNS服务器,变相“加速”了网址的解析。固然,在超过N小时以后,系统会自动再次去询问DNS服务
器得到新的结果。
因此,当你修改了 DNS 服务器,而且不但愿电脑继续使用以前的DNS缓存时,就须要手动去清除本地的缓存了
复制代码
DNS查询信息被建立封装到UDP网络段,IP数据报和Ethernet数据帧。为了使数据帧能够被发送到路由器上,须要用ARP查出本地路由器MAC地址。(虽然上步知道了路由器的IP地址,但仍是须要路由器的MAC地址,才能把信息传输给路由器,固然若是DNS服务器是同一网段的,也能够不经过路由器)
IP地址会被封装在网络层的IP首部
为了使不一样操做系统的计算机的应用进程能够互相通讯,运输层使用协议端口号,简称为端口,虽然通讯的终点是应用进程,但只要把报文交到目的主机的目的端口,最后的交付目的进程由TCP或UDP完成。
这种协议栈层间的抽象的协议端口是软件端口(应用层的各类协议进程与运输实体进行层间交互的一种地址),和路由器或交换机上的硬件端口(硬件设备交互的接口)是不一样的概念。而端口会被封装在TCP的首部
而后从这开始就是老生长谈的了,创建TCP链接
浏览器拿到数据会判断状态码是什么,若是是 200
那就继续解析,若是 400
或 500
的话就会报错,若是 300
的话会进行重定向,这里会有个重定向计数器,避免过屡次的重定向,超过次数也会报错。浏览器开始解析文件,若是是 gzip
格式的话会先解压一下,而后经过文件的编码格式知道该如何去解码文件。
浏览器准备渲染进程,默认状况下,Chrome
会为每一个页面分配一个渲染进程,也就是说,每打开一个新页面就会配套建立一个新的渲染进程。
文件解码成功后会正式开始渲染流程,先会根据 HTML
构建 DOM
树,有CSS
的话会去构建 CSSOM
树。 CSSOM
树和 DOM
树构建完成后会开始生成 Render
树,Layout计算页面元素的布局、样式等等诸多方面的东西。Painting开始绘图,而后将页面展现出来,当前这一块也涉及回流重绘方面的优化。