操作系统内,除了进程管理、文件管理、内存管理和驱动管理之外。还有一个内嵌了一个网络协议栈。传输数据时,通过网络协议栈,将数据封包,网卡将数据发送到网络中。接收数据时,通过网络协议栈,从网卡中获取数据,将数据解包。
协议栈与操作系统的关系图
网络协议栈各层功能
独立模式: 计算机之间相互独立;
网络互联:多台计算机连接在一起,完成数据共享
局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起
广域网WAN: 将远隔千里的计算机都连在一起;
所谓 “局域网” 和 “广域网” 只是一个相对的概念 。广域网可以说是有个更大的局域网。
“协议”本质就是一种约定,通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。
协议分层让每一个层看起来可以直接进行通信。
分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的。
各层作用
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
假如有主机A和主机B进行通信
**当主机A给主机B发送消息时:**消息在每一层经过被封装,添加上消息头。
主机B接收到主机A的消息后,会从最下层的协议逐步解包,将有效载荷将给上一层协议。最终应用层拿到主机A发送的数据
报头
报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。
有效载荷
当对端主机收到数据后,需要自底向上贯穿协议栈,依次进行数据的解包与分用。在这个解包的过程中,每一层的协议只需要提取出数据中对应的报头,然后对该报头进行分析处理,而剩下的数据则直接交付给上层就行了。
因为每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容不必关心,交给上一层协议进行处理。我们将数据中除当前层的报头以外的数据叫做“有效载荷”。
报头和有效载荷分离
协议栈的每一层都要从数据中提取对应的报头信息,而要将数据中的报头提取出来,首先就需要明确报头与有效载荷之间的界限,这样才能将它们进行分离。
每一层添加报头都是讲协议头添加到数据首部,因此只要知道了报头的大小,就可以讲报头和有效载荷分离。
获取报头大小的方法有:
局域网通过局域网交换机进行数据的交换。同一局域网中的任意主机之间可以进行通信。
在一个局域网当中,除了当前正在进行通信的A主机和B主机以外,还有其他的主机,那A主机是如何将数据成功发送给B主机的呢?
实际当主机A想要发数据给主机B的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。
也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了任何数据,只不过经过筛选后只提交上来了发给自己的数据。
碰撞
当A和B在进行通信时,有可能有其他主机之间也可能在通信。但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰。
如何判断是否发生了碰撞
发送到局域网当中的数据是所有主机都能够收到,因此当一个主机将数据发送出去后,该主机本身也可以收到这个数据。
当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞。
解决碰撞问题
当检测到发生了碰撞,发生消息的主机会选择等待一段时间,再次发送数据。
局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网。而这些被路由器连接的联局域网认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信。
通信过程
左边的主机向右边的主机发送信息。消息经过封装,网络传输,解包后达到右边的主机。
两个局域网采用不同通信标准
上述的广域网中,左边的局域网采用以太网,右边采用令牌环网。
由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。因此路由器需要对数据解包,去掉以太网协议头,再加上令牌环网协议头。
在上面的通信过程中,路由器是如何知道传递给那一台主机?
一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?
路由器其实是通过IP地址来确定数据的转发方向的,每一个IP地址唯一标识一台主机,在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址。
当路由器需要将数据从一个局域网发送到另一个局域网时,路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层。此时,路由器就得到了目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网。
一般在进行路线选择时,会存在两套地址。
IP地址:解决了从哪台主机来,目的主机是哪一台的问题。MAC地址:记录路线,解决了上一站是哪一台主机,下一站应该是哪一台主机的问题
这里的IP地址指的是IPV4
源IP地址和目的IP地址
每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址。因此一个传输的数据当中应该涵盖其源IP地址和目的IP地址,目的IP地址表明该数据传输的目的地,源IP地址作为对端主机响应时的目的IP地址。
源MAC地址和目的MAC地址
大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机。MAC地址在网络中唯一标识一个网卡,每一台路由器上的网卡都有一个MAC地址。
源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达另一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。
时间 | 源MAC地址 | 目的MAC地址 | 源IP地址 | 目的IP地址 |
---|---|---|---|---|
刚开始 | 主机1的MAC地址 | 路由器A的MAC地址 | 主机1IP地址 | 主机2IP地址 |
经过路由A之后 | 路由器A的MAC地 | 路由器B的MAC地址 | 主机1IP地址 | 主机2IP地址 |
经过路由B之后 | 路由器B的MAC地 | 路由器C的MAC地址 | 主机1IP地址 | 主机2IP地址 |
经过路由C之后 | 路由器C的MAC地址 | 路由器D的MAC地址 | 主机1IP地址 | 主机2IP地址 |
经过路由D之后 | 路由器D的MAC地址 | 主机2MAC地址 | 主机1IP地址 | 主机2IP地址 |
数据传输的两套地址
上一篇:Docker-系统环境