大家好,又见面了,我是全栈君。
转载自:阮一峰
我们每天使用互联网。你是否想过,它是怎样实现的?
全世界几十亿台电脑,连接在一起,两两通信。
上海的某一块网卡送出信号,洛杉矶的还有一块网卡竟然就收到了。两者实际上根本不知道对方的物理位置。你不认为这是非常奇妙的事情吗?
互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。
它们对电脑怎样连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。
以下就是我的学习笔记。由于这些协议实在太复杂、太庞大,我想整理一个简洁的框架,帮助自己从整体上把握它们。为了保证简单易懂,我做了大量的简化,有些地方并不全面和精确,可是应该可以说清楚互联网的原理。
=================================================
互联网协议入门
作者:阮一峰
一、概述
1.1 五层模型
互联网的实现,分成好几层。
每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。
用户接触到的,仅仅是最上面的一层。根本没有感觉到以下的层。
要理解互联网,必须从最下层開始。自下而上理解每一层的功能。
怎样分层有不同的模型,有的模型分七层,有的分四层。我认为。把互联网分成五层,比較easy解释。
如上图所看到的。最底下的一层叫做”实体层”(Physical Layer),最上面的一层叫做”应用层”(Application Layer),中间的三层(自下而上)各自是”链接层”(Link Layer)、”网络层”(Network Layer)和”传输层”(Transport Layer)。越以下的层,越靠近硬件;越上面的层。越靠近用户。
它们叫什么名字,事实上并不重要。
仅仅须要知道,互联网分成若干层就能够了。
1.2 层与协议
每一层都是为了完毕一种功能。为了实现这些功能。就须要大家都遵守共同的规则。
大家都遵守的规则。就叫做”协议”(protocol)。
互联网的每一层,都定义了非常多协议。这些协议的总称。就叫做”互联网协议”(Internet Protocol Suite)。它们是互联网的核心,以下介绍每一层的功能。主要就是介绍每一层的主要协议。
二、实体层
我们从最底下的一层開始。
电脑要组网,第一件事要干什么?当然是先把电脑连起来,能够用光缆、电缆、双绞线、无线电波等方式。
这就叫做”实体层”,它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。
三、链接层
3.1 定义
单纯的0和1没有不论什么意义,必须规定解读方式:多少个电信号算一组?每一个信号位有何意义?
这就是”链接层”的功能,它在”实体层”的上方,确定了0和1的分组方式。
3.2 以太网协议
早期的时候。每家公司都有自己的电信号分组方式。逐渐地,一种叫做“以太网”(Ethernet)的协议,占领了主导地位。
以太网规定。一组电信号构成一个数据包。叫做”帧”(Frame)。
每一帧分成两个部分:标头(Head)和数据(Data)。
“标头”包括数据包的一些说明项。比方发送者、接受者、数据类型等等。”数据”则是数据包的详细内容。
“标头”的长度。固定为18字节。
“数据”的长度。最短为46字节。最长为1500字节。因此,整个”帧”最短为64字节。最长为1518字节。假设数据非常长,就必须切割成多个帧进行发送。
3.3 MAC地址
上面提到。以太网数据包的”标头”,包括了发送者和接受者的信息。
那么。发送者和接受者是怎样标识呢?
以太网规定。连入网络的全部设备。都必须具有”网卡”接口。数据包必须是从一块网卡,传送到还有一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通经常使用12个十六进制数表示。
前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就能够定位网卡和数据包的路径了。
3.4 广播
定义地址仅仅是第一步,后面还有很多其它的步骤。
首先,一块网卡怎么会知道还有一块网卡的MAC地址?
回答是有一种ARP协议,能够解决问题。这个留到后面介绍,这里仅仅须要知道,以太网数据包必须知道接收方的MAC地址,然后才干发送。
其次,就算有了MAC地址。系统如何才干把数据包准确送到接收方?
回答是以太网採用了一种非常”原始”的方式。它不是把数据包准确送到接收方,而是向本网络内全部计算机发送,让每台计算机自己推断。是否为接收方。
上图中。1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的”标头”,找到接收方的MAC地址,然后与自身的MAC地址相比較,假设两者同样,就接受这个包,做进一步处理。否则就丢弃这个包。
这样的发送方式就叫做”广播”(broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,”链接层”就能够在多台计算机之间传送数据了。
四、网络层
4.1 网络层的由来
以太网协议,依靠MAC地址发送数据。
理论上,单单依靠MAC地址。上海的网卡就能够找到洛杉矶的网卡了。技术上是能够实现的。
可是,这样做有一个重大的缺点。
以太网採用广播方式发送数据包,全部成员人手一”包”。不仅效率低,并且局限在发送者所在的子网络。也就是说,假设两台计算机不在同一个子网络,广播是传只是去的。这样的设计是合理的。否则互联网上每一台计算机都会收到全部包,那会引起灾难。
互联网是无数子网络共同组成的一个巨型网络。非常像想象上海和洛杉矶的电脑会在同一个子网络,这差点儿是不可能的。
因此,必须找到一种方法。可以区分哪些MAC地址属于同一个子网络。哪些不是。假设是同一个子网络,就採用广播方式发送。否则就採用”路由”方式发送。
(”路由”的意思。就是指怎样向不同的子网络分发数据包。这是一个非常大的主题。本文不涉及。
)遗憾的是,MAC地址本身无法做到这一点。
它仅仅与厂商有关。与所处网络无关。
这就导致了”网络层”的诞生。它的作用是引进一套新的地址,使得我们可以区分不同的计算机是否属于同一个子网络。
这套地址就叫做”网络地址”,简称”网址”。
于是。”网络层”出现以后。每台计算机有了两种地址。一种是MAC地址,还有一种是网络地址。两种地址之间没有不论什么联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们仅仅是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络。MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上能够判断。必然是先处理网络地址。然后再处理MAC地址。
4.2 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地址。还有一个是确定哪些地址在同一个子网络。
4.3 IP数据包
依据IP协议发送的数据,就叫做IP数据包。不难想象。当中必然包含IP地址信息。
可是前面说过,以太网数据包仅仅包括MAC地址。并没有IP地址的栏位。
那么是否须要改动数据定义。再加入一个栏位呢?
回答是不须要。我们能够把IP数据包直接放进以太网数据包的”数据”部分。因此全然不用改动以太网的规格。
这就是互联网分层结构的优点:上层的变动全然不涉及下层的结构。
详细来说,IP数据包也分为”标头”和”数据”两个部分。
“标头”部分主要包含版本号、长度、IP地址等信息,”数据”部分则是IP数据包的详细内容。它放进以太网数据包后,以太网数据包就变成了以下这样。
IP数据包的”标头”部分的长度为20到60字节。整个数据包的总长度最大为65,535字节。因此,理论上。一个IP数据包的”数据”部分,最长为65,515字节。前面说过,以太网数据包的”数据”部分,最长仅仅有1500字节。因此,假设IP数据包超过了1500字节,它就须要切割成几个以太网数据包。分开发送了。
4.4 ARP协议
关于”网络层”。还有最后一点须要说明。
由于IP数据包是放在以太网数据包里发送的,所以我们必须同一时候知道两个地址,一个是对方的MAC地址,还有一个是对方的IP地址。
通常情况下。对方的IP地址是已知的(后文会解释),可是我们不知道它的MAC地址。
所以。我们须要一种机制。可以从IP地址得到MAC地址。
这里又能够分成两种情况。
第一种情况。假设两台主机不在同一个子网络,那么其实没有办法得到对方的MAC地址,仅仅能把数据包传送到两个子网络连接处的”网关”(gateway)。让网关去处理。
另外一种情况。假设两台主机在同一个子网络。那么我们能够用ARP协议,得到对方的MAC地址。
ARP协议也是发出一个数据包(包括在以太网数据包中),当中包括它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个”广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址。与自身的IP地址进行比較。
假设两者同样,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
总之,有了ARP协议之后,我们就能够得到同一个子网络内的主机MAC地址。能够把数据包发送到随意一台主机之上了。
五、传输层
5.1 传输层的由来
有了MAC地址和IP地址,我们已经能够在互联网上随意两台主机上建立通信。
接下来的问题是,同一台主机上有很多程序都须要用到网络。比方,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道。它是表示网页的内容。还是表示在线聊天的内容?
也就是说。我们还须要一个參数,表示这个数据包究竟供哪个程序(进程)使用。这个參数就叫做”port”(port),它事实上是每个使用网卡的程序的编号。每个数据包都发到主机的特定port。所以不同的程序就能取到自己所须要的数据。
“port”是0到65535之间的一个整数,正好16个二进制位。0到1023的port被系统占用。用户仅仅能选用大于1023的port。无论是浏览网页还是在线聊天。应用程序会随机选用一个port,然后与server的对应port联系。
“传输层”的功能,就是建立”port到port”的通信。
相比之下,”网络层”的功能是建立”主机到主机”的通信。仅仅要确定主机和port,我们就能实现程序之间的交流。
因此,Unix系统就把主机+port。叫做”套接字”(socket)。有了它,就能够进行网络应用程序开发了。
5.2 UDP协议
如今。我们必须在数据包中增加port信息,这就须要新的协议。最简单的实现叫做UDP协议,它的格式差点儿就是在数据前面。加上port号。
UDP数据包。也是由”标头”和”数据”两部分组成。
“标头”部分主要定义了发出port和接收port,”数据”部分就是详细的内容。然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包如今变成了以下这样:
UDP数据包很easy。”标头”部分一共仅仅有8个字节,总长度不超过65,535字节。正好放进一个IP数据包。
5.3 TCP协议
UDP协议的长处是比較简单,easy实现。可是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决问题,提高网络可靠性,TCP协议就诞生了。这个协议很复杂。但能够近似觉得,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。
假设有一个数据包遗失。就收不到确认,发出方就知道有必要重发这个数据包了。
因此,TCP协议可以确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样。都是内嵌在IP数据包的”数据”部分。
TCP数据包没有长度限制,理论上能够无限长,可是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度。以确保单个TCP数据包不必再切割。
六、应用层
应用程序收到”传输层”的数据,接下来就要进行解读。因为互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。
“应用层”的作用,就是规定应用程序的数据格式。
举例来说,TCP协议能够为各种各样的程序传递数据,比方Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
这是最高的一层。直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此,如今的以太网的数据包就变成以下这样。
至此,整个互联网的五层结构,自下而上所有讲完了。这是从系统的角度,解释互联网是怎样构成的。下一篇,我反过来,从用户的角度,自上而下看看这个结构是怎样发挥作用,完毕一次网络数据交换的。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115642.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...