网络协议入门(OSI七层和TCP/IC四层协议)
Android网络知识
Android作为一个移动端操作系统,是一定会涉及到网络知识的,会用不是我们的目标,深入了解其中的原理才是能让我们提升的根本。
1.关于网络传输
首先,在互联网中任何的数据传输都是基于协议传输的,而传输的协议有被分为七层,也有被分为四层,这两种分层都是常见的分层,那让我们来分别介绍一些互联网中的数据传输所需要涉及到的协议。
下方是一张总览,对于七层协议中所包含的部分进行详细的解释:
关于每层协议中所涉及到的东西,一会儿我们再来细细讲解,我们先来看一下七层协议和四层协议的对应关系:
我们通俗说的七层模型,其实就是国际标准组织ISO为网络传输协议指定的标准,也就是OSI七层网络模型,但是这层协议,已经被TCP/IP四层协议模型而淘汰,并没有大规模使用,而大家更加认可的就是TCP/IP四层概念模型,这个网络模型也是由多种协议组成的,其中最重要的协议是网络层的IP协议和传输层的TCP协议,于是整个网络模型的命名就使用这两个协议来命名,用来突出这两个协议的重要性。
在这里我们还是对OSI七层模型进行拆解,来解释每层模型所对应的功能,因为这样更能让大家深入理解网络传输的原理。我们讲解的时候,会进行从底到顶的讲解,先从最底层的数据传输来分析,最后到顶层的应用。
物理层
所谓物理层,就是电脑互相连接起来的物理手段,那物理手段有什么?那电脑连接起来的物理手段有:光缆、电缆、双绞线、无线电波等,那物理层就是规定了网络的一些电气特性,作用主要是负责传送0和1的电信号。
链接层
那我们根据物理层可以让两个电脑互相传递0和1,只能用来控制开和关,而想要执行更高级的操作,必须要对这些电信号进行解读,那如何解读电信号呢?最早的时候,各大公司都有自己的解读方式,渐渐地,一种叫做“以太网"的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫做“帧”,每一帧分为两个部分:Head(标头)和Data(数据),也就是这样:
其中,Head的长度,固定是18个字节(每个字节有8位),包含了发送者、接受者、数据类型等等信息。
Data的长度,最短是46字节,最长是1518个字节,包含了数据包的具体内容。如果数据过长,那必须分割为多个帧进行发送。
上面提到,Head包含了发送者和接受者,那是如何表示发送者和接受者的呢?
以太网规定,连入网络的所有设备,都必须具有"网卡"接口,也就是我们现在所说的Mac地址,而数据包的传递,需要是从一个Mac地址,发送到另一个Mac地址,每块网卡出厂的时候,都有一个世界上独一无二的Mac地址,长度是48个二进制,通常用12个16进制来表示。
示例:
其中,前六位是厂商编号,后6位是厂商的网卡流水号。
网络层
有了地址,仅仅是数据传输的第一步,那如何传输数据呢?
以太网采用一种很原始的方法传输数据,它并不是把数据直接发送给接收方,而是发送给本网络内所有的计算机,让每台计算机自己判断是不是接收方,这种方式叫做:广播。
这种方式有很大的弊端,如果只是依靠Mac地址发送数据,理论来说,北京的网卡都能找到迪拜的网卡了。
但是,这是不可行的,因为这种广播的方式不仅效率低,而且仅限于同一个网络内的电脑传输。因此,必须找到一个能够区分哪些Mac地址属于一个子网络的方法,如果是一个子网络,就通过广播发送,如果不是,就通过“路由“发送。(路由暂时不做讲解)
仅仅依靠Mac地址,是无法做到这一点的,因为它只跟上产的厂商有关系,而跟所处的网络无关。
而规定网络的协议,叫做IP协议,这个协议所定义的地址,也就叫做IP地址。IP协议也正是网络层的核心。
目前,使用最广泛的是IPV4协议,也就是IP协议第4版。这个版本规定,网络地址由32个2进制组成,但是我们习惯使用4段十进制来表示IP地址,从0,0,0,0到255,255,255,255。
IPV4协议分为两部分,前一部分代表网络,后一部分代表主机。但是一个IPV4的网络部分是前8位,还是前24位,还是前32位,我们但看是看不出来的。
那如何判断两个IP是在同一子网络呢?这时可以通过“子码掩码”来判断。
“子码掩码”和IPV4的样式一样,假设IPV4地址是:"192.168.66.77",如果网络地址是192.168,主机地址是66.77,那么子码掩码就是“255,255,0,0",而如果网络地址是192.168.66,主机地址是77,那么子码掩码就是“255,255,255,0”。
如何判断两个IP地址是不是同一网络内就是使用两个IP地址和两个子码掩码进行AND运算,如果网络部分一样,主机部分都是0就表示是一个子网络。
和“以太网”传输用的帧一样,IP数据包也分为Head和Data两部分,其中Head主要包含版本、长度、IP地址等信息,Data部分包含IP数据包的具体内容,如下图所示:
IP数据包Head部分长度为20到60个字节,整个数据包总长度最大字节是65535字节,所以一个IP数据包可能被打包为多个以太网数据包发送。那如果IP数据包放入以太网数据包就是下图所示的样式:
而我们这时知道,如果发送一个IP数据包,需要知道对方的IP和Mac地址,IP地址都是已知的,而我们可以通过ARP协议获取要发送的地址的Mac地址。
ARP协议全称是:Address Resolution Protocol,也就是地址解析协议。
ARP协议也是发送一个数据包(包含在以太网数据包中),其中包含要查询Mac地址的主机的IP地址,在对方Mac地址一栏,填写“FF:FF:FF:FF:FF:FF”,表示这是一个"广播"地址,这个IP地址所在子网络中的每一台主机都会收到这个数据包,从中取出IP地址,和自身的IP地址进行比较,如果相同,则会发送自己的Mac地址,否则,自动丢弃这个包。
传输层
我们该开始传输层的内容了,有了网络层,我们已经可以在互联网上任意两台主机之间建立通信了。
但是,一台主机可能同时和多台主机交互,当一个数据包从互联网上发送过来的时候,你如何判断它是哪台主机发送过来的内容呢?
这时候我们就涉及到了“端口(port)",它其实是每一个使用网卡的程序的编号,来自不同程序的数据包都能发送到主机的特定端口,这样我们就能判断哪个数据包是从哪个程序发送过来的了。
"端口"介于0—65535之间,其中0到1023的端口被系统占用,用户只能使用大于1023的端口,一般你使用的网络程序会默认选择一个空闲的端口和你的主机进行通信。
而传输层其实就是建立与端口对端口的通信,而网络层就是主机对主机的通信。
既然是根据端口发送数据,那我们就得在数据包中加入端口的信息,这就需要我们使用新的协议,也就是传输层协议。
最简单的传输层协议是UDP协议,它的格式基本就是在数据前面加上端口,也是由Head和Data组成的,其中Head部分定义了发出的端口和对方接收的端口,也长这样:
那把UDP数据包放到IP数据包中再放到以太网数据包中就是以下的样子:
UDP数据包Head部分共8个字节,Data部分最大为65535字节,正好可以放到一个IP包里。
而比UDP协议更加出名的是TCP协议,因为UDP协议比较简单,但是缺点是数据包发出后,不知道对方是否收到。为了提高网络安全性,TCP协议出现了,它的缺点是过程复杂、实现困难、消耗资源较多。TCP协议对应的数据包和UDP结构一样,但是TCP数据包没有长度限制,理论可以无限长,为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以保证单个TCP数据包不必再分割。
在TCP四层模型中,将会话层、表示层、应用层,统看成应用层,因为这层主要就是一些高级协议,基于底下几层进行不同形式的数据传递。而这几层的数据都会放到TCP/UDP协议包里,通常放完就成了这样:
会话层
会话层对应的协议主要是SSL(加密发送的数据)、SMTP(发送接收邮件)和DNS协议。
而DNS协议我们需要重点介绍一下:
假设我们访问Baidu,我们并不知道它的IP地址,我们只是在地址栏输入了www.baidu.com,就进入了百度的主界面,而系统如何通过域名来找到网站的DNS地址呢?
DNS,全称为Domain Name System,也就是域名系统,它会帮我们把网址转换为IP地址,而具体方式是,发送这个域名到你设置的DNS服务器,现在各大公司都有自己的DNS服务器地址。
这时我们就知道了百度的IP地址是:180.149.132.151
表示层和应用层我们在此先不做介绍,后面使用中会慢慢用到。
声明:本文大部分摘自阮一峰老师的博客,建议大家还是去看一下阮老师写的,比较详细,地址:http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html