(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
ip协议通过子网划分,目的IP地址,路径查找相关的算法从逻辑上可以从A主机到B主机了!
下面就是局域网数据转发的问题!怎么实际上把报文从一个主机到另一个主机呢?
———————————————————————————————————————————
当决定把数据交给下一跳路由器的时候,下一跳路由器绝对是和我在一个局域网!宏观来看本质上我们的网络都是由一个个子网构成的这都是子网转发!
一、链路层的数据帧格式
1.认识以太网
- "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
2.以太网帧格式
1.数据
这个数据就是ip报文!
2.mac地址
是链路层用来标识主机唯一性的地址!
目的地址就是代表是那个主机发送的,目的地址就是目标主机的地址!
是一个48位的整数,每台主机上都至少有一个mac地址
3.如何解包和封装
因为采用的是定长报头,所以很容易解包,直接去掉就好了
4.如何交付和分用
有类型字段,如果是0800则是ip报文直接交给ip层就行了!
二、重谈局域网通信原理
1.单个局域网中的数据转发
首先这是两个局域网,如果我们从H1转发到H6,每一个主机都收到了,但是目的地址和我的不匹配则不做处理,如果匹配则进行接收处理,进行报头和有效载荷分离!
如果双方同时想发送呢?
如果在局域网中,同时有多台主机都在发送数据,数据之间就发生了碰撞问题!这样数据就无法使用了!
所以尽量不能发生碰撞问题!所以有了碰撞避免算法,也就是发送主机会休息随机时间,然后重新发送
在发送碰撞的时候我们是不知道的
问题一:局域网中主机越多越好还是越少越好
答案很明显是越少越好!越多就有更大的可能发生碰撞
其中我们有一个叫做交换机的东西,这个是用来划分碰撞域
问题二:局域网中数据帧是越长越好还是越短越好
答案是越短越好,因为数据帧太长了反而会容易造成碰撞问题!
所以就有了网络层的1500限制
三、汇总通信流程,发现并解决
在网络转发的过程中,目的IP是不变的,那么mac帧报头会变吗?
答案是肯定是会变的!因为每个主机都有mac地址,当跳到下一个主机的时候源地址和目的地址也变了!所以这个时候就要重新填写
也就是说有效数据没变,而mac帧一直在变,个人觉得可以想象成古代骑马送信,每经过一个驿站都要换一匹马,而信件没变!
那么假如我们的IP报文被千里迢迢的送到了路由器D,那接下来是不是就要交付给目标主机了呢?
这个时候就要封装mac报头,必须直到主机C的MAC地址!那么这个路由器D怎么直到主机C的地址呢?同理,每一跳是怎么直到下一主机的MAC的地址呢?
四.MSS
不知道是否还记的我们的滑动窗口,滑动窗口是经过一个个的小窗口在滑动,那么为什么不直接一次性的扔过去呢?
这就是因为我们的链路层不允许超过1500字节的数据发送,所以,我们在TCP的时候就要分好,避免网络层去分片,因为网络层分片的代价更大,所以我们不推荐分片!
已知MTU是1500,那么减去IP和TCP报头就剩下1460,所以MSS最大是1460!
五、arp协议
假设主机a要给主机f发送mac帧,要发送就必须要知道目标主机的mac地址,否则就无法封装mac帧!
如果我们只知道目标主机的ip地址,而不知道mac地址!所以我们就需要在同一个网段,需要通过目的ip,得知对方的mac地址的协议,这个协议就叫做arp协议,也叫做地址解析协议,arp协议是一个局域网协议!
将ip地址转化成mac地址大致的流程就是:当一个报文送来时,目的ip我们知道,我们可以查路由表,获取目标网络,然后根据当前网络的编号进行对比,来判断是否到达目标网络,到达了则根据整体的IP地址进行arp协议,获取目标mac地址!
mac帧和arp协议的关系:他们在同一个大层,但是在不同的小层,以太网协议也就是mac它的上层是网络层,arp协议在以太网的上层,但不是说在上面就网络层。
ARP协议的工作过程
1.大致流程
- 先广播,让在这个网络的所有人都知道我在找谁。也就是说我们发送一个mac帧,给所有人发一份,不是的人就直接丢弃,是的人就接收!
- 1对1进行发送,被找的人凭借我刚刚发的mac帧,对我进行回应
2.arp协议的细节
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
其中前4个字段一般是固定的
发送端以太网地址,就是发送请求方的地址;
发送端IP地址,就是发送请求方的IP地址
目的以太网地址,就是目的以太网地址的,这个是不知道的,一般会设为FFFF;
目的IP地址,我们直接填写目标主机的IP
op字段:
- 如果一台主机像另一台主机发起过ARP请求那么这台主机未来一定会收到ARP应答,如果向多台主机,则一定会收到多个应答
- 任何一台主机,也可能向别人发起ARP请求
- 所以在局域网中,任何一个主机收到ARP的时候,可能是一个应答,也有可能是一个球球
所以op字段为1表示ARP请求,op字段为2表示ARP应答。
3.模拟ARP过程
假设HA给HD发送mac帧,想要获取HD的mac地址,已知HD的ip地址,当我们构建了一个数据帧准备发送,主机B先收到了,这时主机B是要进行处理的,因为主机B不知道是否是找他的,每一台主机要进行报头和有效载荷分离,根据类型字段,来把有效载荷交给自己的ARP层,然后先查看对应的op类型,是否是请求,然后目的IP地址,是否是自己的,这时候就可以找到对应的主机了!
然后主机D就接着构建mac帧,将对应的mac帧一对一的发送给主机A,但这个时候其实全部都能收到,只不过不在处理了,因为大家知道了不是给自己的!所以我们两次丢弃的场景是不一样的,第一次是在ARP层,第二次是在MAC层丢的!
当主机A收到了对应的mac帧之后先看op字段是否是应答,然后再看对应的发送端以太网地址和发送端IP地址!
以上的过程就是ARP的过程!
几个问题
- arp看起来至少进行一个请求和一个应答,是不是每一次发送数据都要这么干呢?-----答案是不需要的,arp请求成功之后,请求方会暂时的将IP:MAC地址对应的映射保存起来,往后在一段时间中会直接发送
- 是不是只会在目标最终的子网中发生ARP,还是每一跳都要发生ARP呢?-----答案是并不是!arp的过程会在网络中可能随时发生
arp伪装,arp攻击,让自己成为中间人
主机A和路由器B互相发送消息所以他们知道对方的mac地址,这里有一个主机C和你们连接同一个局域网,我疯狂的给B发送arp应答,地址填写macC,IP填写IPA,我和他说我是主机A,我们的arp缓存是存新不存旧,只要有新的我就会更新,所以路由器B就直接把主机A的IP与映射主机A的mac地址替换成了主机A的IP与主机C的mac地址
同时C还给A发送arp应答,说我是B,地址填macC,IP是IPB,同样的,映射关系也改成了macC
所以主机A给B发消息就需要C来传达,也就是C获取到了发送的消息,这个时候主机C就成为了A与B的中间人
六、NAT
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
- NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
- NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
- 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;
NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同 的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机? 这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
- 其实在进行地址转换的过程中,可能不一定只替换原IP,必要的时候,源端口也要被替换
- 路由器在NAT转化的过程中,除了单纯的替换,还会为我们根据报文请求的四元组(源IP,源端口,目的IP,目的端口),为我们构建一个映射关系
- 源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程,所以源IP+源端口就表示该主机的唯一一个进程,就可以确定自己在自己的内网中的唯一性
- 所以无论是从内向外,还是从外向内,都能在各自的网络中,表示唯一性,所以这个映射关系是:互为KEY值的
- 如果从来没有访问过外网,那么能直接访问内网吗?-----理论上是不能的,因为无法进行NAT转化,我们无法更改目的IP和端口进而访问客户端
- 但是又很多基于NAT原理的软件,能够帮我们进行外网访问-----内网穿透
NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;