TCP/IP协议族可按层次划分为四层,从上层到底层为:应用层,传输层,网络层, 数据链路层。知道了TCP/IP协议是进行分层设计的,很多好奇心强的同学肯定会又疑惑,为什么要分层进行设计,为什么又是按照这四个层级进行划分。
假设整个协议都是一个整体,没有进行层次化的设计,那么如果协议需要进行调整的时候,那就需要对整个协议进行修改。但是,进行分层解耦之后,每一层的内容相对独立,互不影响。需要进行变更的时候就只需要针对某一层的协议内容进行做变动,不会影响到其他几层的内容。其实和开发过程中的模块封装解耦一样。
有的同学会有疑问,网络模型不是七层的吗,这里怎么变成了四层。其实将这四层在再次细分划出去之后也就变成了七层模型。这篇文章主要是为了讲解一下tcp/ip协议族的四层设计思想,故不针对四层和七层模型做过多讲解。
先看看tcp/ip协议族分层之后的总体设计:
ISO七层模型设计:
两种设计的对应层数划分关系:
ok,回到主题上来。下面开始介绍四层模型每层的作用以及整体是如何实现通信的。
先上通信的整体结构图:
我们先从应用层开始讲起:
应用层决定这次通信的应用类型,比如说FTP、DNS、SMTP等等,同时HTTP协议也属于应用层的范围。通俗来讲,应用层决定这一次通信要干嘛。
传输层:传输层提供两台计算机之间的数据传输,传输层中包含着两个很叼的协议,分别是TCP和UDP协议。面试中经常提及的三次握手,四次挥手就是TCP协议的部分内容
网络层:网络层则是用来处理这些流动的数据包,也就是如果把相应的数据包路由到指定的地点,为通信时的网络传输选择传输路线
数据链路层:数据链路层包含了软件与硬件的接口部分,以及各种网络设备的硬件,也就是整个网络通信过程中最底层的基础设施
简单了解了每一层的作用之后,我们试着串起来,摸索一下一次整体的http请求到响应的过程。
拿访问google做个例子
0.访问google.com,按下回车。
1.应用层准备好请求报文,通过DNS服务进行域名解析,得到google的ip地址,并将报文发到传输层。
2.传输层收到报文后,会将请求的数据包进行拆分,打包,并对每个包裹打上tag。在请求报文的基础上,加上一层TCP的首部信息,然后发往网络层。
3.到了网络层以后,IP协议就发挥了巨大的作用,IP协议中需要两个比较重要的信息,那就是ip地址和mac地址。ip已经在应用层通过dns解析出来了,那mac怎么办。。。真尴尬,然而这时ARP协议又冒了出来,它可以根据ip地址反向查询到目标主机的mac地址。好了,现在啥都有了,打包带走,把数据发到数据链路层。
4.终于走到基础设施这里了,此时数据包就在一根根光纤中旋转跳跃的奔向目的地,当然,整个过程不一定是直达的,可能需要经过各种中转站,就跟坐火车转车一样的。
5.请求到达服务器后,先从数据链路层往上走,并验证消去以太网首部信息,在网络层消去IP首部,在传输层消去TCP首部,就像剥洋葱一样一层一层去皮,最后剩下的就请求报文。在应用层对请求做出处理之后,需要对请求返回一个响应。而整个响应的传输过程就和请求一样,一层一层的封装,响应到达客户端时再一层一层的消去首部,最后呈现响应的结果。
为什么要用到MAC地址
这是由组网方式决定的,如今比较流行的接入Internet的方式是把主机通过以太网组织在一起,然后再通过交换机和 Internet相连接。
以太网采用介质访问控制(Medh Access Control,MAC)地址进行寻址,MAC地址被烧人每个以太网网卡(Network Interface Card,NIC)中。
MAC地址也叫硬件地址,它采用48位(6字节)的十六进制格式。组织唯一标识符(OUI)是由IEEE分配给单位组织的,它包含24位(3字节)。各个单位组织依次被分配一个全局管理地址(24位,或3字节),对于厂家生产的每一块网卡来说,这个地址是唯一的(当然,这不能完全保证)。