互联网分层那些事
互联网分层那些事
对于互联网分层,偶尔也能说出其中的几层的名称,但是从来没有完整的了解过。7层?5层?4层?头都大了…
更加甭谈每层的作用了.
从何学起呢,怎么才能最快切入,理解呢?
博客,我想这是最快的方式了吧,站在别人的肩膀上,借鉴大牛的视野.
找到了阮一峰的博客,有两篇文章讲分层,通俗易懂,嗯,从这里开始吧.
附上文章原文链接:
1.互联网协议入门一
2.互联网协议入门二
先看图:


就层数来讲,你说它分为7层也好,5层也好,或者4层也好,都可以,只不过是从宏观上进行归类的不同,归根结底具体的东西还是那些,该有的也没少.
接下来就5层来说说每层的作用.
一.实体层
描述:把电脑连接起来的物理手段.可以是光缆、电缆、双绞线、无线电波…
作用:负责传送0和1的电信号(利用传输介质为数据链路层提供物理连接,实现比特流的传输)
二.数据链路层
描述:建立和管理物理节点间的链路,规定电信号的解读方式
作用:单纯的0和1是没有意义的,必有规定解读方式,数据链路层就是通过各种控制协议把物理信道变为无差错的、能可靠传输数据帧的数据链路.
2.1以太网协议
最开始的时候,电信号的分组方式是一家一个样,分久必合,统一才是大势所趋,”以太网”(Ethernet)协议逐渐占据主导地位.
以太网规定,一组电信号构成一个数据包,叫做”帧”(Frame)。每一帧分为两个部分:标头(Head)和数据(Data).

<标头>包含数据包的一些说明信息,比如发送者、接收者、数据类型等;<标头>长度是18个字节.
<数据>包含数据包的具体内容;<数据>长度,最短46字节,最长1500字节.
因此整个数据包(帧)的长度为64~1518字节.如果数据过长,就必须分割成多个帧发送.
2.2MAC地址
以太网的”标头”包含了发送者和接收者的信息,发送者和接收者如何标识呢?
以太网规定,连入网络的所有设备,都必须具有”网卡”接口. 数据包必须是从一块网卡,传送到另一块网卡.
网卡的地址就是数据包的发送地址和接收地址,称作MAC地址.
网卡图片
每块网卡出厂的时候电气电子工程师协会(IEEE)负责为网卡分配 一个全世界独一无二的MAC地址,长度是48位二进制,通常用12个十六进制数表示.

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号.有了MAC地址,就可以定位网卡和数据库的路径了.
2.3广播
定义地址是第一步.
那么一块网卡怎么会知道另一块网卡的MAC地址呢?
方法是ARP协议.
ARP(Address Resolution Protocol)即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议.
有了MAC地址之后,系统怎么才能把数据包准确送到接收方呢?
方法很原始,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,要不要由每台计算机自己判断.
上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会受到这个数据包。它们读取数据包的<标头>,找到目标计算机的MAC地址,然后和自身的MAC地址比较,如果两者相同,就接收这个数据包,作进一步处理,否则就丢弃这个数据包.这种发送方式叫做”广播” braodcasting
三.网络层
3.1网络层的由来
以太网协议,依靠MAC地址发送数据,理论上,单单依靠MAC地址,上海的网卡就可以找到洛杉矶的网卡了,技术上是可以实现的.
但是,这样做有一个重大的缺点.以太网采用广播方式发送数据包,所有成员人手一个数据包,不仅效率低,而且局限在发送者所在的子网络.也就是说,如果两台计算机不在同一个子网络,广播是穿不过去的.这种设计是合理的,否则互联网上每台计算机都会收到所有包,那会引起灾难.
互联网是无数子网络共同组成的一个矩形网络,很难想象上海和洛杉矶的电脑会在同一个子网络,这几乎是不可能的.

因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是.如果是同一个子网络就采用广播方式发送,否则就采用”路由”(如何向不同的子网络分发数据包)方式发送,MAC地址本身无法做到这一点.
这就导致了”网络层”的诞生.它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络.这套地址就叫做”网络地址”,简称”网址”.
“网络层”出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址.两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,他们只是随机组合在一起.
网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包宋傲该子网络中的目标网卡.
因此,从逻辑上可以推断,必定是先处理网络地址,再处理MAC地址。
3.2IP协议
根据IP协议发送的数据,就叫做IP数据包。
前面说过,以太网数据包只包含MAC地址,并没有IP地址的栏位.那么是否修改数据定义,在添加一个栏位呢?
不 需 要,我们可以把IP数据包直接放进以太网数据包的”数据”部分,因此完全不用修改以太网的规格.这也是互联网分层结构的好处:上层的变动完全不涉及下层的结构.
具体来说,IP数据包也分为”标头”和”数据”两个部分.

“标头”部分主要包括版本、长度、IP地址等信息,”数据”部分则是IP数据包的具体内容.它放进以太网数据包后,以太网数据包就变成了下面这样.

IP数据包的”标头”部分的长度为20到60字节,整个数据包的总长度最大为65535字节.因此,理论上,一个IP数据包的”数据”部分,最长为65515字节.前面说过,以太网数据包的”数据”部分,最长只有1500字节.因此,如果IP数据包超过了1500字节,他就需要分割成几个以太网数据包,分开发送了.
3.3ARP协议
关于网络层,还有最后一点需要说明.
因为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地址.可以把数据包发送到任意一台主机上了.
四.传输层
4.1传输层的由来
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信.
接下来的问题是,同一台主机上有很多程序都需要用到网络,比如,一边上网一边聊天,当一个数据包从互联网上发来的时候,你怎么知道它是表示网页的内容,还是聊天的内容?
也就是说,我们还需要一个参数,表示这个数据包到底哪个程序(进程)使用.这个参数就叫”端口”Port,它其实是每一个使用网卡的程序的编号,每个数据包都发送的主机特定的端口,所以不通的程序就能取到自己所需要的数据.
“端口”是0到65535之间的一个整数,正好是16个二进制数,0到1023端口被系统占用,用户只能选用大于1023的端口.不管是浏览网页还是聊天,应用程序会随机选中一个端口,然后与服务器的相应㐰联系.
*”传输层”的功能,就是建立 “端口到端口”的通信.相比之下,网络层的功能是建立”主机到主机”的通信.只要确定主机和端口,我们就能实现程序之间的交流.因此,Unix系统就把主机+端口,叫做”套接字”(socket).有了它,就可以进行网络应用程序开发了.*
4.2UDP协议
现在,我们必须在数据包中加入端口信息,这就需要新的协议.最简单的实现叫做UDP协议,它的格式几乎就是在数据面前,加上端口号.
UDP数据包,也是有”标头”和”数据”两部分组成.

“标头”部分主要定义了发出端口和接收端口,”数据”部分就是具体内容.然后把整个UDP数据包放入IP数据包的数据部分,前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

UDP数据包非常简单,”标头”部分一共8个字节,总长度不超过65535,正好放进一个IP数据包.
4.3TCP协议
UDP协议的有点事比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到.
为了解决这个问题,提高网络可靠性,TCP协议就诞生了.这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认.如果有一个数据包遗失,就说不到确认,发出方就知道有必要重发这个数据包了.
因此,TCP协议能够确保数据不会遗失,它的缺点就是过程复杂、实现困难、消耗较多的资源.
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分,TCP数据包没有长度限制,理论上可以无限长,但是为了保障网络的效率,通常TCP数据包的长度部分超过IP数据包的长度,以确保单个TCP数据包不必在分割.
五.应用层
应用程序收到”传输层”的数据,接下来就要进行解读,由于互联网是开发架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读.
*”应用层”的作用,就是规定应用程序的数据格式.*
举例来说,TCP协议可以玩为各种各样的程序传递数据.比如Email、WWW、FTP等等.那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”.
这是最高的一层,直接面对用户.它的数据就放在TCP数据包的”数据”部分.因此,现在的以太网的数据包就变成下面这样.

