【计算机网络】网络基础

OSI模型

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地址,一套地址是MAC地址,为什么呢?

举个例子:想必大家都看过西游记,假如这时唐僧去了女儿国。女儿国国王问他从哪里来,唐僧说:“贫僧自东土大唐而来,前往西方拜佛求经。”。然后女儿国国王又问,那你上一站从哪来。唐僧说上一站从车迟国而来。随后女王国国王告诉唐僧,要前往西天,那一站必须要去火焰山。于是唐僧就去了火焰山,而牛魔王这时候又出来了,问唐僧从哪里来,唐僧说:“贫僧自东土大唐而来,前往西方拜佛求经”。牛魔王也问唐僧上一站从哪来,唐僧回答从女儿国来。 然后牛魔王告诉唐僧下一站要去黑风岭…

在这个例子里面,东土大唐就是发送数据的那台主机IP,西天则是最后要接收数据的目标主机IP。而这个是在路途中是始终不会变的。而上一站从哪来,下一站到哪去,这是随时变化的。这个随时都会变化的地址就是MAC地址(不是指主机的MAC地址,而是协议中填的MAC地址)。

所以会有两套地址:

IP地址 : 从哪里来,到哪里去。

MAC地址:上一站从哪来,下一站到哪去。

所以IP地址才传输过程中是不变的,而MAC地址就不一样了。每经过一个路由器,路由器会提取报文的上一站主机/路由的MAC地址。如果此时还有下一跳,那么上一站的地址会被替换成当前的,随后把下一站的地址填入报文中… 直到最后到达目的地。

相关推荐

  1. 计算机网络——网络基础1

    2023-12-19 08:54:04       15 阅读
  2. 计算机网络基础

    2023-12-19 08:54:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-19 08:54:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-19 08:54:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-19 08:54:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-19 08:54:04       20 阅读

热门阅读

  1. MySQL! 一个开源的关系型数据库管理系统!

    2023-12-19 08:54:04       37 阅读
  2. 第五章 图论 邻接表存图

    2023-12-19 08:54:04       28 阅读
  3. 手动配置 kafka 用户密码,认证方式等的方式

    2023-12-19 08:54:04       37 阅读
  4. Scroll-view的用法(网页和微信小程序)

    2023-12-19 08:54:04       39 阅读
  5. Flink系列之:Table API Connectors之Raw Format

    2023-12-19 08:54:04       38 阅读
  6. linux常用命令-sed(流编辑器)

    2023-12-19 08:54:04       34 阅读