"啊,其实触手可及!"
谈到网络层IP,有很多说法都是说,"IP是决定到达对端主机的能力"。而在实际的网络世界中,在各个节点路由器上,游走的报文也是IP报文!
但是,真实的网络数据传输不是上图那样,显得简单。
因此,所谓的跨网络通信(传输),其本质是: " 无数个子网内转发的结果 "。
由此,现在的问题到了,如何理解局域网转发?局域网是如何进行转发的呢?
--- 前言
如何认识局域网1 ?
我们可以将一个局域网当做是一个教室,教室里的学生和老师可以看做是一个一个独立的主机。这时候,如果老师喊了一句,"张三,站起来"。从这个的动作中,我们可以预示,班上的所有人都会听到这句话,并且和自己的信息(名字)作比对,发现不是叫的自己,那么久不用站起来了。因此,在同一个局域网的主机能不能进行通信? 答案是能!并且,在同一个局域网内,每一台主机都有一个唯一标识自己的标识符——网卡(Mac地址)。
什么是Mac地址?
任何一台主机网卡(这里不考虑虚拟出来的),理应有一个唯一的sn,该序号是一个48位、16进制的数字。在全球范围内具有唯一性!
该网卡的Mac地址在出厂的时候就已经确定了,不能更改。(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)。
一、 数据链路层
(1) 什么是以太网?
"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等。
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
(2) 认识以太网协议
认识格式帧:
目的地址\源地址: 通过上层的IP协议得到。
类型: 报文其值有三种, IP、ARP、RARP
帧末: 尾是CRC校验码.
以太网如何进行解包和分用?
ip可以通过16位总长度获取整个报文的大小,udp通过定长报头和报文大小确定解包大小,tcp也可以通过定长报头完成报头与有效载荷的分离。
对于以太帧而言,掐去前面的14字节,去除尾部的4字节,一共18字节就可以拿到对应的有效载荷。
并且,在报头字段里,也有2bit,区分有效载荷的数据报,到底交付上层的什么协议。
局域网转发的原理(基于协议)
我们模拟一下,现在接收到了一个来自上层协议的报文。
正如前言中教室的例子,任何出现在局域网内的数据,其他主机都能够看见!如果此时主机B拿到了该报文。
一旦主机B发现该报头中的目的地址不是自己,那么就会立即丢掉!当主机D收到这个报文后,发现该报文的目的地址就是M5时,就会将该报文的进行解包和分用,将数据交付上层,并在之后重新封包以太帧响应给M1(同样这个报文也是会被局域网内其他主机知晓的!)。
混杂模式:
在局域网中有一种"混杂模式",该功能就是不放弃任何数据帧,直接向上交付!
这也是很多抓包软件、工具的原理。所以你就可以很清晰地认知到,你通过网络对外发送消息时,会经历过很多很多的路由器,穿过很多很多的子网,一个中间人是很容易抓取你报文中携带的隐私信息。这也是为什么现如今有了https,通过加密和CA证书保障用户数据被泄漏的风险。
小结:
① 局域网中的所有主机都能接收到数据帧,只不过大部分主机在自己的数据链路层通过对比数据帧中的目的地址和本主机的Mac地址是否匹配,再来决策是否进行后续处理。
② 局域网中,一次只允许一台主机向局域网中发送数据,如果多个消息被发送可能会导致局域网中的数据发生碰撞、数据无效。
因此,局域网也叫做碰撞域。也许你会像,有没有一种可能,我想搞掉一个局域网,那么我就只需要不遵守碰撞检测与碰撞避免,持续向该局域网塞垃圾数据。是的,这样会加大消息碰撞的概率,别人正常的消息发送就会受到影响。
③ 如何减少碰撞域,提高发送数据的效率呢?
划分碰撞域。
(3) 认识MTU
MTU相当于发快递时对包裹尺寸的限制,网络传输流量大小最终受到的限制是MTU,这个限制是不同的数据链路对应的物理层, 产生的限制:
● 以太网帧中的数据长度规定 ”最小46字节”,"最大1500字节";
● 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
● 如果一个数据包长度大于MTU了,则需要对数据包进行分片(fragmentation);
● 不同的数据链路层标准的MTU是不同的;
查看不同主机的MTU:
#windows:
netsh interface ipv4 show subinterfaces
#linux:
ipconfig
MTU对IP协议的影响:
因为数据链路层MTU的限制,一旦ip层传输的报文数据过大,就会触发分片机制。
● 任意一个原报文中的数据被切分,打上标签。并在数据到达对端时,按序重组。
● 如果这些小包中出现丢失, 接收端重组就会失败. 但IP层不会负责重新传输数据。
MTU对UDP协议的影响:
UDP是定长8字节协议。当携带的数据超过MTU限制,也会在网络层IP处触发分片机制。反而因为udp不可靠,导致接收端出现重组失败,整个数据传输的丢包率大大增加。
MTU对TCP协议影响:
TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size)。
TCP与MTU的关系:
TCP会在通信双方,建立连接时进行MMS协商。在我们前面知道这跟(滑动窗口,窗口大小,拥塞窗口等有关)。双方得知对方的MSS值之后, 选择较小的作为最终MSS。
二、ARP协议
什么是ARP协议?
我们都知道,所谓跨网络通信,本质上就是各个由"路由"设备划分的子网内,进行数据包转发。然而,双方在通信时,仅仅只知晓了对端主机网络号是多少,以及该主机的port进程端口。此时 ,该报文已经抵达了由路由器连通内的,组成的多台主机的子网。此时,该报文又应该向下封装MAC帧时,如何找到对端主机的MAC帧?
长话短说,ARP协议本质上:ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
"根据IP地址,转换成MAC地址,获取对方的MAC地址后,向下封装MAC帧,再发送数据"。所以,ARP协议并不单纯是一个数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
(1) 认识ARP协议
注:源MAC地址,目的MAC地址,一个在以太网首部出现一次,一个又在ARP请求中出现一次。如果仅仅是对于链路层为以太网的情况下,是多余的。但如果是其他类型的网络,则是有必要的。
● 硬件类型:指明了硬件的接口类型,1表示以太网,网络类型还有:令牌环网 或者 无线网;
● 协议类型指要转换的地址类型,0x0800为IP地址;
● 硬件地址长度对于以太网地址为6字节;
● 协议地址长度对于和IP地址为4字节;
● op字段为1表示ARP请求,op字段为2表示ARP应答;
(2) ARP协议的工作流程
● 源主机发出ARP请求,并且将ARP协议内的目的MAC地址填 "FF:FF:FF:FF:FF:FF表示广播。在该网段内的所有主机首先都会查看字段”OP”,如果是填写为1,都会接收到该报文,并且在MAC层将报头和有效载荷分离,向上进行交付。
● 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则会将"OP"字段填为2,发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。其余主机发现广播ARP请求中的IP与本机IP不相符,自动丢弃该报文。
ARP缓存表:
这些ARP结果是会被存储起来的,每台主机都维护一个ARP缓存表,可以用arp -a命令查看。
ARP缓存表是一种“短期存储”中间设备 "IP与MAC地址间的对应关系"的表格,提供一种有效的IP和MAC映射机制。
可以直接映射物理地址与IP地址之间的联系,而不需要花大量时间去核对及确认,实现网络的快速通信,节省网络通讯的流量以及时间。
(3) ARP欺骗
所以,http明文传输危险吗?答案是相当危险。其他主机如何拿到本该发送到你这台主机的信息?进行ARP欺骗。
这也是为什么需要https对传输数据进行加密,需要CA证书,对称、非对称加密、各种数据摘要……让中间人即便能够拿到传输数据,却无法解密,拿不到真实的数据信息,从而降低了数据泄漏可能,为数据传输提供了安全。
RAPR协议:
知道了什么是ARP协议,它是一个地址转换协议。那么是RARP协议呢?RARP协议是一个"逆地址解析协议"。比如,一台主机知道自己的MAC地址,而不知道自己的IP地址,那么可以通RARA协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。虽然发送方发出的是广播信息,RARP规定只有RARP服务器能产生应答。
三、NAT技术
NAT技术背景:
IPv4协议中, IP地址数量不充足的问题,NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。
比如我们的家用路由器,或者学校的路由器,NAT技术是它们必备的功能之一,方便访问公网。我们自己使用的IP地址大都是私有IP,而路由器或者必要的服务器上会设置全局IP。
全局IP具有唯一性要求,但是不同局域网内,可以出现重复的私有IP,互相完全不受影响。
(1)NAT转换过程:
● 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路由器如何判定将这个数据包转发给哪个局域网的主机?
答案是,使用IP+port来建立这个关联关系!
这种关联关系也是由NAT路由器自动维护的,由此,服务端返回的数据,到底返回给子网内的哪一台主机上的哪一个进程,这样的信息就会被保存在这个NAPT转换表之中。一旦通信双方连接断开,就会删除这项表项数据。
NAT缺陷:
● 无法从NAT外部向内部服务器建立连接,也就意味着公网设备是不能直接访问内网设备的。
● 装换表的生成和销毁都需要额外开销;
● 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
(2) NAT和代理服务器
代理服务器:
客户端向代理服务器发送请求, 代理服务器将请求转发给客户端真正要请求的服务器; 服务器返回结果后,发送给代理服务器,代理服务器又把结果回传给客户端。
正+反向代理服务器:
正向代理服务器:
反向代理服务器:
如何区分正、反向代理?离客户端谁近,谁就是正向代理,反之就是反向代理。
负载均衡与反向代理:
假设有多台主机上,部署了同样的服务,并且每台主机都持有唯一的公网ip,所有机器因此会暴露在公网之中!这种情况是比较尴尬,甚至是危险的~。
所以,反向代理服务器仅仅是运作为连接转发的功能。
比如说一些在软件层面上的反向代理Nginx。
NAT vs 代理服务器:
NAT似乎与代理服务器没什么区别,因为两者在数据转发的行为是类似的。但是两者工作在完全不同地方,解决的问题也是不同的。
● 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器。
● 从底层实现上讲, NAT是工作在网络层, 代理服务器往往工作在应用层。
● 从使用范围上讲, NAT一般在局域网的出口部署(NAT路由器), 代理服务器可以在局域网做(比如说我们使用的校园网), 也可以在广域网(作为入口服务器)做, 也可以跨网。
●从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上。
本篇到此结束,感谢你的阅读。
祝你好运,向阳而生~