详解计算机网络模型

925 阅读19分钟

计算机网络

计算机网络主要是由一些通用的、可编程的硬件互连而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用。

计算机网络按作用范围分为局域网LAN城域网(MAN)广域网WAN三类。

计算机网络模型

常见的网络模型有OSI七层模型、TCP/IP四层模型、因特网协议栈五层模型。

  • OSI七层模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
  • 因特网协议栈五层模型分为物理层、链路层、网络层、传输层、应用层。
  • TCP/IP四层模型分为网络接口层、网络层、传输层、应用层。

下面笔者详细介绍几个通用的层级。

物理层

物理层是规定传输媒体接口的标准。他并不管物理介质具体是什么,比如电线杆上是光纤还是双绞线,只要你能按物理层规定的标准传输数据就行。

传输比特流,在物理层数据的基本单位称为比特(bit)。

信道

信道是往一个方向传送信息的媒体。一条通信电路包含一个接受信道和一个发送信道。

信道分类

  1. 单工通信信道。只能往一个方向通信,没有反方向反馈的信道。比如电视、收音机。
  2. 半双工通信信道。双方都可以发送和接收信息,但是双方不能同时发送,也不能同时接收。
  3. 全双工通信信道。双方都可以发送和接收信息,并且双方可以同时发送,也可以同时接收。

光纤宽带上网是以什么样的形式传输数据呢?

计算机传输数据需要先把电信号转为光信号,然后光信号快到服务器的时候,再把光信号转为电信号

物理层设备中继器

因为在线路上传输的信号功率会逐渐衰减,衰减到一定程度时将造成信号失真,因此会导致接收错误。比如我们网线推荐距离一般不会超过100米。中继器可以对信号进行再生还原,增加信号的传输距离。

数据链路层

帧是数据链路层数据的基本单位。数据链路层主要作用是在互连设备之间传送数据帧。

(1) 封装成帧 把数据封装成一个个的帧,帧由帧首部 + 帧数据 + 帧尾部构成。数据链路层的数据帧不是无限大的,由最大传输单元MTU决定,数据帧过大或过小都会影响传输的效率,以太网 MTU 一般为 1500 字节。

(2)透明传输 也就是原原本本的传输。帧的数据部分可能有跟帧首部完全一样的字符,这时候就要采取一定的措施,让接受方不要被被误导,能让接收方知道哪些是帧的首部哪些是帧的数据。这个问题有没有类似js的转义字符的问题。

(3)差错监测 数据链路层只负责数据的差错监测测不进行差错纠正。常用的监测方法有奇偶检验码、循环冗余校验码 CRC。

MAC地址是什么?

MAC地址,即设备的物理地址。MAC地址用于标示网卡,每个网卡都具有唯一的MAC 地址。MAC 地址共有 48 位,6 个字节。使用十六进制表示。比如 30-B4-9E-ED-85-CA

广播

如果 计算机 A 知道 计算机 B 的 MAC 地址就能直接传送数据了但是如果计算机 A 不知道计算机 B 的 MAC 地址呢?

所以为了解决这个问题,广播这个概念就出现了。在同一子网络,就是我们常说的局域网中,计算机通过广播来信,即向同子网中全部计算机发送数据包,其它计算机根据数据包中接收者的 MAC 地址 来判断是否接收数据包。会取出数据包中的 MAC 地址与自身的 MAC 地址对比,如相同就接收这个数据包,否则就丢弃这个数据包 ( 丢包 ),这种方式我们称之为广播

网络层

网络层的作用主要是地址管理、路由选择和将数据帧封装成数据报。在网络层数据的基本单位被称为数据报,包含报头数据本身。

数据报

IP 地址有 5 种

ipv4地址由4个字节组成,占32位,分为两部分,前面一部分代表网络号,后面一部分代表主机号,但是网络部分和主机部分所占用的二级制位数是不固定的。

  • A 类:1.0.0.0~126.255.255.255 (前面 1 个字节是网络号)
  • B 类:128.0.0.0~191.255.255.255 (前面 2 个字节是网络号)
  • C 类:192.0.0.0~223.255.255.255 (前面 3 个字节是网络号)
  • D 类:224.0.0.0~239.255.255.255 用于组播
  • E 类:240.0.0.0~254.255.255.255 用于科研

漏掉的127.0.0.0~127.255.255.255 用于环回测试。

还有一部分是私有IP地址,是不能拿到网络上跟别的计算机通信的。只能是局域网自己内部用

私有IP地址

子网

子网也叫网段,主要是为了增加ip 地址数量。因为就算ip地址相同,如果子网不同,可以指向不同的两台计算机。

子网掩码

子网掩码用于快速的计算出 ip 所处的子网。子网掩码和 IP 地址一样都是 32 位。子网掩码由连续的 1 和连续的 0 组成。

某一个子网的子网掩码具备网络号位数个连续的 1(二进制8个1就是255),主机号位数用 0 补齐。

  1. A 类地址的子网掩码 255.0.0.0
  2. B 类地址的子网掩码 255.255.0.0
  3. C 类地址的子网掩码 255.255.255.0

知道了子网掩码,相当于我们知道了网络部分是几位,主机部分是几位,我们只需要把 IP 地址二进制与他的子网掩码二进制做一个 ( and ) 运算,然后转为十进制就行了。也就是说有了两台计算机的 IP 地址 和 子网掩码 ,我们就可以判断他们是否处在同一子网当中了。

网络地址转换(NAT)

网络地址转换NAT是在专用网连接到因特网的路由器上安装NAT软件,安装了NAT软件的路由器叫NAT路由器,它至少有一个有效的外部全球IP地址。

NAT

如上图,路由器的ip地址172.38.1.5作为内网的代理,去访问外网,外网返回来的数据,经过路由转换,转换成内网的192.168网段的私有地址。

ARP(地址转换协议) 协议的工作原理?

MAC 地址一般来讲是不会变的,设备在生产时就被“烙”上了 唯一的标识,这个唯一的标识 就是 MAC 地址。

网络层的 ARP 协议完成了 IP 地址与 MAC 地址的映射。

  1. 首先,每台主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址的对应关系。
  2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP 列表中是否存在该 IP 地址对应的 MAC 地址。
  3. 如果有,就直接将数据包发送到这个 MAC 地址。
  4. 如果没有,就向本地网段发起一个 ARP 请求的广播包,查询此目的主机对应的 MAC 地址。此 ARP 请求数据包里包括源主机的 IP 地址、硬件地址、以及目的主机的 IP 地址。网络中所有的主机收到这个 ARP 请求后,会检查数据包中的目的 IP 是否和自己的 IP 地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中,如果 ARP 表中已经存在该 IP 的信息,则将其覆盖,然后给源主机发送一个 ARP 响应数据包,告诉对方自己是它需要查找的 MAC 地址。
  5. 源主机收到这个 ARP 响应数据包后,将得到的目的主机的 IP 地址和 MAC 地址添加到自己的 ARP 列表中,并利用此信息开始数据的传输。
  6. 如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

我们使用arp -a查看 arp 缓存列表

RARP(逆地址解析协议)

通过 MAC 地址找 IP 地址。

ICMP 协议(网际控制报文协议)

ICMP 协议可以报告错误信合或者异常情况,辅助 IP 传输数据。我们常用的ping命令借助ICMP协议,探测主机是否能找到目的主机。

传输层

传输层管理两个节点之间的数据传输,提供可靠传输或者不可靠传输。主要是TCP协议和UDP协议。

网络根据传输方式可以进行分类,一般分成两种 面向连接型和面向无连接型

  • 面向连接型中,在发送数据之前,需要在主机之间建立一条通信线路。典型代表是TCP协议。
  • 面向无连接型则不要求建立和断开连接,发送方可用于任何时候发送数据。接收端也不知道自己何时从哪里接收到数据。典型代表是UDP协议。

TCP

TCP 就是 传输控制协议,也就是 Transmission Control Protocol,它是一种面向连接的、可靠的、基于字节流的传输协议,TCP 协议位于传输层,TCP 协议是 TCP/IP 协议簇中的核心协议,它最大的特点就是提供可靠的数据交付。

TCP 的主要特点有 慢启动、拥塞控制、快速重传、可恢复

UDP

UDP 协议就是 用户数据报协议,也就是 User Datagram Protocol,UDP 也是一种传输层的协议,与 TCP 相比,UDP 提供一种不可靠的数据交付,也就是说,UDP 协议不保证数据是否到达目标节点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP 是一种无连接的协议,传输数据之前源端和终端无需建立连接,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失、重复、乱序等现象。但是 UDP 具有较好的实时性,工作效率较 TCP 协议高。

关于TCP和UDP本章不做详细介绍可以查看笔者的详解TCP和UDP

套接字

我们使用端口来标记不同的进程。端口使用 16 比特来表示端口(0~65535)。ip:port 就是套接字。

套接字(Socket)是抽象概念,表示 TCP 连接的一端,通过套接字可以进行数据发送或接收。套接字是传输层和应用层数据交换的桥梁。

TCP 连接由两个套接字组成 Socket1 <=> Socket2

应用层通过传输层进行数据通信时,TCP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了套接字(Socket)接口。应用层可以和传输层通过 Socket 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

应用层

应用层对应用程序的通信提供服务。

协议

网络协议就是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。

DHCP协议

DHCP 是应用 UDP 协议的应用层协议,默认端口是 67 端口。主要作用是动态分配 ip 地址,当你接入局域网的时候,自动由这个DHCP服务器给你分配IP。

DNS 协议

DNS 协议是 域名系统协议,英文全称是 Domain Name System,它也是应用层的协议之一,DNS 协议运行在UDP 协议之上,使用 53 号 端口。DNS 协议是一个将域名和 IP 相互映射的分布式数据库系统。DNS 缓存能够加快网络资源的访问。

对于www.qq.com. 来说,等等,是不是多打了一个点,当然不是多打,这个最后的 . 代表的是根域名,默认情况下所有的网址的最后一位都是 .,只不过为了方便用户,通常都会省略,浏览器在 DNS 解析 时会自动加上的,com 是顶级域名,qq 是二级域名,www 是三级域名,如果 www 前还有,那就四级等等。

顶级域

顶级域分为国家顶级域和通用顶级域

  • 国家顶级域有 cn、us、uk、ca 等
  • 通用顶级域有 com、net、gov、org 等
二级域

常见的有 aliyun、qq、taobao、baidu、google、alibaba 等

DNS 解析步骤
  1. 系统会检查浏览器缓存中有没有这个域名对应的解析过的 IP 地址,如果缓存中有,这个解析过程就将结束。浏览器缓存是受这个域名的失效时间和缓存的空间大小控制的。

  2. 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中即为本地的 Host 文件。

  3. 如果操作系统缓存没有就会检查路由器缓存。

  4. 如果前几步都没没找到,会向 ISP(网络服务提供商)的 LDNS(本地服务器)查询。比如你用的是电信的网络,则会进入电信的 DNS 缓存服务器中进行查找。

  5. 如果 LDNS (本地服务器)没找到,会向根域名服务器(Root Server)请求解析,分为以下几步:

  • 根域名服务器收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名 ( .com ) 服务器 IP 告诉本地域名服务器,然后本地域名服务器发送请求到顶级域名服务器。
  • 顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名( qq.com )服务器的 IP 地址告诉本地域名服务器,然后本地域名服务器发送请求到二级域名服务器。
  • 二级域名服务器接受到请求后查询自己的缓存,如果没有则进入三级域名服务器( www.qq.com )进行查找,并重复该步骤直至找到正确纪录。
  • 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址与 Web 服务器建立链接。

FTP 协议

FTP 协议是 文件传输协议,英文全称是 File Transfer Protocol,应用层协议之一,是 TCP/IP 协议的重要组成之一,FTP 协议分为服务器和客户端两部分,FTP 服务器用来存储文件,FTP 客户端用来访问 FTP 服务器上的文件,FTP 的传输效率比较高,所以一般使用 FTP 来传输大文件。

SMTP 协议

SMTP 协议是 简单邮件传输协议,英文全称是 Simple Mail Transfer Protocol,应用层协议之一,SMTP 主要是用作邮件收发协议,SMTP 服务器是遵循 SMTP 协议的发送邮件服务器,用来发送或中转用户发出的电子邮件。

通信过程

看完了各层级的介绍下面我们一起了解下两台主机间通信时数据传输的过程。

172c2cecd0e18747_tplv-t2oaga2asx-watermark.png

扩展

URI、URL、URN

URI

URI的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。URI 不仅包括 URL,还包括 URN(统一资源名称)。

URI 只能使用ASCII, ASCII 之外的字符是不支持显示的,而且还有一部分符号是界定符,如果不加以处理就会导致解析出错。ASCII 是 7 比特字符集,包含了 128 个不同的字符值。 ASCII 支持0-9的数字,A-Z大写和小写英文字母,以及一些特殊字符。其中包括32个通用控制字符、10个十进制数码、52个英文大写小写字母和34个专用符号。

因此,URI 引入了编码机制,将所有非 ASCII 码字符界定符转为十六进制字节值,然后在前面加个%。如,空格被转义成了%20

URI的结构如下:

170ffd677629b70d_tplv-t2oaga2asx-image.png

URL

URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是 URI 的一个子集。

CDN

CDN 全称为内容分发网络 (Content Delivery Network),它能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,以提高用户访问网站的相应速度。

使用 CDN 的缺陷是需要注意缓存。修改可能不会立即生效,需要刷新缓存。

分发服务系统

分发服务系统的基元是 Cache 设备,它会同步源站点的内容并负责响应用户的访问请求,把缓存在本地的内容快速的提供给用户。

负载均衡系统

对发起请求的用户进行访问调度,确定提供给用户的最终实际访问地址。该系统分为全局负载均衡 (GSLB) 和本地负载均衡 (SLB)。GBLB 主要根据“就近原则”,通过对每个服务节点进行最优判断,向用户提供最合适的 Cache 设备。SLB 主要负责节点内部的设备负载均衡。

CDN 厂商做域名解析,它也是利用 DNS 的重定向技术,DNS 服务器会返回一个跟用户最接近的点的 IP 地址给用户,CDN 节点的服务器负责响应用户的请求,提供所需的内容,CDN 厂商的域名解析服务器用户量多,被访问的次数也多,域名解析服务器的 A 记录基本上会被各地运营商的 DNS 一直缓存着,所以服务效果也是最好的。

代理和网关

代理分为正向代理反向代理。

正向代理

由客户端向代理服务器发出请求,并指定目标访问服务器,然后,代理服务器向源服务器转交需求,并将获得的内容返回给客户端客户端知道真正要请求的服务器,服务端不知道真实的客户端是谁。

反向代理

由客户端向代理服务器发出请求,代理服务器判断目标服务器,然后向目标服务器发送请求获取响应,然后把数据发送给客户端。对客户端来说并不知道真正的服务器是谁,把代理服务器当成服务器。反向代理器一般用来实现负载平衡。常见的反向代理有Nginx。

常见代理服务器的作用

  • 缓存代理。代理转发响应时 缓存代理会将数据缓存到自己的服务器上 下次请求来的时候直接将缓存的数据返回
  • 负载均衡。客户端的请求只会先到达代理服务器,后面到底有多少源服务器,IP 都是多少,客户端是不知道的。因此,这个代理服务器可以拿到这个请求之后,可以通过特定的算法分发给不同的源服务器,让各台源服务器的负载尽量平均。当然,这样的算法有很多,包括随机算法、轮询、一致性 hash、LRU(最近最少使用)等等。
  • 保障安全。利用心跳机制监控后台的服务器,一旦发现故障机就将其踢出集群。并且对于上下行的数据进行过滤,对非法 IP 限流,这些都是代理服务器的工作。
  • 透明代理 只负责转发请求和响应 不对数据进行操作。

代理相关头部字段

  • Via 假如有一个客户端 -> 代理 1 -> 代理 2 -> 源服务器的请求。在源服务器收到请求后,会在请求头拿到这个字段:Via: proxy_server1, proxy_server2。而源服务器响应时,最终在客户端会拿到这样的响应头:Via: proxy_server2, proxy_server1
  • X-Forwarded-For 字面意思就是为谁转发, 它记录的是请求方的 IP 地址(注意,和 Via 区分开,X-Forwarded-For 记录的是请求方这一个 IP,这意味着每经过一个不同的代理,这个字段的名字都要变,从客户端到代理 1,这个字段是客户端的 IP,从代理 1 到代理 2,这个字段就变为了代理 1 的 IP。意味着代理必须解析 HTTP 请求头,然后修改,比直接转发数据性能下降。)。
  • X-Real-IP 是一种获取用户真实 IP 的字段,不管中间经过多少代理,这个字段始终记录最初的客户端的 IP。相应的,还有 X-Forwarded-Host 和 X-Forwarded-Proto,分别记录客户端(注意哦,不包括代理)的域名和协议名。

网关

网关负责将从传输层到应用层的数据进行转换和转发的设备。在同一种类型的协议之间转发数据的网关叫应用网关。

参考文章

💗前端需要了解的计算机网络知识, 这一篇就够了!

连肝7个晚上,总结了计算机网络的知识点!

后记

本文为笔者个人学习笔记,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个赞~~