网络分层(OSI七层,TCP/IP协议族)

在复杂的网络环境中数据传输可能遇到种种问题,通过网络分层来细化和解决相应的问题.在网络协议中的分层。不仅仅是根据负责的功能来简单的划分层次,而且层与层之间会有不可缺少的的封装与传递。对于网络模型各层的封装是根据整个网络模型从上到下的工作流程来划分的。但是,每层之间会有一定的联系,不是独立工作的。

现今主要有两种分层模型

OSI七层模型

常见协议与硬件

TCP/IP

应用层

DNS HTTP SSH SMTP FTP

应用层

表示层

DNS HTTP SSH SMTP FTP

应用层

会话层

DNS HTTP SSH SMTP FTP

应用层

传输层

TCP UDP SCTP

传输层

网络层

IPV4 IPV6 ARP ICMP

网络层

数据链路层

以太网,无线LAN

数据链路层

物理层

双绞线电缆 光纤 无线设备

物理层


物理层

可以使用双绞线电缆,光纤,无线设备连接网络设备进行组网,物理层主要规定电信号0和1


数据链路层

数据链路层主要是对0和1的电信号进行分组以获取信息.

1.以太网协议(Ethernet)

以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。
"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;"数据"则是数据包的具体内容。

"标头"的长度,固定为18字节。"数据"的长度,最短为46字节,最长为1500字节。因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

数据链路层的数据包:

2.MAC地址

以太网协议中的标头带有数据的接收方和发送方,即MAC地址.

以太网规定连入网络的所有设备都必须要有网卡,数据包必须是从一个网卡到另一个网卡.MAC地址就是这些网卡的地址.

MAC地址由48个二进制构成,常表示为12为十六进制,有了MAC地址就有了数据包的传输路径和定位网卡的方法.

3.广播

数据层如何在网络中找到要发送的网卡呢?

实际上是通过给整个子网所有的网卡设备发送数据包,收到数据包的设备自行判断接收方MAC地址是否是自己,不是则丢弃.

有了以太网协议、MAC地址、广播,数据链路层就可以实现子网内数据包的传输了,对于不同子网可以使用网关来转发(路由协议使用路由表实现)


网络层

MAC地址加上广播理论上可以实现数据的传输,可惜世界上的网络设备太多,这么多的机器无法处在一个子网中.实际上,互联网是有众多子网构成的,不同的子网之间无法通过广播的方式传输,只能通过路由来实现传输.而且广播的方式产生了大量的无用数据包.而对子网进行划分是MAC地址无法做到的.

网络层应运而生,用来将网络设备划分到对应子网中.这样也就有了网络地址的概念
网络层的工作就是通过网络地址找到目标的子网,再通过MAC地址找到子网中的目标网关

1.IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。

目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成。

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
这个ip地址分为两段,前一部分表示网络部分,后一部分表示主机部分.在同一子网中的ip地址的网络部分肯定是一样的.

而判断两台计算机是否处与同一网络这个是无法从ip地址上看出来的.于是子网掩码就出来了.

子网掩码也是32位的二进制组成,它的网络部分全为1主机部分全为0.

通过比较不同ip与其子网掩码的与运算的结果可以确定不同ip是否处于同一子网中

例如:  
ip1:13.2.68.11 子网掩码:255.255.255.0  
ip2:13.2.68.24 子网掩码:255.255.255.0  
与运算结果:  
结果1:13.2.68.0  
结果2:13.2.68.0  
两个结果一致,所以两个ip位于同一子网中

IP协议主要用来分配ip地址,同时规定哪些ip在同一子网中

2.IP数据包

IP数据包将直接放进以太网数据包的"数据"部分,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。
IP数据包也分为"标头"和"数据"两个部分。
"标头"部分主要包括版本、长度、IP地址等信息,"数据"部分则是IP数据包的具体内容。它放进以太网数据包后,以太网数据包就变成了下面这样。

IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度最大为65535字节。因此,理论上,一个IP数据包的"数据"部分,最长为65515字节。前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。(ip分片)

3.ARP协议

因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(可用DNS解析出域名对应ip),但是我们不知道它的MAC地址。 所以,我们需要一种机制,能够从IP地址得到MAC地址。

这里又可以分成两种情况。第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。

第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。


传输层

有了网络层之后,可以实现主机到主机的通讯了,但一台主机可能同时接受到来自各个主机的各个应用程序的数据包.为了确认哪些数据包是给哪个程序,端口就产生了,端口实际上是使用网卡的程序的编号,每个数据包都发送到主机的特定端口上,这样就可以实现程序之间的通信了.

传输层的工作主要是实现端口到端口之间的通信,有了主机地址和端口就可以实现程序之间的通信了.

UDP协议

网路层实现的是端口到端口的通讯,传输层最简单就是UDP协议.
UDP协议也由标头和数据构成,UDP协议的标头记录发送端口和接收端口.UDP的数据包会放在ip数据包的数据部分中,UDP的数据包非常简单标头只有8字节.加上UDP数据包之后的数据包如下:

UDP协议可以称为永不复合的协议,UDP的实现简单,但无法知道接收方是否收到,是不可靠的协议

TCP协议

由于UDP的不可靠,TCP这种面向连接的可靠传输协议诞生了.
TCP协议非常复杂,可以把TCP理解为点对点的带有确认机制的UDP协议,每个发出的数据包都要求确认,未收到确认将重发未确认的部分,TCP可以保证数据不会遗失.由于确认机制的存在,TCP要比UDP复杂得多.TCP的数据包和UDP一样也是由标头和数据构成,并组到ip数据包的数据部分,理论上TCP的数据包可以很长,当由于ip数据包的长度限制.通常尽量使TCP的数据包不超过ip数据包的数据部分,以防止ip分片


应用层

应用层协议用来规定应用程序之间通讯的数据包的解析方式.TCP可以为网页,EMAIL,FTP提供数据传输支持,如何规范这些数据包的格式就是应用层协议的作用.

应用层协议使用来规范应用程序之间如何通讯的

应用层的数据将直接放到TCP的数据包的数据部分.

最后完整的数据包如下:


HTTP通讯过程


  • 根据浏览器输入的域名www.bing.com(主机名)查询本地(浏览器,host文件,路由器)有无DNS缓存信息,没有缓存将调用DNS协议(详细原理及过程见DNS协议原理)向DNS服务器查询ip.
  • 根据DNS返回的结果获得ip之后, 浏览器与服务器建立TCP连接(详细原理及过程见TCP协议原理)
  • 建立好TCP连接之后,将组装好http报文发起HTTP请求来获取index.html页面
  • 客户端接收到http响应,回复确认.四次挥手断开连接(可以不断开).
  • 浏览器解析获取到的html,解析出还需要的资源,如果是静态资源则继续请求资源.如果服务器返回304(服务器未修改资源),浏览器就会读取本地缓存
  • 浏览器渲染相应页面信息