Linux 网络接口命令

网络

ping

向被测试目的主机地址发送ICMP报文并收取回应报文

  • -c:要求回应的次数
  • -i:发送ICMP报文时间间隔
  • -R:记录路由过程
  • -s:数据包大小
  • -t:存活数值(路由跳数限制)

ifconfig

显示、设置网络

  • netmask:设置网卡子网掩码
  • up:启动指定网卡
  • down:关闭指定网络设备
  • ip:指定网卡ip地址

netstat

显示与网络相关的状态信息:查看网络连接状态、接口配置信息、 检查路由表、取得统计信息

  • -a:显示网络所有连接中的scoket
  • -c:持续列出网络状态
  • -i:显示网络界面信息表单
  • -n:直接使用IP地址而不是主机名称
  • -N:显示网络硬件外围设备号连接名称
  • -s:显示网络工作信息统计表
  • -t:显示TCP传输协议连接状况

route

查看、配置Linux系统上的路由信息

traceroute

跟踪UDP路由数据报

  • -g:设置来源来路由网关
  • -n:直接使用IP地址而不是主机名称
  • -p:设置UDP传输协议的通信端口
  • -s:设置本地主机送出数据包的IP地址
  • -w:超时秒数(等待远程主机回报时间)

Linux 网络接口配置

网络配置

HOST

/etc/hostname

设置主机名称,直接填写字符串即可

1
PC-NAME

/etc/hosts

ipd地址-主机名称映射

  • 理论上说,这里主机名称应该是本机称呼,不要求其他主机 /etc/hostname与这里的主机名一致
1
2
3
127.0.0.1 localhost
xxx.xxx.xxx.xxx name
xxx.xxx.xxx.xxx domain.name

DNS Resolver

相关问题

  • Temporary failure in name resolution
    • 问题:可能是DNS服务器配置缺失、错误
    • 场景:$ ping
    • 解决:设置nameserver配置DNS服务器地址

/etc/resolv.conf

域名解析器(resolver)(DNS客户机)配置文件

  • 设置DNS服务器IP地址、DNS域名
  • 包含主机域名搜索顺序
1
2
3
4
nameserver		114.114.114.114		# DNS服务器IP地址
domain localhost # 本地域名
search search_list # 域名搜索列表
sortlist # 允许将得到域名结果进行排序

说明

  • nameserver:可以有多,每行一个ip地址,查询时按照 顺序依次查找
  • domain:声明主机域名
    • 查询无域名主机时需要使用
    • 邮件系统需要使用
    • 未配置则使用主机名
  • search:其参数指明域名查询顺序
    • 查询无域名主机时,将在其参数声明域中分别查找
    • domainsearch不共存,同时存在时,后者覆盖前者
  • sortlist:对得到的域名结果进行特定排序
    • 参数未网络/掩码对时,允许任意排列顺序

系统设置/etc/sysconfig

/etc/sysconfig/network[-scripts]

文件夹包含网卡配置文件

一般linux

  • ifcfg-ethXX:linux默认ethernet网卡配置文件名称
  • ifcfg-wlanXX:无线局域网网卡配置文件名称

CentOS7网卡名称

  • 前两个字符

    • en:Enthernet以太网
    • wl:WLAN无线局域网
    • ww:WWAN无线广域网
  • 第3个字符

    • o<index>:on-board device index number,
    • s<slot>:hotplug slot index number
    • x<MAC>:MAC address
    • p<bus>s<slot>:PCI geographical location/USB port number chain
  • 命名优先级

    • 板载设备:固件、BIOS提供的索引号信息可读:eno1
    • 固件、BIOS提供的PCI-E热拔插索引号可读:ens33
    • 硬件接口物理位置:enp2s0
    • linux传统方案:eth0
    • 接口MAC地址:enxXXXXXXXXXXXXXXXXX,默认不使用, 除非用户指定使用
  • 示例

    • enoXX:主板bios内置网卡
    • ensXX:主板bios内置PCI-E网卡
    • enpXXs0:PCI-E独立网卡
恢复传统命名方式

编辑grub文件,然后使用grub2-mkconfig重新生成 /boot/grub2/grub.cfg,这样系统就会根据传统linux网卡文件 命名方式查找配置文件

1
2
3
	# `/etc/sysconfig/grub`
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# 为`GRUB_CMDLINE_LINUX`增加2个参数

CentOS7配置格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DEVICE=ens33				# 网络连接名称(实际显示的网络名称)
NAME=ens33 # 网卡物理设备名称
TYPE = Ethernet # 网卡类型:以太网
ONBOOT=yes # 开机启动:是
DEFROUTE=yes # 是否设置此网卡为默认路由:是
NM_CONTROLLED=yes # 是否可由Network Manager托管:是

BOOTPROTO=dhcp # 网卡引导协议
# `none`:禁止DHCP
# `static`:启用静态IP地址
# `dhcp`:开启完整DHCP服务
IPADDR=xxx.xxx.xxx.xxx # IP地址
IPV4_FAILURE_FATAL=no # IPV4致命错误检测(失败禁用设备):否
IPV6INIT=yes # IPV6自动初始化:是
IPV6_AUTOCONF=yes # IPV6自动配置:是
IPV6_DEFROUTE=yes # IPV6是否可为默认路由:是
IPV6_FAILURE_FATAL=no # IPV6致命错误检测(失败禁用设备):否
IPV6_ADDR_GEN_MODE=stable-privacy
# IPV6地地址生成模型:stable-privacy

DNS1=xxx.xxx.xxx.xxx # DNS服务器地址1
DNS2=xxx.xxx.xxx.xxx # DNS服务器地址2
PEERDNS=no # 是否允许DHCP获得DNS覆盖本地DNS:否
GATEWAY=xxx.xxx.xxx.xxx # 网关
PREFIX=24 # 子网掩码使用24位
NETMASK=255.255.255.0 # 子网掩码
# 两个参数应该只需要使用一个即可
BROADCAST=

HWADDR=xxxxxxxxxx # 接口MAC地址
# 配置文件都会被执行,`HWADDR`
# 能匹配上硬件,配置才会生效,
# 否则硬件使用默认配置
# 若多个配置文件配置相同`HWADDR`
# 则操作network服务时报错
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 通用唯一识别码:不能相同(注意虚拟机)

PROXY_METHOD=none # 代理方式:无
BROWSER_ONLY=no # 仅浏览器:否

USERCTL=no # 是否允许非root用户控制此设备:否
MASTER= # 主设备名称?
SLAVE= # 从社会名称?
NETWORK= # 网络地址

网络、进程间通信

asyncio

协程与任务

  • 协程包含两层概念

    • 协程函数:定义形式为async def的函数
    • 协程对象:调用协程函数返回的对象
  • 可等待对象:可在await语句种使用的对象

    • 协程对象
    • asyncio.Future:异步调用结果的占位符
      • 以便通过async/await使用基于回调的代码
      • 通过情况下无需在应用层级代码中显式创建Future 对象
    • asyncio.TaskFuture子类,包装coroutine的future
  • 运行协程(对象)的三种方式

    • await阻塞式等待协程执行完毕
      • 只能在async def函数中使用
      • await同样是在事件循环中阻塞执行
    • 将协程对象包装为可并发运行的asyncio.Task,并在事件 循环中并发执行
      • asyncio.create_task
    • asyncio.run()创建、管理事件循环的高层API
      • 启动事件循环执行是真正运行协程对象的开始

asyncio.run

1
def asyncio.run(coro, *, debug=False);
  • 功能:创建新的事件循环并在结束时关闭

    • 执行传入的协程,并返回结果
    • 管理asyncio事件循环、终结异步生成器、关闭线程池
  • 应当被用作asyncio程序的主入口点,理想情况下只被调用一次

  • 同一线程中只能有一个asyncio事件循环运行,若同线程中有 其他事件循环运行,此函数不能被调用

Task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class asyncio.Task(Future):
def __init__(coro,*,loop=None,name=None);
# 1、此方法仅在下轮事件循环中`raise asyncio.CancelledError`
# 给被封包协程,协程自行选择是否取消
# 2、协程等待的`Future`对象同样会被取消
def cancel(msg=None);
bool cancelled();
bool done();
def result();
def exception();
def add_done_callback(callback, *, context=None);
def remove_done_callback(callback);
def get_stack(*, limit=None);
def print_stack(*, limit=None, file=None);
def get_coro();
def get_name();
def set_name(value);
  • Task:用于在事件循环中运行协程,非线程安全
    • 若协程在等待Future对象,Task对象会挂起该协程执行 并等待该Future对象完成再执行
    • 事件循环使用协同日程调度,事件循环每次运行一个Task 对象,Task对象会等待Future对象完成,事件循环会 运行其他Task、回调、执行IO操作
    • 不建议手动实例化Task对象,可以使用高层级的 asyncio.create_task(),或低层级的 loop.create_task()ensure_future()创建
  • asyncio.TaskFuture继承了除Future.set_result()Future.set_exception()外的所有API

create_task

1
def asyncio.create_task(coro, *, name=None);
  • 功能:将协程打包为task,排入日程准备执行

  • 任务会在get_running_loop()返回的循环中执行

    • 若线程中没有在运行的循环则引发RuntimeError
  • python3.7加入,之前版本可以使用asyncio.ensure_future()

gather

1
awaitable asyncio.gather(*aws, return_exception=False)
  • 功能:并发运行aws序列中的可等待对象

    • aws中的某个可等待对象为协程对象,则会自动作为 任务加入日程
    • 若所有等待对象都成功完成,结果将是所有返回值列表, 结果顺序同aws中对象顺序
    • gather被取消,被提交的可等待对象也被取消
    • aws中task、future被取消,将被当作引发 CancelledError处理,gather也不会被取消
  • 参数说明

    • return_exception
      • False:首个异常被传播给等待gather()的任务
      • True:异常和成功结果一样处理并被聚合至结果列表

shield

1
awaitable asyncio.shield(aw);
  • 功能:保护可等待对象防止其被取消

    • aw是协程,则将自动作为任务加入日程
    • 包含shield的协程被取消,aw中的任务不会被取消, 但若aw的调用者被取消,await表达式仍然会 raise CancelledError
    • 若通过其他方式取消aw,则shield也会被取消
  • 希望完全忽略取消操作则需要配合try/except

    1
    2
    3
    4
    try:
    res = await shield(aw)
    except CancelledError:
    res = None

其他

  • Task内省

    1
    2
    3
    4
     # 返回当前运行Task实例,没有则返回`None`
    Task = asyncio.current_task(loop=None)
    # 返回`loop`事件循环未完成Task对象
    Set(Task) = asyncio.current_task(loop=None)
  • Sleep

    1
    coroutine asyncio.sleep(delay, result=None, *, loop=None)

等待超时

wait_for

1
coroutine asyncio.wait_for(aw, timeout);
  • 功能:等待aw可等待对象完成
    • 发生超时则取消任务并raise asyncio.TimeoutError
    • 函数会等待直到aw实际被取消,则总等待时间可能会超过 timeout
    • 可以通过shield避免任务被取消
    • 若等待被取消,则aw也被取消

wait

1
2
(done, pending) asyncio.wait(aws, *, timeout=None,
return_when=ALL_COMPELTED);
  • 功能:并发运行aws并阻塞线程直到满足return_when指定 的条件

    • 超时不会raise asyncio.TimeoutError,而会在返回未 完成的FutureTask
  • 参数

    • return_when
      • FIRST_COMPLETED:任意可等待对象结束、取消时 返回
      • ALL_COMPLETED:所有可等待对象结束、取消时返回
      • FIRST_EXCEPTION:任意可等待对象引发异常结束时 返回,否则同ALL_COMPLETED

as_completed

1
iterator asyncio.as_completed(aws, timeout=None);
  • 功能:并发运行aws中可等待对象,返回协程迭代器,返回的 每个协程可被等待以从剩余可等待对象集合中获得最早下个结果
    • 超时则raise asyncio.TimeoutError
1
2
for coro in asyncio.as_completed(aws):
earliest_result = await coro

其他线程中执行

to_thread

1
coroutine asyncio.to_thread(func, *args, **kwargs);
  • 功能:在不同线程中异步运行函数func
    • argskwargs会被直接传给func
    • 当前contextvars.Context被传播,允许在不同线程中 访问来自事件循环的上下文变量
    • 主要用于执行可能会阻塞事件循环的函数
      • 对于CPython实现,由于GIL存在,此函数一般只能将 IO密集型函数变为非阻塞
      • 对于会释放GIL的扩展模块、无此限制的替代性python 实现,此函数也可以被用于CPU密集型函数

run_coroutine_threadsafe

1
concurrent.futures.Future asyncio.run_coroutine_threadsafe(coro, loop)
  • 功能:向事件循环loop提交协程coro
    • 线程安全
    • 此函数应该从另一个系统线程中调用

socket

ssl

select

selectors

asyncore

asynchat

signal

mmap

RFC

局域网协议

Identification Protocal

Ident协议

  • 如果客户端支持Ident协议,可以在TCP端口113上监听ident请求

    • 基本每个类Unix操作系统都带有Ident协议
  • Ident在组织内部可以很好工作,但是在公共网络不能很好工作

    • 很多PC客户端没有运行Ident识别协议守护进程
    • Ident协议会使HTTP事务处理产生严重时延
    • 很多防火墙不允许Ident流量进入
    • Ident协议不安全,容易被伪造
    • Ident协议不支持虚拟IP地址
    • 暴露客户端用户名涉及隐私问题
  • Ident协议不应用作认证、访问控制协议

Internet协议

ISO9001标准

OSI/RM

物理层

数据链路层

网络层

传输层

会话层

表示层

应用层

硬件

高层设备物理上兼并底层设备功能,逻辑上只考虑其该部分功能

RP repeater

中继器:连接网络线路的装置,信号放大器

  • 最简单的网络互联设备
  • 主要完成物理层功能

功能

  • 双向转发两个网络节点的物理信号
  • 在物理层上按位传递信息
  • 完成信号的复制、调整、放大
  • 延长网络的长度

Hub

集线器:多口中继器

  • 局域网中的星形连接点
  • 实现多台机器之间的互联

功能

  • 基本功能是分发,把一个端口接收到所有信号向所有端口分发
  • 有些在分发前将弱信号重新生成
  • 有些会整理信号的时序以提供所有的端口间的同步数据通信

Bridge

网桥/桥接器:连接两个局域网的存储转发设备

  • 工作在数据链路层
  • 用于完成具有相同、相似体系结构、数量不多LAN的连接

功能

  • 根据MAC地址转发帧

    • 对所接收的信息帧只作少量包装,不做任何修改
    • 可以采用另外一种协议转发信息
    • 网桥有足够大的缓冲空间,以满足高峰期要求
    • 具有寻址、路径选择能力
  • 有效的连接两个LAN

    • 限制本地通信在本网段内
    • 转发相应信号至另一网段

Switch

交换机:采用交换技术增加数据输入输出总和、安装介质的带宽

  • 可以理解为高级的网桥,拥有网桥的功能,性能比网桥强
  • 交换机转发延迟很小,能经济把网络分成小的冲突网域

功能

Router

路由器:网络层上的连接

  • 路由器在网络上处于关键地位
    • 路由器能够跨越不同的网络类型
    • 在逻辑上将整个互联网分割成独立的网络单位

功能

为每个数据帧寻找最佳传输路径,把数据(IP报文)传送到正确的 网络

  • IP数据报的转发,包括数据报的寻址、传送
  • 子网隔离,抑制广播风暴
  • 维护路由表,与其他路由器交换路由信息,这是IP报文转发基础
  • IP数据报的差错处理、简单的拥塞控制
  • 对IP数据报的过滤、记账

Gateway

网关:协议转换器,网络层上具有协议转换功能的设施

  • 网关不一定是一台设备,可能在一台主机中实现网关功能
  • 用于一下场合的异构网络互联
    • 异构型局域网
    • 局域网与广域网的互联
    • 广域网与广域网的互联
    • 局域网与主机相连(主机操作系统、网络操作系统不同时)

分类

  • 协议网关:在使用不同协议的网络区域间做协议转换
  • 应用网关:在使用不同数据格式的网络区域间翻译数据
  • 安全网关:各种技术的融合,有重要且独特的保护作用,处理 范围从协议级过滤到应用级过滤