adb offline

/dev/usb-ffs/adb
ep0
ep1
ep2

配置目录
/sys/kernel/config/usb_gadget/g1
/sys/kernel/config/usb_gadget/g1/configs/c.1
/sys/kernel/config/usb_gadget/g1/functions/ffs.adb

在 Linux-3.8 以后,Android 的内核分支,便去掉了 f_adb,改使用 USB function FS,在用户空间实现 USB adb 功能。

configfs on /sys/kernel/config type configfs (rw,relatime)
mount none cfg -t configfs


adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb

在adbd的初始化流程中,我们在adbd_main()函数中看到有调用usb_init()函数,usb_init()函数就是usb初始化的入口。我们先看看usb_init()函数是如何被调用的:

bool is_usb = false;
if (access(USB_FFS_ADB_EP0, F_OK) == 0) {
    // Listen on USB.
    usb_init();
    is_usb = true;
}


void usb_init() {
    dummy_fd = adb_open("/dev/null", O_WRONLY);
    CHECK_NE(dummy_fd, -1);
    usb_ffs_init();
}

FDN(Fixed Dialling Numbers)

在 EF_UST (USIM Service Table, 6F38) 文件中, 2号服务代表是否支持FDN

当 2号(FDN) 和/或 89号 (eCall Data) 服务启用时,

EF_FND(Fixed Dialling Numnber, 6F3B) 文件必须存在。

0008140001000000000010
12 : Short Message Service Parameters (SMSP) : available
19 : Service Provider Name : available
21 : MSISDN : available
33 : shall be set to ‘1’ : available
85 : EPS Mobility Management Information : available

02000800030000000000
2 : Fixed Dialling Numbers (FDN) : available
20 : User controlled PLMN selector with Access Technology : available
33 : shall be set to ‘1’ : available
34 : Enabled Services Table : available

======================
EF_FDN (Fixed Dialling Numbers)

6F3B
文件条目的内容是 Fixed Dialling Numbers (FDN) 和/或 Supplementary Service Control strings (SSC)

另外EF_FND还 包含 关联网络/承载能力的标识符和 USIM ADF 级 扩展记录的标识符。 它还可能包含相关的 alpha 标记。

如果 USIM 中存在此文件,则EST文件也应存在(用来启用和关闭相关的功能)

1-x Alpha Identifier 可选,一个名字,我们可以用这个更好地分辨一个记录
x+1 BCD number/SSC contents的长度,
x+2 TON 和 NPI
x+3到x+12 Dialling Number/SSC String 共10个字节
x+13 Capability/Configuration2 Record Identifier
x+14 Extension2 Record Identifier

有关所有数据项的内容和编码,请参见 EF_ADN 的相应数据项,但有个例外,就是 扩展记录存储在 EF_EXT2 中。
===================================================================
EF_EST (Enabled Services Table)
6F56

00

==============================
EF_FDNURI (Fixed Dialling Numbers URI)
6FED

mbim

查询sim卡信息

mbimcli -d /dev/cdc-wdm0  -p  --query-subscriber-ready-status
[/dev/cdc-wdm0] Subscriber ready status retrieved:
	      Ready state: 'initialized'
	    Subscriber ID: '4600120896123456'
	        SIM ICCID: '89860112345678'
	       Ready info: 'none'
	Telephone numbers: (1) '+86166'


查询无线电状态

 mbimcli -d /dev/cdc-wdm0 -p  --query-radio-state
[/dev/cdc-wdm0] Radio state retrieved:
	     Hardware radio state: 'on'
	     Software radio state: 'on'

查询信号强度

# mbimcli -d /dev/cdc-wdm0 -p  --query-signal-state 
[/dev/cdc-wdm0] Signal state:
	          RSSI [0-31,99]: '14'
	     Error rate [0-7,99]: '99'
	Signal strength interval: '5'
	          RSSI threshold: '2'
	    Error rate threshold: 'unspecified'

查询注册状态

 mbimcli -d /dev/cdc-wdm0 -p   --query-registration-state
[/dev/cdc-wdm0] Registration status:
	         Network error: 'unknown'
	        Register state: 'home'
	         Register mode: 'automatic'
	Available data classes: 'custom'
	Current cellular class: 'gsm'
	           Provider ID: '46001'
	         Provider name: 'CHN-UNICOM'
	          Roaming text: 'unknown'
	    Registration flags: 'packet-service-automatic-attach'

查询当前分配的IP信息

 mbimcli -d /dev/cdc-wdm0  -p --query-ip-configuration

[/dev/cdc-wdm0] IPv4 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '10.2.72.180/29'
    Gateway: '10.2.72.181'
    DNS [0]: '218.104.111.122'
    DNS [1]: '218.106.127.114'
        MTU: '1400'

[/dev/cdc-wdm0] IPv6 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '2408:843f:ba26:5ab:312a:3c4c:b513:c98e/64'
    Gateway: '2408:843f:ba26:5ab:3dbc:7e6e:c2b7:3019'
    DNS [0]: '2408:8888::8'
    DNS [1]: '2408:8899::8'
        MTU: '1432'

查询包服务状态

 mbimcli -d /dev/cdc-wdm0  -p  --query-packet-service-state
[/dev/cdc-wdm0] Packet service status:
	         Network error: 'unknown'
	  Packet service state: 'attached'
	Available data classes: 'custom'
	          Uplink speed: '1200000000 bps'
	        Downlink speed: '3200000000 bps'

–attach-packet-service Attach to the packet service
–detach-packet-service Detach from the packet service
–connect=

–set-radio-state=on/off

查询连接状态

mbimcli -d /dev/cdc-wdm0  -p   --query-connection-state

[/dev/cdc-wdm0] Connection status:
	      Session ID: '0'
	Activation state: 'activated'
	Voice call state: 'none'
	         IP type: 'ipv4v6'
	    Context type: 'internet'
	   Network error: 'unknown'

流量统计

mbimcli -d /dev/cdc-wdm0  -p  --query-packet-statistics 
[/dev/cdc-wdm0] Packet statistics:
	   Octets (in): '131250057'
	  Packets (in): '184155'
	 Discards (in): '0'
	   Errors (in): '0'
	  Octets (out): '11459167'
	 Packets (out): '111663'
	Discards (out): '0'
	  Errors (out): '0'

手动开启上网

mbim-network /dev/cdc-wdm0 start
mbimcli --device=/dev/cdc-wdm0 --device-open-proxy --set-radio-state=on

ip addr flush dev wwan0
ip -6 addr flush dev wwan0
ip link set wwan0 up

ip addr add 10.2.72.180/29 dev wwan0 broadcast +
ip route add default via 10.2.72.181 dev wwan0
ip link set mtu 1400 dev wwan0

断开连接
mmcli -m 0 –simple-disconnect

列出收到的短信
mmcli -m 0 –messaging-list-sms

导出短信
mmcli -s 0 –create-file-with-data=/tmp/sms0.txt

mmcli -m 0 –enable
mmcli -m 0 –simple-disconnect

QMI UTILS也能用

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-ids
也就是 qmicli -d /dev/cdc-wdm0 -p   --dms-get-ids


qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-manufacturer

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-model

 qmicli --device=/dev/cdc-wdm0 --device-open-proxy   --wds-get-packet-service-status

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --uim-get-card-status





OpenWRT中的GPIO

GPIO 通常用于路由器设备中的按钮或 LED。 它们只能安全地提供(supply)或吸收(sink, 拉到GND)大约 4mA 的最大电流,激活时电压通常为 3.3V。 只有两种状态是可能的:高或低。 根据 GPIO 激活设备的方式,定义低电平有效或高电平有效。

高电平有效:GPIO 为高电平时设备被激活
低电平有效:GPIO 为低电平时设备被激活

在Linux中, GPIO可以通过SysFS接口访问 ( /sys/class/gpio/)

首先,需要得到 gpio的base

cat /sys/class/gpio/gpiochip*/base | head -n1

我的设备上,这个值是0

如果你的设备上,这个值是100, 你设置 GPIO 时,要加上这个base
比如gpio 10 , 就应该设置 100+10=110


将GPIO 51设置为高电平输出

echo "51" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio51/direction
echo "1" > /sys/class/gpio/gpio51/value

用uci控制

uci show system | grep "system.led"

定义在 /etc/config/system

config led 'led_wlan5g'
	option name 'WLAN5G'
	option sysfs 'z6001:wlan5g'
	option trigger 'netdev'
	option mode 'link tx rx'
	option dev 'wlan0'

sysfs中的位置

/sys/class/leds/

查看某个led的触发情况

cat /sys/class/leds/z6001ax:nr_power/trigger
[none] nand-disk timer default-on netdev phy0rx phy0tx phy0assoc phy0radio phy1rx phy1tx phy1assoc phy1radio

发现 none是被选中的,也就是没有触发

临时触发它

echo "default-on" > /sys/class/leds/z6001ax:nr_power/trigger

https://openwrt.org/docs/guide-user/base-system/led_configuration

python接受路由器curl命令put过来的文件

路由器需要备份一些分区文件和radiao校正信息,但是厂家固件的ssh server不支持sftp协议
需要用curl命令将 相关文件上传到 电脑

python3 -m http.server --directory /dev/shm

python自带的http server模块,可以让 路由器很方便地从 电脑中获取文件
但是上传就不行了
Receiving files over HTTP with Python
这篇文章介绍了一段代码,可以很方便地实现我想要的功能

#!/usr/bin/env python

"""Extend Python's built in HTTP server to save files

curl or wget can be used to send files with options similar to the following

  curl -X PUT --upload-file somefile.txt http://localhost:8000
  wget -O- --method=PUT --body-file=somefile.txt http://localhost:8000/somefile.txt

__Note__: curl automatically appends the filename onto the end of the URL so
the path can be omitted.

"""
import os
try:
    import http.server as server
except ImportError:
    # Handle Python 2.x
    import SimpleHTTPServer as server

class HTTPRequestHandler(server.SimpleHTTPRequestHandler):
    """Extend SimpleHTTPRequestHandler to handle PUT requests"""
    def do_PUT(self):
        """Save a file following a HTTP PUT request"""
        filename = os.path.basename(self.path)

        # Don't overwrite files
        if os.path.exists(filename):
            self.send_response(409, 'Conflict')
            self.end_headers()
            reply_body = '"%s" already exists\n' % filename
            self.wfile.write(reply_body.encode('utf-8'))
            return

        file_length = int(self.headers['Content-Length'])
        with open(filename, 'wb') as output_file:
            output_file.write(self.rfile.read(file_length))
        self.send_response(201, 'Created')
        self.end_headers()
        reply_body = 'Saved "%s"\n' % filename
        self.wfile.write(reply_body.encode('utf-8'))

if __name__ == '__main__':
    server.test(HandlerClass=HTTPRequestHandler)

保存为 http_put_server.py

python3 http_put_server.py

在路由器上运行

 curl -X PUT --upload-file mtd0  http://192.168.168.167:8000

另外一些改进版本
https://gist.github.com/darkr4y/761d7536100d2124f5d0db36d4890109
https://gist.github.com/touilleMan/eb02ea40b93e52604938

ModemManager

https://www.freedesktop.org/software/ModemManager/man/latest/mmcli.1.html

-L, –list-modems 列出所有可用的模块

mmcli -L
    /org/freedesktop/ModemManager1/Modem/0 [QUALCOMM INCORPORATED] QUECTEL Mobile Broadband Module

查看4G/5G模块信息

mmcli -m /org/freedesktop/ModemManager1/Modem/0
  -----------------------------------
  General  |                    path: /org/freedesktop/ModemManager1/Modem/0
           |               device id: 176df711bb462.......9f0c
  -----------------------------------
  Hardware |            manufacturer: QUALCOMM INCORPORATED
           |                   model: QUECTEL Mobile Broadband Module
           |       firmware revision: EC20CEFAGR06A10M4G
           |          carrier config: OpenMkt-Commercial-CU
           | carrier config revision: 05011510
           |            h/w revision: 10000
           |               supported: gsm-umts, lte
           |                          cdma-evdo, lte
           |                          lte
           |                          cdma-evdo, gsm-umts, lte
           |                 current: lte
           |            equipment id: 352...818
  -----------------------------------
  System   |                  device: /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
           |                 drivers: qmi_wwan, option
           |                  plugin: quectel
           |            primary port: cdc-wdm3
           |                   ports: cdc-wdm3 (qmi), ttyUSB0 (qcdm), ttyUSB1 (gps), 
           |                          ttyUSB2 (at), ttyUSB3 (at), wwan0 (net)
  -----------------------------------
  Status   |                    lock: sim-pin2
           |          unlock retries: sim-pin (3), sim-puk (10), sim-pin2 (3), sim-puk2 (10)
           |                   state: registered
           |             power state: on
           |             access tech: lte
           |          signal quality: 81% (cached)
 -----------------------------------
  Modes    |               supported: allowed: 4g; preferred: none
           |                 current: allowed: 4g; preferred: none
  -----------------------------------
  Bands    |               supported: egsm, dcs, utran-1, utran-8, eutran-1, eutran-3, eutran-5, 
           |                          eutran-8, eutran-34, eutran-38, eutran-39, eutran-40, eutran-41, 
           |                          cdma-bc0
           |                 current: egsm, dcs, utran-1, utran-8, eutran-1, eutran-3, eutran-5, 
           |                          eutran-8, eutran-34, eutran-38, eutran-39, eutran-40, eutran-41, 
           |                          cdma-bc0

https://ten64doc.traverse.com.au/applications/cellular/

中国大陆5G频谱划分

中国移动 广电移动 共建共享
700M 60M带宽
上行 703~733
下行 758~788
落在 n28频段 (703 – 748 上行 758 – 803 下行)


2.5G频段 100M带宽 2515~2615MHz 另外 2615~2675 暂时用于4g
落在 n41频段 (2496 – 2690 )


4.9G频段
中国移动 100M带宽 4800-4900MHz
中国广电 60M带宽 4900~4960MMHz
落在 n79 频段 (4400 – 5000)

==========================

中国联通 中国电信 共建共享

中国电信 3400M~3500M
中国联通 3500M~3600M
落在 n78 频段 (3300 – 3800)

ICMPv6

参考资料:
https://enupal.com/blog/como-funciona-icmpv6
https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml
http://wiki.webperfect.ch/images/4/49/IPv6_Cheatsheet.pdf

第一条消息: Multicast Listener Report Message v2
类型: 143
RFC: 3810

这些消息被发送到所有节点, 用来向相邻路由器报告 多播侦听器的当前状态或更改多播侦听器或其接口的状态。

MAC层的目标地址是 33:33:00:00:00:16 (IPv6mcast_16)
IP层的目标地址是 FF02::16 (All MLDv2-capable routers)
MLD (Multicast Listener Discovery)


第二条消息: Neighbor Solicitation
类型: 135
RFC: 2461

MAC层目标地址: 33:33:ff:20:70:45
IP层目标地址: ff02::1:ff20:7045 ( 上一个消息中登记的Multicast Address Record Changed to exclude)

声明自己的 本地链路IPV6地址

对邻居发现协议最重要的补充 可能是 形式化参数交换的功能和确定邻居主机存在的方法。 这些任务包括 IPv6 中的新地址解析方法,以及下一跳确定和邻居不可访问检测过程。 它们需要使用两个 ICMPv6 消息:Neighbor Solicitation 和 Neighbor Advertisement 。

邻居请求(Neighbor Solicitation)消息允许设备验证邻居是否存在且可访问,并启动地址解析。 邻居通告(Neighbor Advertisement) 消息确认主机或路由器的存在,并在必要时提供地址信息层。 如您所见,这两条消息类似于路由器通告(router advertisements)和路由器请求(router request )消息,但用途不同,包含不同的参数。


第3条消息: 以自己 fe80::bad0: 的本地链路IPV6地址, 再发 Multicast Listener Report Message v2


第4条消息:Router Solicitation
类型: 133
RFC: 2461

源头 本地链路 FE80::
目标 FF02::2

主机发送此类消息以要求路由器快速生成路由器通告(Router Advertisements )或路由器警告(Router Warnings)。


第4条消息:Router Solicitation
类型: 134
RFC:

源地址 路由器的本地IPV6地址 fe80::b4d2:f3ff:fe22:47a2
目标 主机的本地IPV6 fe80::bad0:b04:e320:7045

通告的选项有
源链路层地址:路由器的MAC地址
MTU: 1400
Prefix information 前缀信息 2408:811f:51cb:2d::
Recursive DNS Server 2408:844f:cb51:2d::c9


第5条: 再发 Multicast Listener Report Message v2
加入新的 exclude地址 ,新生成的接口地址 ff02::1:ff4d:aba8


第6条:再发 Neighbor Solicitation

声明自己的全局IPV6地址:

第7条: 收到路由器发来的 Neighbor Solicitation

第8条: 主机发出 Neighbor Adversisement
类型: 136

目标地址 fe80::b4d2:f3ff:fe22:47a2

告诉读 自己占有 的本地IPV6地址, 以后你们可以用这个地址联系我

第9条: 主机发出 Neighbor Solicitation
这次的源地址是 全局IPV6地址
目的地址: ff02::1:ff00:c9
声明的 target 是自己新的 非隐私IPV6地址

第10条: 主机发出 Neighbor Adversisement
源地址: 新的非隐私IPv6地址

IPV6

无状态地址自动配置(SLAAC)

当连接到IPv6网络上时,IPv6主机可以使用邻居发现协议对自身进行自动配置。当第一次连接到网络上时,主机发送一个链路本地路由器请求(solicitation)多播请求来获取配置参数。路由器使用包含Internet层配置参数的路由器宣告(advertisement)报文进行回应。

在不适合使用IPv6无状态地址自动配置的场景下,网络可以使用有状态配置(DHCPv6),或者使用静态方法手动配置。

IPv6地址可分为三种:

单播(unicast)地址
单播地址标示一个网络接口。协议会把送往地址的数据包送往给其接口。IPv6的单播地址可以有一个代表特殊地址名字的范畴,如链路本地地址(link local address)和唯一区域地址(ULA,unique local address)。单播地址包括可聚类的全球单播地址、链路本地地址等。

任播(anycast)地址
任播像是Unicast(单点传播)与Broadcast(多点广播)的综合。单点广播在来源和目的地间直接进行通信;多点广播存在于单一来源和多个目的地进行通信。
而Anycast则在以上两者之间,它像多点广播(Broadcast)一样,会有一组接收节点的地址列表,但指定为Anycast的数据包,只会发送给距离最近或发送成本最低(根据路由表来判断)的其中一个接收地址,当该接收地址收到数据包并进行回应,且加入后续的传输。该接收列表的其他节点,会知道某个节点地址已经回应了,它们就不再加入后续的传输作业。
以目前的应用为例,Anycast地址只能分配给中间设备(如路由器、三层交换机等),不能分配给终端设备(手机、电脑等),而且不能作为发送端的地址。

多播(multicast)地址
多播地址也称组播地址。多播地址也被指定到一群不同的接口,送到多播地址的数据包会被发送到所有的地址。多播地址由皆为一的字节起始,亦即:它们的前置为FF00::/8。其第二个字节的最后四个比特用以标明”范畴”。
一般有node-local(0x1)、link-local(0x2)、site-local(0x5)、organization-local(0x8)和global(0xE)。多播地址中的最低112位会组成多播组群标识符,不过因为传统方法是从MAC地址产生,故只有组群标识符中的最低32位有使用。定义过的组群标识符有用于所有节点的多播地址0x1和用于所有路由器的0x2。
另一个多播组群的地址为”solicited-node多播地址”,是由前置FF02::1:FF00:0/104和剩余的组群标识符(最低24位)所组成。这些地址允许经由邻居发现协议(NDP,Neighbor Discovery Protocol)来解译链接层地址,因而不用干扰到在区网内的所有节点。

IPv6中有些地址是有特殊含义的:

未指定地址

::/128-所有比特皆为零的地址称作未指定地址。这个地址不可指定给某个网络接口,并且只有在主机尚未知道其来源IP时,才会用于软件中。路由器不可转送包含未指定地址的数据包。

链路本地地址

::1/128-是一种单播绕回地址。如果一个应用程序将数据包送到此地址,IPv6堆栈会转送这些数据包绕回到同样的虚拟接口(相当于IPv4中的127.0.0.1/8)。
fe80::/10-这些链路本地地址指明,这些地址只在区域连线中是合法的,这有点类似于IPv4中的169.254.0.0/16。

链路本地地址前缀具有以下格式:fe80::interface-ID/10
当一个节点启用 IPv6 时自动生成,interface-ID 通常从 48 位 MAC 地址派生而来。

用于单一链路,适用于自动配置、NDP(Neighbor Discovery Protocol,邻居发现协议)等实现,路由器不转发以 fe80 开头的地址到 Link。前 64 位为 fe80::,而后 64 位为 Interface ID。可见,同一个 Link 上的所有 Interfaces 的前 64 位都是相同的,再通过后 64 的 Interface ID 来唯一标识一个 Interface。所以,Link-Local Address 只在 Subnet 中有效,即使 Link 上并没有路由器,Interfaces 之间也是可以通信的。

唯一区域地址

fc00::/7-唯一区域地址(ULA,unique local address)只可用于本地通信,类似于IPv4的专用网络地址10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。这定义在RFC 4193中,是用来取代站点本地位域。这地址包含一个40比特的伪随机数,以减少当网站合并或数据包误传到网络时碰撞的风险。这些地址除了只能用于区域外,还具备全局性的范畴,这点违反了唯一区域位域所取代的站点本地地址的定义。

多播地址

ff00::/8-这个前置表明定义在”IP Version 6 Addressing Architecture”(RFC 4291)中的多播地址, 通过第二段的最后四位来标识多播的 “范畴”。其中有些地址已用于指定特殊协议,例如 ff0X::101 对应所有区域的 NTP 服务器(RFC 2375)。

标志位为 0000 表示是永久保留的组播地址,分配给各种技术使用;标志位为0001 表示是用户可使用的临时组播地址。范围段定义了组播地址的范围,其定义如下:

0001:本地接口范围。
0010:本地链路范围。
0011:本地子网范围。
0100:本地管理范围。
0101:本地站点范围,类似组播的私网地址。
1000:组织机构范围。
1110:全球范围,类似组播的公网地址。

下面是一些组播指定地址:

FF02::1,在本地链路范围的所有节点。
FF02::2,在本地链路范围的所有路由器。
FF02::5,all ospf routers。
FF02::9,所有运行 RIP 的路由器。
FF02::A,所有运行 eigrp 的路由器。
FF05::2,在一个站点范围内的所有路由器。

在创建某个接口的 IPv6 单点传送地址时,内核会自动使该接口成为某些多点传送组的成员。例如,内核会使每个节点都成为 “请求节点” 多点传送组的成员,相邻节点搜索协议使用该组来检测可访问性。内核还自动使节点成为 “所有节点” 或 “所有路由器” 多点传送组的成员。

请求节点多播地址(Solicited-node multicast address)

ff02::1:FFXX:XXXX-XX:XXXX为相对应的单播或任播地址中的三个最低的字节。

IPv4转译地址

::ffff:x.x.x.x/96-用于IPv4映射地址。(参见以下的转换机制)。
2001::/32-用于Teredo隧道。
2002::/16-用于6to4。

ORCHID

2001:10::/28-ORCHID (Overlay Routable Cryptographic Hash Identifiers)(RFC 4843)。这些是不可绕送的IPv6地址,用于加密散列识别。

文件

2001:db8::/32-这前置用于文件(RFC 3849)。这些地址应用于IPV6地址的示例中,或描述网络架构。


邻居发现协议
Neighbor Discovery Protocol简称:NDP或ND, 工作在数据链路层(也有观点认为是第3层协议),负责在链路上发现其他节点和相应的IP地址,并确定可用路由和维护关于可用路径和其他活动节点的信息可达性

邻居发现协议定义了五种ICMPv6类型

路由请求 (Router Solicitation)
路由通告 (Router Advertisement)
邻居请求 (Neighbor Solicitation)
邻居通告 (Neighbor Advertisement)
重定向 (Redirect)


常用名词:

Node(节点):具有 IPv6 地址且接口配置为支持 IPv6 的任何系统。该专业术语适用于主机和路由器。

相邻节点:与本地节点在同一个链路上的 IPv6 节点。

Router(IPv6 路由器):用来转发 IPv6 包的节点。路由器必须至少有一个接口配置为支持 IPv6。IPv6 路由器还可以通过内部网络通告企业的已注册 IPv6 站点前缀。

Host(IPv6 主机):具有 IPv6 地址的节点。IPv6 主机可以有多个配置为支持 IPv6 的接口。与 IPv4 主机一样,IPv6 主机也不转发包。

Link(链路):单一且连续的网络介质,其两端均连接有路由器。包括:以太网、PPP 链路、X.25、帧中继、ATM 等。

链路 MTU:链路能传输的最大单位,即最大的 IPv6 报文字节数。

Subnet(IPv6 子网):IPv6 网络的管理段。与 IPv4 子网的组件一样,IPv6 子网的组件也可以直接对应于链路上的所有节点。必要时,可以在单独的子网中对链路上的节点进行管理。另外,IPv6 还支持多链路子网,在多链路子网上,多个链路上的节点可以是同一个子网的组件。

IPv6 隧道:在一个 IPv6 节点和另一个 IPv6 节点端点之间提供虚拟的点对点路径的隧道。IPv6 支持可手动配置的隧道和 6to4 自动隧道。
边界路由器:位于网络边界的路由器,是通往本地网络外部端点的 IPv6 隧道的一个端点。此路由器必须至少有一个连接到内部网络的 IPv6 接口。对于外部网络,此路由器可以有一个 IPv6 接口或一个 IPv4 接口。

Site(站点):多个 Subnet 构成一个 Site。

路径 MTU:IPv6 源端和目的端之间能传输的最大的 IPv6 报文字节数,通常是路径中所有链路的最小链路 MTU


路由器搜索: 帮助主机查找本地链路上的路由器。
地址自动配置: 使节点能够为其接口自动配置 IPv6 地址。
前缀搜索: 使节点能够搜索已分配给链路的已知子网前缀。节点使用前缀来区分位于本地链路上的目标和那些只能通过路由器来访问的目标。(类似于 IPV4 本地子网概念)
地址解析: 帮助节点确定相邻节点的链路本地地址(如果只给定目标的 IP 地址)。
确定下一个跃点: 使用某种算法来确定本地链路之外的包接受者的跃点的 IP 地址。下一个跃点可以是路由器或目标节点。
相邻节点无法访问检测: 帮助节点确定相邻节点是否不再可以访问。对于路由器和主机,可以重复进行地址解析。
重复地址检测: 使节点能够确定其要使用的地址是否尚未被使用。
重定向: 使路由器能够通知主机要用于到达特定目标的较好的第一个跃点节点。


IPv6 主机能够使用唯一的链路本地地址来自动配置自身的 IPv6 地址,一旦主机获得了 IPv6 地址,它就加入了多个组播组。与该段相关的所有通信仅在那些组播地址上发生。

邻居请求:通过 DHCP 自动获取或手动配置 IPv6 地址之后,主机向 FF02 :: 1/16 多播地址发送邻居请求消息,以此来确定没有 IPv6 地址冲突。
DAD(重复地址检测):当主机不侦听来自段中关于其邻居请求消息的任何内容时,假定段上没有重复地址。
邻居通告:在将地址分配给其接口并使其启动和运行后,主机再次发出邻居通告消息,通知该段上的所有其他主机,它已分配这些 IPv6 地址其接口,其他的主机就不要再继续重复分配了。


一旦主机完成了其 IPv6 地址的配置,它会执行以下操作:

路由器请求:主机 发送路由器请求 FF02 :: 2/16 组播数据包,以了解此链路上所有存在的路由器。它帮助主机将路由器配置为其默认网关。如果其默认网关路由器关闭,主机可以切换到新的路由器,并使其成为默认网关。
路由器通告:当路由器接收到路由器请求消息时,它回应主机,通告它在该链路上的存在。
重定向:路由器收到了主机发出的路由器请求,但它知道自己并不是该主机的最佳网关。在这种情况下,路由器会响应一个重定向消息,告诉主机有一个更好的 “下一跳” 路由器可用。


ICMPv6 报文(作为 IPv6 扩展头部)封装在 L3 报文中,可视为 3 层协议。NDP 在 L3 实现,优点是:可利用 L3 安全特性;可对不同介质的 L2 使用同一种地址解析协议;可使用组播替代广播,减轻 L2 网络压力。