咱们天天使用互联网,你是否想过,它是如何实现的?网络
全世界几十亿台电脑,链接在一块儿,两两通讯。杭州的某一块网卡送出信号,纽约的另外一块网卡竟然就收到了,二者实际上根本不知道对方的物理位置,你不以为这是很 神奇 的事情吗?架构
互联网的核心是一系列协议,总称为 互联网协议 Internet Protocol Suite
。它们对 电脑 以及各类 网络设备 如何 链接 和 组网,作出了详尽的规定。理解了这些协议,就理解了互联网的原理。socket
下面咱们一块儿来探索 网络 的 神秘 吧ui
==========================================================设计
互联网 的实现,分红好几层。每一层都有本身的功能,就像建筑物同样,每一层都靠下一层支持。code
用户接触到的,只是最上面的一层,也就是 应用层。根本没有感受到下面的层。要理解互联网,必须从 最下层 开始,自下而上理解每一层的功能。orm
如何分层有不一样的模型,OSI
分为 七层。TCP-IP
协议群把互联网分红五层
,比较容易解释。 cdn
如图所示,最底下的一层叫作 物理层 Physical Layer
,最上面的一层叫作 应用层 Application Layer
,中间的三层分别是 链路层 Link Layey
, 网络层 Network Layer
和 传输层 Transport Layer
。越 下面 的层,越靠近 硬件 ;越 上面 的层,越靠近 用户。blog
每一层都是为了完成一种功能。为了实现这些功能,就须要你们都遵照共同的规则。接口
你们都遵照的 规则,就叫作 协议 protocol
。
互联网 的 每一层,都定义了不少协议。它们是互联网的核心,咱们依次来探索每一层和每一层所适用的 协议。
物理层是网络协议的最底层。
电脑要组网,第一件事要干什么?固然是先把电脑连起来,能够用 光缆、电缆、双绞线、无线电波 等方式。
如图所示,2台电脑经过中间媒介的连接就组成了一个最简单的 区域网 。在这一层中,各类媒介中传输的就是咱们熟称的 比特流,也就是传送 0 和 1 的电信号。
链路层
定义
单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每一个信号位有何意义? 这就是 连接层 的功能,它在 实体层 的上方,肯定了 0 和 1 的 分组方式。
以太网协议
早期的时候,每家公司都有本身的电信号分组方式。逐渐地,一种叫作以太网(Ethernet
)的协议,占据了主导地位。
以太网规定,一组电信号构成一个 数据包,叫作 帧(Frame
)。每一帧分红两个部分:标头(Head
)和 数据(Data
)。
MAC地址
上面提到,以太网数据包的 标头,包含了 发送者 和 接受者 的信息。那么,发送者 和 接受者 是如何标识呢?
以太网规定,连入网络的全部设备,都必须具备 网卡 接口。
数据包必须是从一块网卡,传送到另外一块网卡。网卡 的地址,就是数据包的发送地址和接收地址,这叫作MAC
地址。
广播
定义地址只是第一步,后面还有更多的步骤。
首先,一块网卡怎么会知道另外一块网卡的MAC
地址?
咱们能够经过ARP
协议,能够解决这个问题。
其次,就算有了MAC
地址,系统怎样才能把数据包准确送到接收方?
回答是以太网采用了一种很 原始 的方式,它不是把数据包准确送到接收方,而是向本网络内全部 网络设备 发送,让每台网络设备本身判断,是否为接收方。【此处存在漏洞,咱们能够进行攻击】
broadcasting
)。MAC
地址、广播的发送方式,连接层 就能够在多台计算机之间传送数据了。 网络层
网络层的由来
以太网协议,依靠MAC
地址发送数据。理论上,单单依靠MAC
地址,杭州的网卡就能够找到纽约的网卡了,技术上是能够实现的。
可是,这样作有一个重大的缺点。以太网 采用 广播方式 发送数据包,全部成员 人手一包,不只 效率低,并且局限在发送者所在的 子网络。
也就是说,若是两台计算机不在同一个 子网络,广播是传不过去的。这种设计是合理的,不然互联网上每一台计算机都会收到全部包,那会引发灾难。
互联网是无数子网络共同组成的一个巨型网络,很像想象上海和洛杉矶的电脑会在同一个子网络,这几乎是不可能的。
MAC
地址属于同一个子网络,哪些不是。若是是 同一个子网络,就采用 广播方式 发送,不然就采用 路由 方式发送。遗憾的是,MAC
地址自己没法作到这一点。它只与厂商有关,与所处网络无关。MAC
地址,另外一种是 网络 地址。两种地址之间没有 任何联系 ,MAC
地址是绑定在 网卡上 的,网络地址则
是系统自动分配的或者管理员指定,它们只是随机组合在一块儿。MAC
地址则将数据包送到该子网络中的目标网卡。所以,从逻辑上能够推断,一定是先处理 网络地址 ,而后再处理MAC
地址。 IP协议
规定网络地址的协议,叫作IP
协议。它所定义的地址,就被称为IP
地址。
目前,普遍采用的是IP
协议第四版,简称IPv4
。这个版本规定,网络地址由 32 个二进制位组成。
IP
地址,从0.0.0.0
一直到 255.255.255.255
。IP
地址。这个地址分红两个部分,前一部分 表明网络,后一部分 表明主机。好比,IP
地址 172.16.254.1
,这是一个32
位的地址,假定它的网络部分是前24位(172.16.254
),那么主机部分就是后8
位(最后的那个1
)。处于同一个子网络的电脑,它们IP
地址的网络部分一定是相同的,也就是说172.16.254.2
应该与172.16.254.1
处在同一个子网络。IP
地址,咱们没法判断网络部分。仍是以172.16.254.1
为例,它的网络部分,究竟是前24
位,仍是前16
位,甚至前28
位,从IP地址上是看不出来的。IP
地址,判断两台计算机是否属于同一个子网络呢?这就要用到另外一个参数 子网掩码(subnet mask
)。IP
地址,也是一个32
位二进制数字,它的网络部分所有为 1 ,主机部分所有为 0 。IP
地址172.16.254.1
,若是已知网络部分是前24
位,主机部分是后8
位,那么子网络掩码就是11111111.11111111.11111111.00000000
,写成十进制就是255.255.255.0
。IP
地址是否处在同一个子网络。方法是将两个IP地址与 子网掩码 分别进行AND
运算(两个数位都为1,运算结果为1,不然为0),而后比较结果是否相同,若是是的话,就代表它们在同一个子网络中,不然就不是。IP
地址172.16.254.1
和172.16.254.233
的子网掩码都是255.255.255.0
,请问它们是否在同一个子网络?二者与子网掩码分别进行AND运算,结果都是172.16.254.0
,所以它们在同一个子网络。 IP数据包
根据IP
协议发送的数据,就叫作IP
数据包。不难想象,其中一定包括IP
地址信息。
可是前面说过,以太网数据包 只包含MAC
地址,并无IP
地址的栏位。那么是否须要修改数据定义,再添加一个栏位呢?
回答是不须要,咱们能够把IP
数据包直接放进以太网数据包的 数据 部分,所以彻底不用修改以太网的规格。这就是互联网分层结构的好处:上层的变更彻底不涉及下层的结构
具体来讲,IP数据包也分为 标头 和 数据 两个部分。
IP
数据包超过了1500
字节,它就须要分割成 几个 以太网数据包,分开发送了。 ARP
协议。
由于IP
数据包是放在以太网数据包里发送的,因此咱们必须同时知道两个地址,一个是对方的MAC
地址,另外一个是对方的IP
地址。
一般状况下,对方的IP
地址是已知的,可是咱们不知道它的MAC
地址。
因此,咱们须要一种 机制 ,可以从IP
地址获得MAC
地址。
MAC
地址,只能把数据包传送到两个子网络链接处的 网关(gateway
),让网关去处理。MAC
地址。MAC
地址这一栏,填的是FF:FF:FF:FF:FF:FF
,表示这是一个 广播 地址。IP
地址,与自身的IP
地址进行比较。若是二者相同,都作出回复,向对方报告本身的MAC
地址,不然就 丢弃 这个包。传输层
传输层的由来
有了MAC
地址和IP
地址,咱们已经能够在互联网上任意两台主机上创建通讯。
接下来的问题是,同一台主机上有许多 程序 都须要用到网络,好比,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示 网页 的内容,仍是表示 在线聊天 的内容?
也就是说,咱们还须要一个 参数 ,表示这个数据包到底供哪一个程序(进程)使用。这个参数就叫作 端口(port
),它实际上是每个 使用网卡的程序的编号。每一个 数据包 都发到主机的 特定端口 ,因此不一样的程序就能取到本身所须要的数据。
端口 是0到65535之间的一个整数,正好16个二进制位。
0 到 1023 的端口被系统占用,用户只能选用 大于1023 的端口。
传输层 的功能,就是创建 端口到端口 的通讯。
相比之下,网络层 的功能是创建 主机到主机 的通讯。
只要肯定 主机 和 端口,咱们就能实现程序之间的交流。
所以,Unix
系统就把 主机+端口,叫作 套接字(socket
)。有了它,就能够进行网络应用程序开发了。
UDP协议
如今,咱们必须在数据包中加入端口信息,这就须要新的协议。最简单的实现叫作UDP
协议,它的格式几乎就是在 数据前面,加上端口号。
UDP 数据包,也是由 标头 和 数据 两部分组成。
UDP
数据包放入IP
数据包的 数据 部分,而前面说过,IP数据包 又是放在 以太网数据包 之中的,因此整个以太网数据包如今变成了下面这样:
TCP协议
UDP 协议的优势是比较 简单,容易实现,可是 缺点 是 可靠性较差,一旦数据包发出,没法知道对方是否收到。
为了解决这个问题,提升网络可靠性,TCP
协议就诞生了。
这个协议很是复杂,但能够近似认为,它就是有 确认机制 的UDP
协议,每发出一个数据包都要求 确认。
若是有一个数据包 遗失,就收不到 确认,发出方就知道有必要 重发 这个数据包了。
所以,TCP
协议可以确保数据 不会遗失。它的 缺点 是过程 复杂、实现困难、消耗较多的资源。
TCP 数据包和 UDP
数据包同样,都是内嵌在IP
数据包的 数据 部分。
TCP 数据包没有 长度限制 ,理论上能够无限长
,可是为了 保证网络的效率,一般TCP
数据包的长度不会超过IP
数据包的长度,以确保单个TCP
数据包没必要再分割。
应用层
应用程序 收到 传输层 的数据,接下来就要进行 解读。因为互联网是开放架构,数据来源五花八门,必须事先规定好 格式,不然根本没法解读。
应用层 的做用,就是规定应用程序的数据格式。
举例来讲,TCP
协议能够为各类各样的程序传递数据,好比Email
、WWW
、FTP
等等。那么,必须有不一样协议规定 电子邮件、网页、FTP数据 的 格式,这些应用程序协议就构成了 应用层。
这是 最高 的一层,直接面对用户。它的数据就放在TCP
数据包的 数据 部分。所以,如今的以太网的数据包就变成下面这样。
PC
会中
电脑病毒,那么网络设备中的
交换机、
路由器、
集线器 等设备也会中
电脑病毒 么?
愿意与你们分享交流各类技术,我的公众帐号[mindev],以及 知识星球[ 极客世界 ]