文章目录
MAC
数据在局域网中如何发送就是数据链路层解决的。
MAC帧格式
源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的。
帧协议类型字段有三种值,分别对应IP、ARP、RARP。
帧末尾是CRC校验码。
IP报文在向下层传输需要封装MAC帧报头,然后在局域网中通过MAC地址进行传输,每当到以及设备都会对MAC帧报头进行解包分析以及重新封装,所以数据报在传输的过程汇总MAC地址是一直在变化的,目的IP是一直不变的,源IP在私网传输中也是在一直变化的,直到拥有一个合法的公网IP。
MAC如何进行报头和有效载荷的分离?
MAC采用的是固定报头的方式。
如何进行分用?
通过帧协议可以判断把数据交给上层的哪种协议。
MAC地址
MAC地址用来识别数据链路层中相连的节点(路由器)。
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的。
MAC vs IP
MAC地址描述的是路途上的每一个区间的起点和终点;
IP地址描述的是路途总体的起点和终点;
在局域网中,任何一个时刻,只允许一个主机向局域网发送数据,如果同时发送,会发生局域网数据碰撞的问题,这时候需要进行碰撞检测和碰撞避免,发生数据碰撞的主机需要让自己随机休眠一段时间再接着发送。因为局域网中的主机也是可以拿到自己发送的数据的,所以可以知道数据是否发生了碰撞。
但是现在是我们知道目的IP,不知道主机的MAC地址,怎么办呢??
这就需要arp协议了。
ARP协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址;
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;如果不符,则直接丢弃。
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
因为arp表是有大小限制的,所以就会有时间限制。arp缓存如果收到了很多同类型的arp应答,它会将最新的arp应答记录下来。
ARP的数据包格式
ARP中并没有具体的数据,因为它只是为了获取目的IP的MAC地址。
硬件类型指链路层网络类型,1为以太网;
协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址长度对于以太网地址为6字节;
协议地址长度对于和IP地址为4字节;
op字段为1表示ARP请求,op字段为2表示ARP应答。
所以对于一次ARP的请求,不管是MAC报头还是ARP报头的目的以太网地址都是广播地址FF:FF:FF:FF:FF:FF这个局域网的所有主机都会对这个报文进行解析,得到ARP的数据报,对比目的IP之后是自己的就留下构建应答报文,不是话就丢弃,应答因为知道了对方的MAC地址,就不需要进行广播了,所以其他的主机收到了并不会对MAC报头进行解析,直接丢弃,所以请求和应答各个主机的做法也是不同的。
假设主机A想主机B请求ARP
A的请求报文
E的应答报文
NAT和代理
IP地址的数量限制
我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址,CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用.
有三种方式来解决
- 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
- NAT技术
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
NAT
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法,很多学校,家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;NAT从私有IP到公网IP的转化过程在上一节已经介绍过了,现在主要是如何从公网回到内网的问题。这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系。
NAT路由器的右侧不一定是公网,可能还是运营商的子网。NAT的替换的时候不仅仅是替换IP,当端口冲突的时候也会替换端口。这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。
缺陷:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 所有的TCP连接也都会断开;
代理服务器
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端,代理服务器分为正向代理和反向代理。
正向代理用于请求的转发。
反向代理往往作为一个缓存。
NAT和代理服务器的区别:
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.