linux之数据链路层

1.路由

default缺省路由:当一台路由器查路由表没有找到时,就将报文发给这个缺省路由。

报文在公网中运行的过程有三种:1.找到对应的路由器,进行转发。2.没找到,转发给缺省路由。3.进入子网变成内网转发

指令:route,路由表

cpp 复制代码
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

Iface是接口,表示destination的ip的报文可以通过这个接口发送报文,flags中的U表示正在使用,G表示该报文要交给下一跳的路由器.

destination为0.0.0.0就表示当前主机的默认路由,也就是负责把报文发给连接外界的默认网关

gateway 是下一跳地址,0.0.0.0的意思是不用转给下一个路由器了,直接arp广播即可。非0的gateway就是连接另一个子网的路由器。

数据链路层,从上层接受下来的完整报文,大小不超过 MTU(一般是1500字节)。

超过 MTU 的就要进行分片,也就是在网络层要对大小超过MTU的IP 报文要进行分片与组装。

在传输时任何一个分片丢失都意味着该报文整体丢失,因此在网络通信的过程中,如果分片过多,就会提高丢包概率。由于分片和组装的操作是被迫的(传输时报文长度不能太长,数量也不能太多的限制下的综合平衡下的操作),因此要减少分片。

在网络层无法控制报文的大小,他只能对报文分片或丢弃,因此只能在传输层上操作,以保证分片的可能性减少。因此我们对传输层报文的有效载荷数据大小进行了限制,这个值叫 MSS(1460)(算术是 MTU 1500 减 IP 首部 20 再减 TCP 首部 20)。

而这个值就是滑动窗口中每个段区间的范围最大值(最大报文段).

分片和组装

这两步操作与 IP 协议中剩余的 3 个区间有关系

16 位标识:同一个原始报文切出来的分片标识全都一样,不同原始报文的标识不同。

3 位标志:第一位作保留(现在不用),第二位为 1 表示禁止分片,超过 MTU 大小,在网络层直接丢弃,丢完还会回一个 ICMP 差错报文,告诉发送方需要分片但被禁止了。第三位为 1 表示我后面还有分片,为 0 表示后面没有分片了,并不能保证我是分片。

13 位片偏移:当前分片在原始报文中的偏移量。

组装过程,先判断看 3 位标志的第三位是否为 1,为 1 即为分片,为 0 时看偏移量是否为 0,为 0 就不是分片,不为 0 就是分片。

只有在更多分片处标志位为 0 且 13 位偏移量为 0 时才不为分片,其余情况都为分片。

2.如果识别分片,就先按相同标识的分片,聚合在一起。

在识别为分片时,就看16位标识,把相同标识的分片组装在一起

丢失情况,1.没有片偏移量为0的分片代表第一片丢失

2.没有更多分片为0的分片就代表最后一片丢失

3.中间分片丢失是就采用把所有收到的分片按照片偏移进行升序排序,由于片偏移的单位是 8 字节,所以算下一片的位置是当前片偏移量加本片数据长度再除以 8,因此由上一个推导出的片偏移数字就能发现下一个分片是否存在了,同时对分片升序排序就自动完成对片偏移的组装。

2.数据链路层

用于解决局域网通信的问题

分层定位上,传输层是用于解决传输过程中遇到的问题,网络层解决传的方向问题,数据链路层就是解决如何传的问题。局域网中最广泛使用的是以太网,其是一种技术标准。

上面就是数据链路层封装完后后的帧格式,数据部分是有效载荷,里面大部分是 IP 报文,除了有效载荷其余部分大小是固定的,因此可以很轻松进行分离。

类型:这里存的数值决定了往上层给什么协议。ifconfig 中 ether 对应的地址就是 mac 地址。

cpp 复制代码
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.23  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)//这里
        RX packets 12043  bytes 9432231 (9.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8121  bytes 1219934 (1.2 MB)
        TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0

类型中 0x0800,0x0806,0x0835 分别代表 IP 数据报、ARP 请求与应答、RARP 请求与应答。(0x86DD 是 IPv6。)

MTU 是以太网的最大传输单元,为 1500 字节,最小传输单元为 64 字节。

(46 是最小数据载荷,补充:帧太短的话,报文发送太快,导致发送方在发送完报文时碰撞信号才检测到,冲突就检测不出来。)

在传输过程中不同路由器的 MTU 可能不同,所以一个报文可能在传输过程中发生分片。

握手时双方交换 MSS,取较小的那个,定下那一刻每段的上限。这个约定只在握手时成立,之后路径上某一段 MTU 更小时,它管不了。这种情况要靠那一跳的路由器回一个"需要分片"的 ICMP,把上限告诉发送方;发送方自己再把包改小,这就是路径 MTU 发现。

实战里还有一个坑值得知道。很多防火墙把 ICMP 全拦了,那个"需要分片"的消息传不回来,表现就是小包能通、大包卡死,网页点得开但图片一直转圈。这种情况叫 PMTUD 黑洞。

在网络中跑的是 IP 报文去找下一站,在链路上跑的是加了 mac 地址的帧。

MTU 和 MSS 对 IP/UDP/TCP 协议的影响都是分片导致的效率问题。

收包:主机收到一帧时,先看帧头里的目的 MAC,只有是自己的,才拆开信封并把数据交给上层的 IP 处理;如果是广播地址,也收下;如果不是自己的,直接丢弃,连里面的 IP 报文都不看。

发包:顺序反过来。先用目的 IP 查路由表,确定从哪块网卡发出、下一跳是谁。如果下一跳在别的网段,这个下一跳就是网关。然后用 ARP 把下一跳的 IP 换成 MAC,填入帧头。

因此,帧头里的目的 MAC 通常不是最终那台主机的 MAC,而是下一跳的 MAC。只有目标在同一网段时,下一跳才是对方本身,这时填的才是它的 MAC。

一个局域网本身就是一个碰撞域,发生碰撞的主机要休眠来避免碰撞,也就是一个时刻在局域网中只能发送一个数据帧,也就是局域网(以太网)本身就是一个共享资源(临界资源)因此使用以太网的时间越短,发生冲突的可能越少,此时发送方发送的数据帧就越短越好(短的占用时间才少),但是又要保证数量越少越好,这几点平衡下的数据就是46~1500字节大小,也就是说这个数据是用来减少以太网冲突的概率的.(ai认为的1500 是标准定下的上限,为了不让一台主机霸占线路太久。46 是下限,为了凑够 64 字节的最小帧长,让碰撞检测来得及。中间的长度随便填,不是被这两条挤出来的。)

将目的ip转化成mac地址的局域网协议(ARP协议(地址解析协议)):知道了对方的mac地址才能传递,真正在网络物理层上流动的数据其实是数据帧。

在网络层和mac帧中间还有一个处于数据链路层的ARP协议

主机要把包发到本网段之外时,帧头里填的是网关的 MAC 地址,这条记录通常早就保存在主机自己的 ARP 缓存里了。网关收到之后,它并不认识最终那台主机,它只知道下一跳的 IP,所以它得对这个 IP 再做一次 ARP,问出 MAC 地址后才能继续往下送。

想知道某个 IP 地址对应哪个 MAC 的一方,可能是主机,也可能是路由器,会发一个 ARP 请求。这个请求走以太网广播,同一网段的所有设备都能收到,原因很直接,发起方本来就不清楚目标在哪里,只能靠广播问一声。

被问到的那个 IP 所属设备发现请求问的是自己,就回一个 ARP 应答。应答是单播,直接发回给发起请求的一方。为什么应答能单播?因为请求里已经写明了发起方的 IP 和 MAC,回信地址是现成的,不需要再广播问一遍。

两边收到结果后,都会把结果写进各自的 ARP 缓存,一次解析就结束。整个过程只做地址替换,没有连接,也没有握手。

局域网中任何主机都有可能收到arp请求,要么收到arp应答。

arp报头处于以太网首部的后面。

mac帧中的帧类型为0806时就代表为arp报文

硬件类型通常代表在以太网(数字为1),因为有可能为其他局域网类型,因此要保留这个字段

ARP 协议是用于局域网转发的

帧类型就是说的上层类型,一般是 IP 协议,值为 0800

硬件地址长度默认为 6,代表 6 字节,协议地址长度是 4,代表 4 字节。op字段为 1 表示 ARP 请求,字段为 2 表示 ARP 应答。ARP 请求时目的 mac 地址不清楚就填全 0,(这是arp请求时的情况)同时以太网首部中的目的 mac 地址也填全 f,也就是广播地址。

在写完ARP数据时还要到mac帧处封装一层,广播报文时所有主机都要接受这个报文,在这个报文分用传到ARP层时,该主机先看这个报文op是否为1,才根据目的ip是否匹配来决定是丢弃还是应答(核心:主机得到arp时,首先看的是op,如果op是1才看目的ip)。

ARP 应答按规范以请求帧的源 MAC 为目标单播回去;这个以太网目的 MAC 对接收方本身不提供任何新信息,双方地址其实早已互相知道;但它仍是这一跳的交付与过滤凭证:交换机靠它决定从哪个端口转发出去,其他主机的网卡则在硬件层就把帧丢弃。因此它准确来说是"冗余"而非"无用";去掉它后靠广播也能送达,代价只是单播退化成泛洪,以及本来在硬件里就被丢弃的帧要进入协议栈之后才会被丢弃。(也就是其它主机是看以太网首部的mac帧,来丢弃报文的)

从整体的局域网上看,arp请求是在arp层丢弃的,arp应答是在mac帧层丢弃的。只要是arp接收到的报文,都是优先看op,然后再处理,如果op=2,就知道是应答,此时发送arp请求的主机就知道目的主机的mac地址了。

1.主机都会在一段时间内,记录下来局域网中各个ip对应的mac地址的映射关系

2.当我们用穷举的方式向当前局域网的所有主机发报文时,都会发送一份arp请求,等到应答时就能得到一份完整的arp映射表了,没回的主机不记录。

3.临时记录的原因有可能会有人更换网卡和局域网的ip地址并不是固定的,因此需要更新

4.路由生成,是路由协议(静态配置、OSPF、BGP)算出并写入路由表的过程;转发,则是报文到达后只查这张表,决定从哪个接口送出------表由前者写,后者只读。

5.arp虽然是一个局域网协议,但将整个互联网拆分成大量局域网看后就能明白arp在整个网络通信过程中是在大量触发的

相关推荐
GeW1 小时前
高端化走到深处,是数据库和Linux的事
linux
国科安芯2 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
程序员初一3 小时前
Linux 远程桌面有四种做法
linux·ssh
程序开发阿元3 小时前
1C1G 能跑什么:把留常驻服务和不留摆进一张内存表
linux·ssh
国科安芯4 小时前
算力上天之后的电与静:星上边缘计算载荷带外管理网络的低功耗调度与辐射容错
网络·人工智能·嵌入式硬件·安全·边缘计算·低轨卫星·商业航天
wdeok4 小时前
Socket编程UDP-简单的聊天室
网络·网络协议·udp
xbzb5 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮6 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
独隅6 小时前
WebStorm Linux 版安装实战与核心效能展示
linux·ide·webstorm