网络基础

Android

Posted by LXG on August 2, 2023

图解互联网通信

图解TCPIP

交换机

switch_board_1

switch_board_2

由于交换机本身没有 MAC 地址,所以数量超过一定时,每台交换机维护的 MAC 地址表将会变得无法维护, 事实上也无法存储这么大数据的 MAC 地址表。

所以我们需要一种拥有独立 MAC 地址,帮助我们做转发的设备——路由器由此诞生

路由器

router_1

网关

局域网的入口和出口,不同局域网之间沟通必须经过网关

通俗一点的讲:网关就是要去别的网络的时候,把报文首先发送到的那台设备。稍微专业一点的术语,网关就是当前主机的默认路由。

DNS

根据域名查询对应的IP地址

DHCP

固定IP不够用时动态分配IP

MAC地址表

MAC地址表是交换机等网络设备记录MAC地址和端口的映射关系

ARP表

ARP表就是路由器等网络设备记录IP地址和MAC地址对应关系的表项

路由表

路由表就是路由器用于指导数据包如何转发的表项,记录了去往目的IP的下一跳去哪里

ip route


rk3588_s:/ $ ip route help
Usage: ip route { list | flush } SELECTOR
       ip route save SELECTOR
       ip route restore
       ip route showdump
       ip route get [ ROUTE_GET_FLAGS ] ADDRESS
                            [ from ADDRESS iif STRING ]
                            [ oif STRING ] [ tos TOS ]
                            [ mark NUMBER ] [ vrf NAME ]
                            [ uid NUMBER ]
       ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
             [ ttl-propagate { enabled | disabled } ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ]
	    [ dev STRING ] [ weight NUMBER ] NHFLAGS
FAMILY := [ inet | inet6 | ipx | dnet | mpls | bridge | link ]
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]
           [ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]
           [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
           [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
           [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
           [ pref PREF ] [ expires TIME ]
TYPE := { unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
PREF := [ low | medium | high ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local ]
ENCAPHDR := [ MPLSLABEL | SEG6HDR ]
SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup]
SEGMODE := [ encap | inline ]
ROUTE_GET_FLAGS := [ fibmatch ]


ip route


rk3588_s:/ $ ip route

192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.95 
192.168.43.0/24 dev eth1 proto kernel scope link src 192.168.43.5

ip rule

使用ip rule命令操作路由策略数据库


rk3588_s:/ $ ip rule
0:	from all lookup local 
10000:	from all fwmark 0xc0000/0xd0000 lookup legacy_system 
11000:	from all iif lo oif dummy0 uidrange 0-0 lookup dummy0 
11000:	from all iif lo oif eth1 uidrange 0-0 lookup eth1 
11000:	from all iif lo oif eth0 uidrange 0-0 lookup local_network 
16000:	from all fwmark 0x10063/0x1ffff iif lo lookup local_network 
16000:	from all fwmark 0x10065/0x1ffff iif lo lookup eth1 
17000:	from all iif lo oif dummy0 lookup dummy0 
17000:	from all iif lo oif eth1 lookup eth1 
17000:	from all iif lo oif eth0 lookup local_network 
18000:	from all fwmark 0x0/0x10000 lookup legacy_system 
19000:	from all fwmark 0x0/0x10000 lookup legacy_network 
20000:	from all fwmark 0x0/0x10000 lookup local_network 
23000:	from all fwmark 0x65/0x1ffff iif lo lookup eth1 
29000:	from all fwmark 0x0/0xffff iif lo lookup eth1 
32000:	from all unreachable

策略0为优先级最高的策略,在数据包进行路由时,首先匹配该数据包是否满足策略0的规则,即所有的数据包去 local路由表中去查找自己的路由方向,没有找到则使用下一优先级的路由策略,这里为10000号策略

ip route list table local


查看local表的路由规则
rk3588_s:/ $ ip route list table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
broadcast 192.168.0.0 dev eth0 proto kernel scope link src 192.168.0.95 
local 192.168.0.95 dev eth0 proto kernel scope host src 192.168.0.95 
broadcast 192.168.0.255 dev eth0 proto kernel scope link src 192.168.0.95 
broadcast 192.168.43.0 dev eth1 proto kernel scope link src 192.168.43.5 
local 192.168.43.5 dev eth1 proto kernel scope host src 192.168.43.5 
broadcast 192.168.43.255 dev eth1 proto kernel scope link src 192.168.43.5

查看main表格的路由规则
rk3588_s:/ $ ip route list table main
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.95 
192.168.43.0/24 dev eth1 proto kernel scope link src 192.168.43.5

路由策略解析

10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system

10000号策略表示所有的数据包(from all),其iptables的mark(32bit)和 0xd0000 按位与之后,所得结果为0xc0000的数据包(fwmark 0xc0000/0xd0000),使用legacy_system路由表进行路由查找(lookup legacy_system)

11000: from all iif lo oif eth1 uidrange 0-0 lookup eth1

所有的数据包,如果是从lo回环接口输入(iif lo),从eth0接口 输出(oif eth1),其uid为0(uidrange 0-0)即系统用户,使用eth1路由表进行路由查找

路由表添加

ip route add 192.168.0.0/24 dev eth0 proto static scope link table eth1

向路由表eth1中添加一条 192.168.0.0/24 dev eth0 路由规则.这样发送到192.168.0网段的数据就会通过eth1出去了。在设备中就可以ping通eth0和eth1两个网络了.

组播

作为IP传输三种方式之一,组播指的是报文从一个源发出,被转发到一组特定的接收者,相同的报文在每条链路上最多有一份。相较于传统的单播和广播,组播可以有效地节约网络带宽、降低网络负载,所以被广泛应用于IPTV、实时数据传送和多媒体会议等网络业务中。

单播是主机间一对一的通讯模式,网络中的设备根据网络报文中包含的目的地址选择传输路径,将单播报文传送到指定的目的地,只对接收到的数据进行转发,不会进行复制。它能够针对每台主机及时的响应,现在的网页浏览全部都是采用单播模式。

组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的组播地址,组播地址不同于单播地址,它并不属于特定某个主机,而是属于一组主机。一个组播地址表示一个群组,需要接收组播报文的接收者都加入这个群组。

IPv4组播地址

multicast

Onvif搜索设备的原理 Onvif客户端向网段内固定的某个组播地址发送一段广播报文,这个组播地址就是:239.255.255.250,端口:3702。