系统编程-网络编程
网络编程
目录
网络编程
引入
-- 网路通信都应该具备两个条件
- OSI网络七层模型 -- 了解
TCP/IP协议模型
通信的时代变化
1、物理层:
2、数据链路层: mac
3、网络层: ip
相关问题
1、子网的由来
2、路由器如何知道C在哪里?
3、 刚才说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是我只知道 IP 地址该怎么办呢?
4、传输过程
从各个视角看
-- 涉及到的三张表分别是
补充:下一跳
如果 A 给 F 发送一个数据包,能不能通呢?如果通的话整个过程是怎样的呢?
引入
-- 网路通信都应该具备两个条件
- 物理媒介(物理层面)
- 协议(软件层次)
- OSI网络七层模型 -- 了解
-- 网络模型的作用:进行数据的封装
-- OSI 模型把网络通信的工作分为 7 层,
从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
OSI 只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。
后来人们对 OSI 进行了简化,合并了一些层,最终只保留了 4 层,从下到上分别是接口层、网络层、传输层和应用层,这就是大名鼎鼎的 TCP/IP 模型。
TCP/IP协议模型
-- TCP/IP协议模型,包含了一系列构成互联网基础的网络协议,是Internet的核心协议。
-- 基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与OSI模型各层的对照关系。
TCP/IP协议族按照层次由上到下,层层包装。
最上面的是应用层,这里面有http,ftp,等等我们熟悉的协议。
而第二层则是传输层,著名的TCP和UDP协议就在这个层次。
第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。
第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。
通信的时代变化
1、物理层:
2、数据链路层: mac
3、网络层: ip
相关问题
1、子网的由来
-- A 给 C 发数据包,怎么知道是否要通过路由器转发呢?
- 答案:子网
如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去。
如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理。
-- 那么什么是子网?
2、路由器如何知道转发给谁?
- 答案:路由表
现在 A 要给 C 发数据包,已经可以成功发到路由器这里了,最后一个问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢。
路由器收到的数据包有目的 IP 也就是 C 的 IP 地址,需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样。
- 这个表就叫路由表。
-- 至于这个路由表是怎么出来的,有很多路由算法,本文不展开.
-- 不同于 MAC 地址表的是,路由表并不是一对一这种明确关系,我们下面看一个路由表的结构。
-- 我们学习一种新的表示方法,由于子网掩码其实就表示前多少位表示子网的网段,所以如192.168.0.0(255.255.255.0) 也可以简写为 192.168.0.0/24 -- 24就是24位
3、 刚才说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是我只知道 IP 地址该怎么办呢?
-- 答案:ARP
-- 假如你(A)此时不知道你同伴 B 的 MAC 地址(现实中就是不知道的,刚刚我们只是假设已知),你只知道它的 IP 地址,你该怎么把数据包准确传给 B 呢?
-- 答案很简单,在网络层,我需要把 IP 地址对应的 MAC 地址找到,也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB。
-- 这种方式就是 ARP 协议,同时电脑 A 和 B 里面也会有一张 ARP 缓存表,表中记录着 IP 与 MAC 地址的对应关系。
-- 一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。
这样通过大家不断广播 arp 请求,最终所有电脑里面都将 arp 缓存表更新完整。
4、传输过程
从各个视角看
- 从电脑视角
首先我要知道我的 IP 以及对方的 IP
通过子网掩码判断我们是否在同一个子网
在同一个子网就通过 arp 获取对方 mac 地址直接扔出去
不在同一个子网就通过 arp 获取默认网关的 mac 地址直接扔出去
- 交换机视角
我收到的数据包必须有目标 MAC 地址
通过 MAC 地址表查映射关系
查到了就按照映射关系从我的指定端口发出去
查不到就所有端口都发出去
- 路由器视角
我收到的数据包必须有目标 IP 地址
通过路由表查映射关系
查到了就按照映射关系从我的指定端口发出去(不在任何一个子网范围,走其路由器的默认网关也是查到了)
查不到则返回一个路由不可达的数据包
-- 注:网络层(IP协议)本身没有传输包的功能,包的实际传输是委托给数据链路层(以太网中的交换机)来实现的。
-- 涉及到的三张表分别是
交换机中有 MAC 地址表用于映射 MAC 地址和它的端口
路由器中有路由表用于映射 IP 地址(段)和它的端口
电脑和路由器中都有 arp 缓存表用于缓存 IP 和 MAC 地址的映射关系
-- 这三张表是怎么来的
MAC 地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。
路由表是各种路由算法 + 人工配置逐步完善起来的。
arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。
知道了以上这些,目前网络上两个节点是如何发送数据包的这个过程,就完全可以解释通了!
补充:下一跳
这时路由器 1 连接了路由器 2,所以其路由表有了下一条地址这一个概念,所以它的路由表就变成了这个样子。如果匹配到了有下一跳地址的一项,则需要再次匹配,找到其端口,并找到下一跳 IP 的 MAC 地址。
-- 也就是说找来找去,最终必须能映射到一个端口号,然后从这个端口号把数据包发出去。
如果 A 给 F 发送一个数据包,能不能通呢?如果通的话整个过程是怎样的呢?
-- 详细过程文字描述
-
1、首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)
-
2、A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。
-
3、A 将源 MAC 地址(AAAA)与网关 MAC 地址(ABAB)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)(注意这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化)封装在网络层头部,然后发包
-
4、交换机 1 收到数据包后,发现目标 MAC 地址是 ABAB,转发给路由器1
-
5、数据包来到了路由器 1,发现其目标 IP 地址是 192.168.2.2,查看其路由表,发现了下一跳的地址是 192.168.100.5*
-
6、所以此时路由器 1 需要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最后把包从 2 号口发出去。
-
7、此时路由器 2 收到了数据包,看到其目的地址是 192.168.2.2,查询其路由表,匹配到端口号为 1,准备从 1 号口把数据包送出去。
-
8、但此时路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 FFFF,将其封装在数据链路层头部,并从 1 号端口把包发出去。
-
9、交换机 3 收到了数据包,发现目的 MAC 地址为 FFFF,查询其 MAC 地址表,发现应该从其 6 号端口出去,于是从 6 号端口把数据包发出去。
-
10、F 最终收到了数据包!**并且发现目的 MAC 地址就是自己,于是收下了这个包