网络学习:网络层与数据链路层知识梳理

一、网络层

**网络层的作用:**用户要的是可靠传输,而网络层提供传输能力,传输层提供可靠性(TCP)。

**网络层传输机制:**把数据交给目标网络,再由路由器转较给目标主机。


1.IP报头介绍

IP报头采用定长报头与自描述字段相结合的方式分离报文并校验报文大小。

**首部长度:**可表示20-60字节,即15*4字节。

8位生存时间: 数据报到达目的地的最大报文跳数,一般是64。每次经过一个路由,TTL -= 1,减到0数据报还没到达则丢弃了。该字段用于防止出现路由循环的情况。

八位协议:将有效载荷交给上层的哪个协议。

IP地址:IP可分为网络号和主机号两部分。网络号用于保证相互连接的两个网段具有不同的标识,同一网段内, 主机之间具有相同的网络号, 但必须有不同的主机号。不同的子网其实就是把网络号相同的主机放到一起. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。

在套接字编程中把十进制ip(char类型)转换成四字节的,是因为IP地址本来就是四字节的。


2.IP资源历史背景

32位IP地址,数量是有上限的,即2^32约42亿个IP,于是早期划分出几类网让大家按需申请。如下图所示。

但这并不合理:假如一公司有500名职员,C类IP有8位主机号,即该网段仅可容纳254台主机

(主机号位全0即网络IP,全为1的是广播,这样的IP不能分配给主机,所以是256-2台),这不符合需求,B类网络的主机数又非常大,导致很多主机号根本没有分配,IP资源被浪费了。


3.掩码解决方案

为了解决这种资源浪费问题,引入了掩码。掩码本质是把分到的ip的网络号"往后推",从而把一个ip进一步划分成多个子网,每个子网具有更少的主机数量,提高了利用效率,如下图所示:

掩码原理:在IP后面带上"/n"代表前n位是网络号,剩下的就是主机号了。掩码为n个1和32-n个0,任何主机和掩码做按位与运算能够得到网络号。如下图所示

仍以前文案例为例讲解不同子网如何联系:

假设分出来的四个子网分别为公司的四个部门,现在职员A想联系另一部门的职员B,操作系统将该职员BIP和掩码做按位与运算,得出网络号和当前网络号不同,说明职员B不在职员A所处子网中,于是把数据报转交给当前子网路由器X,路由器对职员B的IP后做同样操作,在路由表中找到了该IP的所属子网路由器Y,于是交付给Y,Y最后交付给职员B。


4.更多的IP

掩码能提高IP的利用效率,但无法提高IP地址上限,提高上限有如下几种方式:

动态分配IP地址,即只给接入网络的设备分配IP地址。

NAT技术:下文讲解。

IPV6技术:和IPV4完全不兼容的协议,用有2^128个IP地址,目前在国内发展较好,尚未推广到全球层面,公网仍以IPV4为主。


5.路由器

路由器本质也是设备,也有IP地址。但它至少要连接着两个子网才能起到跨网段传输的作用,所以路由器有多个IP。路由器一般是子网中的第一个或最后一个设备,所以IP一般都是"当前网络号.1"或"当前网络号.254"。

路由器不仅能转发报文,它还是局域网的构建者,分配并管理内网IP。

(1)私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都不会和外界冲突,但RFC1918规定了用于组建局域网的私有IP地址:

10.*,前8位是网络号,共16,777,216个地址

172.16. 到 172.31.,前12位是网络号,共1,048,576个地址

192.168.*,前16位是网络号,共65,536个地址

包含在上述范围中的, 都称为私有IP, 其余IP则称为全局IP(或公网IP)

路由器会通过DHCP给每一台接入设备分配 192.168.1.x这样的私网IP。这些IP****而是不能作为公网可路由地址 ,而必须先通过路由器转换成公网IP(NAT技术,后文讲解),所以路由器至少得有一个公网IP才能接入其它子网,也就是下面提到的WAN口IP。

(2)LAN口和WAN口

路由器通常有两个物理接口:LAN口和WAN口。

LAN口连接的内网中所有设备,LAN口本身私网IP

WAN口可能公网IP(可能处在运营商级 NAT 后面**),与其他公网相连** (比如 120.34.56.78),由运营商分配。

内网路由器和出口路由器

  • 内网路由器, 如公司内部的三层交换机、部门间的网关)的所有接口全都是私有 IP。
  • 出口路由器 (大部分家庭里面会装的那种)的 WAN 口至少有一个公网IP。

6.路由的过程

路由的过程, 就是数据从一个设备到另一个设备的过程。所谓的"一跳" 指的是数据链路层中的一个区间。IP报头中已经包含了源IP和目的IP,但设备要通过路由器跨网传输,是如何得知当前局域网的路由器IP,而路由器又如何得知同一网段其它路由器的IP呢?通过下面介绍的路由表实现。

路由表

所有设备都有一张路由表 ,在命令板使用route命令可查看。

路由表表头的Destination 是目的网络地址**,Genmask** 是子网掩码,Gateway 是下一跳地址,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

路由表内容包括下面几条:

  • 本地子网:记录了当前设备所处的子网IP和掩码等(注意,一个设备可以处于多个子网中,比如电脑既插网线又连无线)
  • 本地环回:发给自己本机的虚拟网卡,不经过任何物理网卡
  • **默认网关:**路由表有一默认出口default,在路由表如果找了一圈没有发现目标网络号,数据将从默认出口发出。该出口通常与其它子网连接。

下面举例演示路由表的用法。

某主机上的网络接口配置和路由表如图所示

这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到 192.168.56.0/24网络;

例1:

要发送的数据包的目的地址是192.168.56.3

目的地址与第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符

再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;

由于192.168.56.0/24正是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
例2:

如果要发送的数据包的目的地址是202.10.1.2

依次和路由表前几行掩码做运算并对比, 发现都不匹配;

按缺省路由条目, 从eth0接口发出去, 即发往192.168.10.1路由器;

由192.168.10.1路由器根据它的路由表查找下一跳地址。

设备查询路由表有如下两种情况:

  • 如果匹配直连网络,就 ARP目标IP;

  • 如果匹配下一跳,就ARP下一跳/网关。

  • 没有匹配且没有默认路由,就丢弃或返回不可达。


7.NAT技术

前文已经提到过,私网IP是无法在公网上流通的。因此私网内的主机和外网进行通信时, 路由器将IP首部中的IP地址替换成WAN口IP, 当然由于IP资源数量有限,可能路由器的WAN口IP也是私网IP,不论如何,逐级替换直至数据包中的IP地址最终被替换为一个公网IP,从而能够对外访问。这种技术称为NAT(Network Address Translation,网络地址转换)这样一来,一个公网IP下允许拥有多个私有IP,即便不同公网下有同样的私有IP也不会矛盾,扩大了IP资源。


8.分片

当IP数据包大于MTU(如1500字节)时,路由器或操作系统会将这个IP包拆成多个IP分片发送,该过程称为分片,既然由IP进行分片,也就要有组装的能力。IP报头中13位片位移和3位标志就是分片和组装相关的字段,下面展开讲解。

(1)分片

将TCP报文分按1480字节分片(给IP报头留20),分片后每个分片都要带上IP报头。3个标志位 分别是:保留位(Reserved,必须为0)、DF(不分片)、MF(更多分片)

在上图例子中,分片1后面还有分片2、3,分片2后面还有分片3,所以两个分片MF为1。分片3为最后一片,因此MF为0。三个分片都是分片,所以DF为0

(2)组装

对端IP层收到分片后的数据,根据各个分片IP报头进行组装,仍以上图为例:

分片1MF为1,说明这是一个分片,片偏移为0,所以是第一片。

分片2MF为1,说明这是分片1的后续分片,片偏移为1480,符合分片1大小,是第二片。

分片3MF为0,但偏移量不为0,说明这是数据的最后一个分片,片偏移为2960,符合分片1+分片2大小,是最后一片。

(3)检查分片丢失

分片丢失分为第一个分片丢失(没有一个是片偏移为0的)、中间分片丢失(根据片偏移的合理性)和最后一个分片丢失(没有分片的更多分片为0)。

检查丢失无误后,对片偏移进行排序,再把除第一个以外的报头丢掉,完成了排序。

(4)是否建议分片?

不建议。如果有分片丢失,导致组装失败,要求重发报文。报文越大,分片越多,分片丢失可能性越大,丢包概率增大,效率下降。

(5)如何避免分片

上层不应交付过大的报文,因此在三次握手时双方交换最大报文段长度 (MSS, Maximum Segment Size), 这是TCP最重要的选项之一。它表示本端愿意接收的单个TCP报文段的最大数据长度可接纳数据量大小。这正是为什么TCP滑动窗口不以一个报文为单位发送消息,而是以MSS为单位进行发送的原因(通常为1460字节,留20给TCP报头,另外20给IP报头)。遵循上述规则,每次封好IP报头以后,大小正好在1500字节以内,不需要分片

二、数据链路层

1.mac帧

mac帧即数据链路层封装的报文,结构如上图所示

mac帧用定长报头进行解包封装,类型即上层协议类型,如0800代表IP协议,类型决定了mac帧被交给上层哪种协议处理。

数据链路层用于解决直接相连的主机之间数据交付的问题,每一台主机都有mac地址,从而区分同局域网中的主机,mac帧的目的地址即目标主机的mac地址,源地址即发送主机的mac地址。

2.局域网通信原理

局域网通信原理在过去博客已经整理过,这里做简述和补充:

局域网中一台主机发送消息,所有主机都会收到该消息,对比mac帧的目标mac地址与自己的mac地址,若不同则丢弃。

多条消息在局域网流动可能导致数据碰撞 。因此采用碰撞避免算法 ,也就是让主机发送时间分开,同一时刻只允许一台主机在发消息,可见网络对每台主机就是一种临界资源

主机越多,发生碰撞的概率越大,因此引入交换机用于划分碰撞域,在概率上减少局域网碰撞。

数据越短,网络通信时间越短,发生碰撞概率越低,因此前文提到的IP分片也有这方面的考量

3.跨网通信mac地址变化

跨网通信时,发送主机要先把数据传到下一跳,因此目的mac地址为路由器的mac地址。

路由器收到数据后,通过查路由表,在它连接的其它子网中找到下一跳,并将源mac地址换成自己的mac地址,目的mac地址换成下一跳的mac地址,以此类推,直到找到目标主机mac地址。从该过程中不难看出,mac帧只在局域网中有效。可即便知道了下一跳的IP地址,没有mac地址是无法通信的,如何得知下一跳的mac地址?就是通过下面的ARP协议实现的。


4.ARP协议

ARP协议负责在局域网中将目标主机IP转为mac地址,其报头如上图所示,下面阐述作用原理。

发送端最开始将ARP报文以广播方式发送到局域网中,其中包括了目标主机IP地址,如果某主机IP地址和目标IP地址一致,就将自己的mac地址发回来,于是得到目标主机mac地址。下面进行更详细地说明:

ARP协议在MAC帧上层,但归属到数据链路层。协议类型决定了要把什么地址转换成mac地址,如0800就是IP转mac地址。op字段为1表示ARP请求,2表示ARP应答。

发送主机一开始已通过路由表知道了目标IP,从而在数据链路层封好ARP报头,包括目标IP和源IP。

然后开始封mac帧,mac帧选择ARP类型,目的地址填广播地址,这样所有主机都会解包该报文,从而得到ARP报头。

先识别ARP类型,如果是0806就知道解包后剩下的报文交给ARP层受理。

再识别ARP报头的op是请求还是应答(因为任何主机既可以收到APR请求或APR应答)如果是请求,检查目的IP是不是自己的IP。

如果是自己的IP,逆向执行上述操作 ,封好APR和mac帧。但此时ARP报头的op为回复,且mac帧的目标mac地址为发送主机的mac地址 (毕竟刚刚收到请求的时候就知道了发送主机的mac地址,可以直接发送就没必要广播了

发送主机拿到并解包这条数据报,得到目标主机mac地址,即可进行前文提到的局域网或跨网通信。

注:ARP、IP和mac会被主机临时缓存起来,所以ARP不是每次都要做的,初次跨网的话在每一跳要执行上述ARP操作,此后直到缓存失效才重新进行ARP沟通mac地址。

ARP周边问题

(1)RARP

如果只知道mac地址,反过来想拿到IP地址就叫RARP。原理很简单,已知目标主机mac地址,直接构建mac帧询问目标主机的IP即可。

(1)安全问题

当一台主机收到多个ARP时,以最新的一条为准。

如果某主机A不断地向另一主机B发送APR应答,并带上A的mac地址,主机B根本不知道收到的应答是否正确,误以为A是目标主机,A收到报文后也不做任何处理,主机B会不断请求,网络功能瘫痪,这就是ARP欺骗

如果A将B发来的消息以A的名义转发给路由器,路由器又会把收到的回复发给A,A再发给B,A就成了中间人。


三、拓展与补充


1.NAPT技术

主机A给另一子网主机B发送消息时依赖NAT技术将私有IP换成全局IP。假如一个子网内多个主机A1、A2...An向另一子网内同一台主机B发送消息时,因为NAT将这些消息的IP都换成了路由器IP,主机B是否会认为这些消息来自同一台主机?

NAPT作为NAP技术的升级版,避免了这种情况。

来自A1,A2...AnIP的确相同,且无法避免,但路由器能给这些消息安排了不同的端口号,同时把为A1分配的IP+端口号、B的IP与A1源IP+源端口号和B的IP的映射关系存到一映射表中,为A2执行同样的操作,以此类推。

这样,当消息从B发出后,消息带有指定IP+端口号,路由器根据这个IP+端口号来查询为子网哪台主机分配了此端口号,于是将应答精准发回给指定主机。

NAPT也有缺点,这种技术必须得内网主动连一次外网,外网才能登上内网,这就是为什么很多APP需要先登录再使用的原因。这就要谈到下面的内网穿透技术。


2.内网穿透技术

已知内网向外网发出请求时,才会建立映射关系,只有外网的响应能回到内网。假如内网从来没有向外网发出请求,映射关系没被建立,外网是无法直接联系内网的。那么假如两个私网中的主机想要互相通信,就必须引入一个公共服务器,两台主机各自向这个公网服务器发一条消息,服务器负责帮双方建立直连,本质就是对方的消息被当做我方请求相应的响应,从而绕开了用NAT的映射表找主机这一层屏障,这就是内网穿透技术


3.代理服务器

(1)应用场景

已知内网可以连上外网,而代理服务器(如校园网)却作为内网和外网的中间人进行转接,这样有什么作用呢?看看下面的例子。

在没登上局域网之前也就没有接入网络,连网的过程就是在获取局域网IP地址。登录校园网时,要先完成学校服务器认证请求后才拿到的IP,后续在访问外部资源时请求都会经过学校的服务器,一旦发现某主机要访问违规网站,它会直接拦截并拒绝请求。

假如校园网内的学生A下载一部影片,校园网会将其缓存起来,当学生B再次通过相同的链接下载时,校园网能直接将该资源返回给学生B,原本影片需跨越多个路由器传输,现只需在内网中传输即可,极大节省了带宽

当学生直接访问外网时,目标网站会能看到学生的真实IP地址,如果让校园网作为中间人代理访问,就能保护了学生隐私

某些外网资源只允许特定的 IP 访问,或者主机所在的网络屏蔽了某些网站,如果代理服务器刚好在允许访问的地区,主机就可以通过代理服务器去"代为请求",从而绕过本地网络的限制,间接访问到那些资源。

上述都是代理服务器的应用场景,可见代理服务器是一种应用比较广的技术.。

(2)正向代理与反向代理

代理服务器又分为正向代理和反向代理。

正向代理是为客户端进行的代理 ,前面校园网的例子就是一种正向代理:学生通过代理服务器访问外网资源。典型场景:公司内网统一上网、翻墙、匿名访问网站

反向代理是为服务端进行的代理 ,比如抢购时平台服务器无法承受大量请求,于是将所有请求分发到各个代理服务器中处理。典型场景:负载均衡、安全防护、CDN加速

(3)NAT和代理服务器的区别

  • 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
  • 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
  • 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。比特就业课。
  • 从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。

4.对运营商的理解

运营商拉光纤把模拟信号(光信号)传进千家万户,调制解调器(猫)再把模拟信号转数字信号给路由器。由工作人员设置路由器的账号和密码,网络能够接通运营商,运营商从而能够检测流量从而收费。


5.DNS域名解析

IP+端口号可以定位唯一一台主机,为了方便记忆,浏览器建立了一套从域名映射到IP+端口号的机制,即内置了DNS服务器的IP地址,当用户输入域名时,先从DNS服务器通过域名获得IP地址,然后再进行访问。


6.ICMP协议

ICMP协议属于网络层且在IP层之上。

一般IP数据报超时,发送端会直接重传,引入ICMP以后,如果数据报丢失,IP数据报途经的路由器会主动通知发送端错误原因。

相关推荐
老猿讲编程1 小时前
【Eclipse OpenSOVD学习之十一】网关二进制与部署
学习·中间件·rust·eclipse·汽车
志栋智能1 小时前
运维超自动化中的配置管理实践
运维·网络·数据库·自动化
Yanjun2i1 小时前
Agent学习记录六:Tool 类 + Tool Registry
开发语言·python·学习
一条泥憨鱼1 小时前
【从0开始学习计算机网络】| TIME_WAIT 为什么是 2MSL,CLOSE_WAIT / TIME_WAIT 堆积怎么排查
服务器·开发语言·网络·计算机网络·网络安全
罗西的思考1 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 —(1)— 总体
人工智能·笔记·深度学习·学习·机器学习
FW-Linker1 小时前
多卡聚合的数据包级并行传输原理在广电直播场景中详解
网络·5g·架构·智能路由器
Tiny2141 小时前
解决VMware中win10虚拟机无法上网
网络·windows·vmware
老猿讲编程1 小时前
【Eclipse OpenSOVD学习之十】客户端 SDK
学习·eclipse·嵌入式软件·车载·sovd
gjf05_051 小时前
人该怎样活着呢?版本74.5
学习