OSI七层模型,自顶向下分别是: 应用层 -> 表示层 -> 会话层 -> 传输层 -> 网络层 -> 数据链路层 -> 物理层。
而实际上表示层和会话层都属于应用层,所以也有另一种说法,那就是TCP/IP五层模型。 也就是 : 应用层->传输层->网络层->数据链路层->物理层。
为什么要设置这么多层呢? 这是因为分层是有优势的, 分层可以让每个模块之间的耦合度降低,也可以把每一层的功能集中,每一层做每一层应该做的事而互不影响。 这也是软件设计中一个很重要的思想,那就是高内聚,低耦合
而每一层也都有自己要做的事。
4. 解决应用发面的事情 应用层 -> (对发送来的数据进行处理比返回给用户)
3. 容错/纠错的能力 传输层 -> 保证数据传输的可靠性,保证数据能够传递给对面
2. 要有路径选择的能力 网络层-> 数据要传给另一台主机,那么其中的路径如何选择呢?
**1. 如何把数据交给和自己相连下一台主机 数据链路层-> 网络传输的本质就是把自己的数据从一台主机传递到另一台主机,那么如何交付呢? **
物理层涉及硬件和物理知识,本人能力有限,暂且不谈。
再谈局域网之前,我们要先了解一个东西,那就是协议报头
什么是协议报头?
举个例子: 假如你在网上买了一个洗面奶,那么洗面奶是店家直接送给你的吗? 当然不是,而是店家把洗面奶交给快递员,快递员再通过指定的路径去发送你的洗面奶。而当你的洗面奶到达你所在的快递点的时候,你就会去拿你的洗面奶。而此时你会发现你拿到的不仅仅是洗面奶,还有盒子和快递单! 实际上你需要的是快递单吗?当然不是!你需要的只是洗面奶,那么为什么会有快递单?因为快递单是给快递员看的!快递员通过快递单才能把你的洗面奶送到指定的位置。
而在这个过程中,快递单就是协议报头!洗面奶就是报头的有效载荷(数据)!快递单是给快递员看的,而协议报头也是给底层转发报头的设备(快递员)看的。实际上用户(上层)根本就不关心你的协议报头!
而你拿到洗面奶是目的吗??? 当然不是!你用洗面奶洗脸才是目的!所以数据传给另一台主机是目的吗?不是!传给另一台主机让另一台主机去处理数据才是目的。
所以:
1. 协议每一层都会有,而每个协议最终表现就是协议必须要有报头!
2. 协议通常是通过协议报头来表达的
3. 每一份数据最终在被发送或者在不同的协议层中,都要有自己的报头!
局域网就是一个小型范围的网路,就比如你开的wifi热点,就是一个小型的局域网。两台局域网之间的主机是能够直接通信的,而每一台主机都有自己的"名字",每一台主机都要有自己的网卡,每一张网卡都有自己的地址,也就是MAC地址
MAC地址的作用就是表明当前主机在网络中的唯一性,所以MAC地址也是唯一的
局域网通信原理:
假设我们要把数据:你好从A主机发送到B主机(局域网中)。
实际上会先把数据交给应用层,再添加上应用层的报头,随后向下交付,而不是直接发送给对方。
然后向下交付,交付给传输层。
在传输层层后又会加上TCP/UDP/其他传输层协议 的报头。这里以tcp举例。
然后向下交付给网络层。
交付给网络层后,又会加上网络层的报头(IP协议报头),然后交给数据链路层。
然后再把报文交给数据链路层。
这个一直向下交付的过程,被称为封装 ,当然,不是面向对象里面的封装哈。
然后再把整个报文交给物理层,由物理层进行发送,发送到主机B的物理层。再由主机B的物理层向上把报文交给主机B。
再由主机B的数据链路层去掉(拿走)链路层的报头,也就是属于自己的报头,随后向上交付给网络层。
然后网络层再拿掉自己的报头(IP报头),再向上交付给传输层。
传输层也拿掉自己的报头,交付给应用层。
而应用层拿到报头后,这里就是给程序员操作的地方了,由程序员对报头进行解析,对数据进行特殊处理后,再返回给用户。
而这种向上交付的过程,被称之为解包
我们可以发现这个过程是一 一对应的。**每一层协议都必须具有判断哪里是报头,哪里是有效载荷的能力! 也要判断自己的有效载荷是交给上层的哪个协议的能力。**因为每一层都可能有多个协议。
以太网通信
假设在一个局域网内有五台主机:
如果这时候MAC1给MAC5发送消息,那么其他的主机也会收到信息,只不过不是与它们通信,它们会自动丢弃报文。
举个例子: 你是一位小学生,你的老师突然喊你起来,问你为什么作业没写。而老师喊你和问你的过程,其他同学是不是也听见了?可是其他同学为什么没有站起来?这是因为叫的不是他们,所以他们会忽略了这条信息。而网络也是一样,因为MAC1是和MAC5通信。其他主机知道这个报文不是发给自己的,所以会丢弃这个报文。
然后我们再来看看,每一台主机是不是共享一个局域网? 我们把每一个主机看成一个线程,那么这个局域网是不是共享资源? 当然是!! 这个局域网就是临界资源!!!被多台主机所共享!!
既然是临界资源,那么一次就只能允许一台主机发送消息,否则会发送碰撞,所以局域网 也叫做 碰撞域
一旦发生碰撞,那么所有的主机都会丢弃报文,随机发送报文的主就相当于发送失败,而进行重新发送。
令牌环网
令牌环网就是放一块"令牌"出来,只有拿到令牌的主机才可以发送消息。之后呢再把令牌交给另一台主机,另一台主机才能开始发送消息。
没错!!这个令牌就是多线程中的锁。在多线程中,只有抢到锁的线程(竞争同一把锁的线程)才能访问临界资源。在令牌环网中,只有持有令牌的主机才能发送消息!
什么叫跨网络通信?那么就是不在同一个局域网的两台主机要进行通信,比如一台主机在西藏,一台主机在内蒙古。相隔千里之间的通信一定是跨越了很多网络的。
跨网络通信的过程大致如下 :
主机A用应用层协议组织数据 -> 添加应用层协议报头 -> 下发到传输层 -> 添加传输层协议报头 -> 下发到网络层 -> 添加网络层协议报头 -> 下发到数据链路层-> 添加链路层协议报头 -> 下发到物理层 -> 物理层转发数据到路由器1的物理层 -> 路由器1将报文交给数据链路层 -> 路由1的数据链路层对报文进行解包 -> 上发给网络层 -> 网络层对报文进行解包 -> 检测到当前报文不是发送给当前主机的 -> 添加网络层协议 -> 下发到链路层 -> 添加链路层协议 -> 下发到物理层 -> 发送给路由2 -> … -> 最后一个路由 -> 主机B的物理层 -> 主机B的数据链路层 -> 对报文解包 -> 上发给网络层 -> 对网络层解包 -> 上发给传输层 -> 对传输层进行解包 -> 上发给应用层 -> 应用层处理数据 -> 提交给主机B的用户
每一个报文发送出去时,必须要包含两套地址,一套地址是IP地址,一套地址是MAC地址,为什么呢?
举个例子:想必大家都看过西游记,假如这时唐僧去了女儿国。女儿国国王问他从哪里来,唐僧说:“贫僧自东土大唐而来,前往西方拜佛求经。”。然后女儿国国王又问,那你上一站从哪来。唐僧说上一站从车迟国而来。随后女王国国王告诉唐僧,要前往西天,那一站必须要去火焰山。于是唐僧就去了火焰山,而牛魔王这时候又出来了,问唐僧从哪里来,唐僧说:“贫僧自东土大唐而来,前往西方拜佛求经”。牛魔王也问唐僧上一站从哪来,唐僧回答从女儿国来。 然后牛魔王告诉唐僧下一站要去黑风岭…
在这个例子里面,东土大唐就是发送数据的那台主机IP,西天则是最后要接收数据的目标主机IP。而这个是在路途中是始终不会变的。而上一站从哪来,下一站到哪去,这是随时变化的。这个随时都会变化的地址就是MAC地址(不是指主机的MAC地址,而是协议中填的MAC地址)。
所以会有两套地址:
IP地址 : 从哪里来,到哪里去。
MAC地址:上一站从哪来,下一站到哪去。
所以IP地址才传输过程中是不变的,而MAC地址就不一样了。每经过一个路由器,路由器会提取报文的上一站主机/路由的MAC地址。如果此时还有下一跳,那么上一站的地址会被替换成当前的,随后把下一站的地址填入报文中… 直到最后到达目的地。