互联网的本质就是一系列的网络协议,最早由ISO国际组织定义为7层网络参考模型,后面应用于不同的场合,依据功能又划分出4层和5层的tcp/ip模型,其实功能都一样
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
物理层功能:主要是基于 硬件的物理特性 发送高低电压(电信号),高电压对应数字1,低电压对应数字0,物理特性包含电信号(电缆)、光信号(光缆)、无线电波(射频设备)等。
无论中间通过什么传输,最终在接收端都转化成电信号,也就是0101这样的高低电平,这时接收到的数据就是一堆无意义的数字,因此要在发送和接收的双方都约定好,每N位数字代表什么含义,如表示数据头,还是数据格式,还是数据内容等。这种约定就称为协议,与物理层最接近的就是数据链路层,使用以太网协议Ethernet。
数据链路层就是对电信号进行分组,并且规定数据的含义的。
Ethernet规定每一数据帧,最短为64字节(一个字节8位数字),最长1518个字节,超过最长限制就分片发送。
每一数据帧由两部分组成:head头和data数据。
head包含(18个字节):
data包含(48~1500字节):
mac地址的由来:
接入Internet的设备都必须具备网卡,发送端的和接收端的地址便是指网卡的唯一物理地址,即Mac地址。
每块网卡出厂时都被烧录上一个实际上唯一的Mac地址,长度为48位2进制,通常由12位16进制数表示,(前六位是厂商编码,后六位是流水线号)。
局域网内基于以太网协议的通信方式:
Ethernet以太网协议是基于udp的,也即广播的方式进行通信,同一子网下的2台设备A、B进行通信,A会以广播的方式发送上面约定的头和数据内容组合而成数据包到同一子网下的所有设备,然后每个设备接收和解析数据,如果发现头里的接收方的mac地址和自己不符合则丢弃数据,如果发现mac一样,则响应数据。
理论上通过,mac地址+广播的方式,就可以连接世界上的任意两台电脑了,但是这样只要一台电脑发了数据,世界上所有的电脑都要接收和解析一遍数据,这明显是不合理的。因此,为了减少无意义的广播,网络层引入了ip的概念,ip协议有ipv4和ipv6,ipv4的ip地址只有32位,而v6则有128位,这是因为全球每个局域网对外的公网ip都是唯一的,而上网人数如此庞大,32位是不够的,后面则把32位升级到了128位,但是两个协议是无法互通的。
ip协议规定,网络层的数据格式也是由ip包头和ip数据两部分组成:
IP头包含:
data包含:
同一子网下的ip数据传输:
现在就有一个问题,我们在A、B两台设备间发送数据都是通过ip来发送的,即使在浏览器输入域名,最终也是通过DNS服务器解析成目标设备的ip地址的,在发送端,我们有办法知道双方的ip地址和发送方的mac地址,那怎么知道以太网协议包头所需要的目标MAC地址呢,这就要说到网络层的ARP协议了,它提供了从ip向mac地址的映射方法。
假设A要向B发数据,可以轻易获取到A的mac地址和ip地址,也知道B的ip地址,但是不知道B的mac地址,此时,A就把mac地址内容填为12个F,12个F表示这一帧数据为ARP数据包,如下:
此时广播出去,同一网段下的所有机器都接收到了,由于包含了B的ip地址,因此不是这个ip的设备都舍弃了数据包,只有B接收了数据,然后B解析数据,发现它的mac地址为全F,好家伙,这不是我的mac地址,于是,它就知道这是一帧ARP数据包,因此,它就给A响应自己的mac地址,响应数据如下:
注意这时mac地址和ip地址都是反过来的,因为是B发给A的,局域网同一网段下的A接收到数据后,就知道B的mac地址了。
以上是针对同子网下的数据传输。如果是不同网段的ip,会略有不同。
我们先看下什么是同一子网和不同子网:
两个ip地址:192.168.0.5、192.168.0.6,知道这2个ip地址并不能确定他们是不是属于同属于同一子网下的,还要通过另一个属性子网掩码,假如这2个ip的子网掩码都是255.255.255.0,转化成二进制就是11111111.11111111.11111111.00000000,为32位。而ip地址刚好也是32位的,如果将ip地址和子网掩码相与,结果是一样的,则表示这2个ip是同一子网下的,他们发送数据只需要直接广播就行了。
192.168.0.5 》11000000.10101000.00000000.00000101
255.255.255.0 》11111111.11111111.11111111.00000000
两者相与为 192.168.0.0,同理将192.168.0.6和255.255.255.0相与也是192.168.0.0。于是计算机就会认为他们是同一子网下的,就会直接广播数据帧。
但如果子网掩码为255.255.255.255,那么上面2个ip和子网掩码相与就会是他们各自本身,不相等则计算机会认为他们不是同个子网的。于是就涉及到不同子网间的ip的网络通信。
不同子网下的ip数据传输:
当涉及到不同子网的传输时,就要借助网关来进行转发。
A仍然向B发送数据,此时A通过运算发现B的ip不在同一个子网下,于是,A会把目标ip改成它的网关ip(一般网关ip都是配死在A的),如果此时A并不知道网关的mac则会先发送ARP数据帧给网关来获取网关的mac地址,ARP数据帧如下:
网关和A一定是一个子网的,当网关收到这帧数据后,发现mac为全F,目标ip为它自己,则响应自己的mac地址给A,A拿到网关的mac后,就开始给B发送数据了,此时数据帧如下:
当网关收到这则数据,数据链路层解析以太网头,发现目标mac是自身,但是ip地址不是自己,那么它就不会继续解析,它会依据配置规则,将数据传给下一跳的设备,直至路由器发到外网,路由器会根据路由协议(如RIP、OSPF等)将数据传送至B的网关处,这中间变化的只有以太网头的目标mac,而ip头的ip地址(A、B的ip)都是不变的,这样保证了接收到的中间设备知道数据是需要它转发的,B的网关接收到数据后再依据以太网协议进行广播通知到属于它子网的B。
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,
那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口,注意端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的
传输层使用的协议有:tcp、udp
tcp是可靠传输,在进行通信前,会进行三次握手,断开连接前,会进行四次挥手。
图片来源网络
应用层则是组织统一各种类型应用数据的,如发送文本图片的http超文本协议、发送邮件的SMTP、POP3等
我们通常说的http协议是基于tcp的,也是因为http是建立在应用层的协议,其依赖的是传输层的tcp协议,要经过tcp协议的封装。
图片来源网络