概述
本文针对校招同学,针对计算机网络面试环节可能会提到的问题系统并简洁地聊一下OSI七层模型与互联网协议。
OSI七层模型
OSI把互联网分成了七层:
- application(应用层)
- presentation(表现层)
- session(会话层)
- transport(传输层)
- network(网络层)
- data link(数据链路层)
- physical(物理层)
越往上走,越接近用户,越往下走,越接近硬件。有了层级的概念,可以使各层之间的功能相互独立,保证各个层级的网络协议各司其职;而且保证了较高的灵活性,若某一层发生了变化,只要其接口关系不变,则这层的上下层都不受影响。由于功能的不同,人们常常把应用,表现和会话称为上三层,而剩下的层叫做下四层,这篇文章主要介绍下四层。用户接触到的,只是最上面的应用层。但是想要理解电脑之间到底是如何通信的,需要从最下面一层开始,自下而上进行理解。
层与协议
每一层都为了完成一种功能。
而为了实现功能,需要大家遵守共同的规则, 这些规则就是协议,也就是我们熟知的以太网协议,ip协议,TCP、UDP协议等。这些协议是互联网的核心。下面,让我们分别来看每一层的主要协议:
下四层
Physical Layer
把两台电脑连接起来,需要做什么呢?
首先我们需要用以太网线把电脑连接起来,配一个局域网的ip,然后关闭防火墙,这样两台电脑就可以进行通讯了。
这也就是所谓的物理层,这一层包括我们在网络中能看到的东西(一根网线,一个端口,他们的标准或者传输功能都是通过物理层相关协议做规范的)。它规定了网络的电气特征,作用是负责传送0和1的电信号。
Data Link Layer
物理层的作用是传输0和1的电信号,但是单纯的0和1是没有意义的,得知道多少个信号算一组,一组电信号有什么意义才可以。 Data Link Layer数据链接层就解决了这个问题,它确定了0和1信号的分组方式。
此时会出现一个问题,分组方式如果各个公司不统一,那解析起来非常麻烦。早期搞网络的人显然意识到了这个问题,于是以太网(Ethernet)协议慢慢占据了主导地位,为0和1信号统一进行分组。
以太网协议规定,一组电信号组成一个名为为帧(Frame)的数据包。每一个帧分成两部分:头部(Head)和数据(data).
下面来看一下以太网头部的结构:
xxx
- MAC地址
以太网数据包的头部中,包含了source 和Destination 的信息。这些信息其实就是MAC地址。
以太网规定,连入网络的所有设备,都必须有网卡接口。数据包从一块网卡,传送到另一块网卡。而网卡的地址,就是数据包的发送地址和接受地址,也就是MAC地址。
每块网卡出厂的时候,都会被分配一个独一无二的MAC地址。MAC地址的长度是48bits,通常用12个16进制的数字表示,如下图所示。
ether 4a:00:04:42:93:c0
MAC地址的前6个数是厂商编号,后6位是厂商分配的数字,有了MAC地址,就可以定位网卡和数据包的路径了。
- 广播
那么,现在又有一个新的问题,两台电脑通信过程中,一块网卡是如何知道另一块网卡的地址的呢?
答案是通过ARP协议,ARP协议可以通过ip地址询问另一台机器的MAC地址,这个我们后面详细进行介绍,现在需要清楚:以太网数据包必须知道对方的MAC地址,才能发送数据。
那么,有了MAC地址后,系统如何才能把数据包准确发送给接收方呢?
实际上,以太网并不能准确发送给接受方,它会向本网络内所有计算机进行发送,让接收方计算机自己判断是否为接收方。
比如说,一个局域网内,有3台计算机,现在1号计算机要给2号计算机发送一个数据包,于是进行发送。这个局域网中2号3号计算机都会收到这个包。它们去读取这个数据包的头部信息,找到接收方的MAC地址,如果和自身的MAC地址相同,就接受数据包,进行处理,否者就丢掉这个包。 这种发送方式就是广播。
有了数据包本身(要发送的数据),MAC地址(发送的地址),广播等的发送方式(发送方式),数据链路层就可以在多台计算机之间进行通信了。
Network Layer
以太网协议仅仅依靠MAC地址来发送数据。理论上,单单依靠MAC地址,两台电脑就可以实现通信了,但是这样做有一个缺点。以太网用广播的方式发送数据包,所有的成员都收到数据包。不仅仅效率低,而且局限于发送者所在的子网络(局域网)。也就是说,如果两台电脑在不同的局域网内,广播的方式是传不过去的。这个也很好理解,因为如果让世界上每台计算机都收到数据包,显然不现实。
互联网是无数子网络(局域网)组成的一个巨型网络,同一个局域网内的电脑才能用广播的方式发送数据。否则就得用路由的方式发送数据(路由就是指 不同的子网络如何发送数据包)。但是仅仅凭借MAC地址,是无法做到这一点的。
所以导致了网络层的诞生。网络层引入了一套新的地址,让我们能够去人不同的计算机是否属于同一个子网络,这样的地址称为网络地址,简称‘网址’。
于是,当网络层出现后,计算机设备有两种地址:MAC地址和网络地址。MAC地址是绑定在网卡上的,而网络地址是通信公司分配的。网络地址确定计算机所在的子网络,MAC地址将数据包传送到子网络的目标网卡。所以,必先是处理网络地址,然后处理MAC地址。
- IP协议
那么,规定网络地址格式的协议,就是所谓的IP协议。
我们目前最长使用的IP协议是第四版,简称IPv4。这个版本规定,网络地址有32bits,由4组10进制数组成。如下图:
inet 172.22.31.233
互联网的每台计算机都会被分配一个IP地址。这个地址可以分成两部门:第一部分是网络位,第二部分是主机位。如172.22.31.233,如果它的前24位是网络位(172.22.31),那主机位就是(233)。处于同一个子网络的电脑的IP地址的网络部分是相同的。也就是说:172.22.31.230和172.22.31.233处于同一个子网络。
如果读者仔细阅读上面一段话,就会发现有一句话有问题:如果它的前24位是网络位(172.22.31),仅仅只知道IP地址,我们无法判断它的网络部分和主机部分。此时还需要另一种地址:子网掩码(subnet mask)。
子网掩码是用来表示网络位的一种地址。它和IP地址的形式相同,也是一个32位的二进制数字。它的网络位全部为1,主机部分全部为0,拿上面的地址举例:若172.22.31.233的网络位是24位,那它的子网掩码就是11111111.11111111.11111111.00000000。写成10进制就是255.255.255.0。
通过子网掩码我们就能判断两个IP地址是否在同一个子网络中了,分别对比两个IP地址的子网掩码和IP地址的网络部分,如果比较结果相同,就在同一个子网络中,否则就不在。
所以说:IP协议的作用主要就是:为每一台需要上网的计算机分配IP地址;确定哪些地址在同一个子网络中。
- IP数据包格式
根据IP协议发送的数据,叫做IP数据包。
前面说过,以太网数据只包含MAC地址的信息,并没有IP地址的栏位。那么我们要如何把IP地址写入数据包呢?是否需要修改以太网协议来添加IP地址呢?
答案是不需要,这也就是网络分层的好处:上层的改动不涉及到下层的结构。我们可以直接把IP数据包放入以太网数据包的数据部分。
具体来说:IP数据包分为IP头部和数据两部分。
下面来看看头部包含哪些信息:
IPv4的头部信息:
xxx。
IP数据包的头部长度是20~60字节。整个数据包的总长度最大为65535字节。所以,一个IP数据包的数据部分最长就是65515字节,但是以太网数据包的数据部分最长只有1500字节。所以如果IP数据包超过了1500字节,就得分割成若干个以太网数据包进行发送了。
- ARP协议
IP数据包是放在以太网数据包里进行发送的,要发送我们需要知道两个地址:MAC地址和IP地址。通常IP地址是已知的,但是MAC地址是位置的。
所以,我们需要一种机制,可以通过IP地址获取到MAC地址。
获取MAC地址又可以分成两种情况:
- 两台电脑在同一个局域网内:这种情况下无法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的网关(gateway),让网关去处理。
- 两台电脑在一个子网络内:这种情况会使用ARP协议获取对方的MAC地址。ARP作用原理是: 发送一个数据包(在以太网数据包内),其中包含着他要查找主机IP地址,在对方的MAC地址处,填入FF:FF:FF:FF:FF:FF,表示这是一个广播地址。它所在子网络的每一台主机都会收到这个数据包,然后每台电脑都取出包中的IP地址与自己的IP地址进行比较。如果二者相同,做出相应,向对方发送自己的MAC地址,否则丢弃这个包。
Transport Layer
经过前面那几层,我们已经可以通过互联网在两台机器间进行通信了。但是接下来我们又遇到了一个问题,我们的计算机会有很多应用都用到网络。比如,我们可以一边玩王者荣耀,一边接微信电话,那计算机是如何知道哪些数据包是王者荣耀的,哪些数据包是微信的呢?
显然,除了IP地址,我们还需要一个参数来表示数据包是属于哪个应用的(进程)。这个参数就是端口号(port)。它其实是每一个使用网卡的程序的编号。对于每一个使用网络的程序,网卡都会给其一个编号。每个数据包发送到主机的特定端口,不同的程序就能取到自己所需要的数据了。
端口号是0~65535之间的一个整数。其中0~1023端口被系统占用。用户只能选用大于1023的端口。不管是玩王者荣耀还是聊微信,应用都会选择一个端口,然后与对应的服务器的端口进行联系。
而传输层(transport layer)的主要功能,就是建立端口到端口间的通信。(网络层是建立主机到主机的通信)。只要确定了主机和端口,我们就可以实现程序间的交流。因此,Unix系统把主机+端口叫做套接字(socket)。有了它,就可以进行网络应用程序开发了。
如果我们想在数据包中加入端口信息,就需要新的协议了,传输层有两种协议:TCP协议和UDP协议。
-
UDP协议
UDP数据格式由 头部 和 数据两部分构成。
头部信息:
像上面一样,UDP数据包会放入IP数据包内成为IP数据包的数据部分。
UDP协议的非常简单,容易实现,但是它的缺点也很明显,它的可靠性较差,数据包发出后,无法得知对方计算机是否收到了数据。 -
TCP协议
为了解决UDP协议的问题,TCP协议诞生了,TCP协议很复杂,也有头部和数据两部分组成。TCP协议要求每发出一个数据包都要求对方确认。如果有数据包丢失,就重新发送整个数据包。这其中就有著名的TCP连接的三次握手和四次挥手。
TCP的优点是能确保数据不丢失。它的数据包长度没有限制,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,这样来确保单个TCP数据包不会被拆分。
下面来看看TCP协议的头部部分,著名的三次握手和四次挥手。
xxx
上三层统一叙述
上三层的程序收到来自传输层的数据后,会进行解读。由于互联网的开放架构,数据来源很多,必须得事先规定好格式,否则就无法解读数据。
而上三层的作用主要就是规定应用的数据格式。
比如:TCP协议可以为各种应用传递数据,比如WWW,FTP等。那么,必须有协议规定这些数据的格式,这些协议就构成了上三层。
比如HTTP协议。
网友评论