linux-network

网络协议

网络协议是计算机网络的核心概念。

在计算机网络中,为了使计算机之间能正确传输信息,必须有一条相关的规则、标准,它们被称为网络协议

TCP/IP网络协议标准,已经是Internet网络中的标准语言。

1.开放系统互联参考模型(OSI/RM)

为了提供一个统一的技术标准,国际标准化组织推出了OSI/RM体系结构,描述了一个较完整的网络体系结构,定义了系统的层次结构、每层提供的服务及层间接口。OSI/RM体系结构共包括七层,从低到高分别是物理层、链路层、网络层、传输层、会话层、表示层、应用层。

2.TCP/IP协议

互联网上的计算机之间进行通信最广泛实际使用的协议。

TCP/IP代表TCP协议(传输控制协议)和IP协议(互联网协议),但它实际上是Internet通信协议集的总称,除了TCP协议和IP协议外,还包括了上百个具有独特功能的协议,如:地址解析协议(ARP)、互联网控制报文协议(ICMP)、超文本传输协议(HTTP)、文件传输协议(FTP)等。

TCP/IP的四层结构:

  • 网络接口层:以二进制的数据形式在物理媒介上进行传输数据

  • 互联网层:为数据包选择路由

  • 传输层:提供端对端的接口 IP port

  • 应用层:提供文件传输、邮件、文件共享、数据加密等等

应用层

应用层的任务主要是通过进程间的数据交互来完成特定的网络应用。

对于不同的网络应用需要使用不同的网络协议:域名解析系统用DNS协议,web服务用万维网HTTP协议,邮件传输用SMTP协议。

应用层交互的数据成为报文

DNS

域名解析系统(Domain Name System)是互联网的一个分布式数据库,主要存储IP和域名的对应关系,能够让普通用户更方便地使用互联网,而不必记住繁琐的IP地址号码。

HTTP

超文本传输协议(HyperText Transfer Protocol)是互联网上最为广泛应用的一种网络协议,所有的www万维网都要遵循这个标准,初衷是为了方便发布和接收HTML(前端的网页)文件。

传输层

传输层的作用是向两台主机之间的进程之间进行数据传输。

传输协议主要有:

TCP与UDP

TCP传输控制协议(Transmission Control Protocol),提供面向连接的、可靠的数据传输服务。

UDP用户数据协议(User Datagram Protocol),提供无连接的、尽最大努力的数据传输,但是不保证数据安全性。

两者的区别:

  • UDP是无连接的,TCP是面向连接的(好比打电话,通话前需要先拨号连接上对方,且对方接电话了才能通信,最后需要对方挂掉电话才会断开连接)。

  • UDP只尽力传输,不保证数据可靠性,TCP的安全性很高,有两个传输的端点,是点对点、一对一的形式。

  • UDP是没有报文的,TCP有可靠的报文交互,传输的数据无差错、不重复、不丢失。

  • UDP支持一对一、一对多、多对一、多对多的交互通信。

TCP适合文件传输和电子邮件等,UDP适合音频/视频流媒体和在线游戏。

常用网络命令

ifconfig

用于配置网卡IP地址信息等网络参数信息,或者查看网络接口信息,类似于Windows的ipconfig。还能临时性地配置IP地址、子网掩码、广播地址、网关信息等。

注意ifconfig命令只能用root操作,且可能要单独安装这个命令。

1
yum install net-tools

查看网络地址信息

1
2
3
4
5
6
7
8
9
10
11
12
13
ifconfig
ifconfig ens160

[root@center ~]# ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.26.140 netmask 255.255.255.0 broadcast 192.168.26.255
inet6 fe80::20c:29ff:fe70:bd54 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:70:bd:54 txqueuelen 1000 (Ethernet)
RX packets 22677 bytes 29076706 (27.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12221 bytes 760043 (742.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 48 memory 0x3fe00000-3fe20000

第一块网卡的信息,设备名是ens160,网卡配置文件路径是/etc/sysconfig/network-scripts/ifcfg-ens160,红帽9之后在/etc/NetworkManager/system-connections/ens160.nmconnection
ipv4地址:inet 192.168.26.140
广播地址:broadcast 192.168.26.255
子网掩码地址:netmask 255.255.255.0
RX/TX packets 代表网卡收发的流量数据包大小

指定开启或关闭网卡

关闭网卡,注意不得在服务器上执行

1
ifconfig <device> up/down

修改、设置IP地址

添加一个新IP地址

1
2
ifconfig ens160:0 192.168.26.188 netmask 255.255.255.0 up
ifconfig ens160:0 192.168.26.188/24 up

修改MAC地址

1
ifconfig ens160 hw ether 00:0c:29:70:bd:54

ifconfig命令只是临时修改网络配置,要永久修改还得写入配置文件。

route

路由:计算机之间的数据传输必须经过网络,网络可以直接连接两台计算机,也可以通过一个个节点去连接。路由可以理解为互联网的中转站,网络中的数据包就是通过一个个路由器转发到目的地的。

route命令对Linux内核的路由表进行一个操作。

路由分为静态和动态路由。Linux机器上配置的都是静态路由,由运维人员通过route命令去管理;动态路由无需人为干预,由路由器、交换机自动分配规则而来。

查看路由表信息

1
2
3
4
5
6
7
8
9
10
11
[root@center ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 ens160
192.168.26.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160

[root@center ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.26.2 0.0.0.0 UG 100 0 0 ens160
192.168.26.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160

参数解析:

Destination:网络号,network的意思
Gateway:网关地址,网络是通过该IP出口,如果显示0.0.0.0的ip,表示该路由信息是从本机转发出去的
Genmask:子网掩码地址的表示,IP地址配合子网掩码,才是一个完整的网络信息
Flags:路由标记,标记当前的网络状态

  • U - Up运行的状态
  • G - 这是一个网关路由器
  • H - 这个网关是一个主机
  • !- 表示当前这个路由已经禁止

添加删除网关信息

网关是连接两个不同网络的设备或软件,它能够实现数据在这两个网络之间的转发和转换。在互联网中,网关可以理解为连接内部局域网与外部互联网的出口,负责将内部主机的数据包转发到外部网络,并且将来自外部网络的数据包传递给内部主机。

网关是不经过任何的设定,由路由表最后经过的地址的关口。网络的关口,就好比家里的门一样,数据需要通过这个网关地址才能出外网。

删除default默认路由表

1
route del default

添加一个网关地址

1
route add default gw 192.268.26.2

ip

ip命令是iproute软件包中强大的网络管理工具,具有ifconfig和route命令的作用,查看系统路由、网络设备,设置策略等功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@center ~]# ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { address | addrlabel | amt | fou | help | ila | ioam | l2tp |
link | macsec | maddress | monitor | mptcp | mroute | mrule |
neighbor | neighbour | netconf | netns | nexthop | ntable |
ntbl | route | rule | sr | tap | tcpmetrics |
token | tunnel | tuntap | vrf | xfrm }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec | -j[son] | -p[retty] |
-f[amily] { inet | inet6 | mpls | bridge | link } |
-4 | -6 | -M | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] |
-c[olor]}

ip命令可以操作的对象

OBJECT对象

link 网络设备

address 定义 ipv4 ipv6 的地址

neighbour 查看ARP缓存地址(ARP用于解析MAC地址)

route 路由表对象

madress 多播地址

tunel IP上的通道

ip针对对象要操作的动作,一般增删改查。

查看网络设备信息

1
2
3
4
5
6
ip addr show
ip a # 简写的 ip addr show
# 指定网络设备
ip link show dev ens160
# 显示网络设备详细的数据包统计信息
ip -s link show dev ens160

关闭、激活网络设备

1
ip link set ens160 down/up  # 关闭/启动网卡

更改MAC

1
ip link set ens160 address 00:0c:29:70:bd:54

添加、删除ip信息

一台主机在需要承担多个网络角色或者服务时,可能需要多个IP地址。比如,如果主机同时作为Web服务器、邮件服务器和数据库服务器,那么每个服务可能都需要独立的IP地址来进行通信。此外,在虚拟化环境中,一台物理主机上运行的多个虚拟机也可能会分配到不同的IP地址。

1
2
ip address add 192.168.26.150/24 dev ens160
ip address del 192.168.26.150/24 dev ens160

给网卡添加别名

1
ip address add 192.168.26.150/24 dev ens160 label ens160:1

查看路由表

1
2
3
4
[root@center ~]# ip route
default via 192.168.26.2 dev ens160 proto static metric 100
192.168.26.0/24 dev ens160 proto kernel scope link src 192.168.26.140 metric 100
192.168.26.0/24 dev ens160 proto kernel scope link src 192.168.26.128 metric 100

检查ARP缓存(显示网络邻居的信息),检查MAC地址信息

1
2
ip neighbour
arp -n # 二者差不多

netstat

显示网络连接情况,路由表信息,端口状态等信息。

一个进程服务运行之后,会暴露一个端口号,以及产生响应的进程信息。

查看所有的网络连接情况

1
2
3
netstat -an
# -a 显示所有的套接字信息
# -n 显示数字地址信息而非主机名

常见字段解释

proto 套接字(一个连接情况)使用的协议
Recv-Q 连接这个套接字的用户还未拷贝的字节数
Send-Q 远程主机还未确认的字节数
Local address 套接字本地的地址和端口号
Foreign address 套接字的远程主机地址和端口号
State 套接字的运行情况 LISTEN监听中

记住一些重要的套接字连接情况的参数
ESTABLISHED
套接字有一个有效连接。
SYN_SENT
套接字尝试建立一个连接。
SYN RECV
从网络上收到一个连接请求。
FIN_ WAIT1
套接字已关闭,连接正在断开。
FIN_WAIT2
连接已关闭,套接字等待远程方中止。
TIME_WAIT
在关闭之后,套接字等待处理仍然在网络中的分组
CLOSED
套接字未用。
CLOSE_ WAIT
远程方已关闭,等待套接字关闭。
LAST_ACK
远程方中止,套接字已关闭。等待确认。
LISTEN
套接字监听进来的连接。如果不设置–listening(-L)或者—-all(-a)选项,将不显示出来这些连接。
CLOSING
套接字都已关闭,而还未把所有数据发出。
UNKNOWN
套接字状态未知。

常用的参数组合

1
2
3
4
5
6
7
8
netstat -tunlp  # 查看机器上正在运行的所有端口及其进程情况
# -t 显示出TCP的连接情况
# -u 显示出UDP的连接情况
# -n 不进行dns解析
# -l 只显示正在监听中的套接字情况
# -p 显示出套接字所属的进程和进程名情况
# 127.0.0.1 本地回环地址,用于机器间内部应用通信
# 0.0.0.0 绑定机器所有的网卡地址

检查服务器端口

1
2
3
netstat -tunlp | grep 3306  # MySQL
netstat -tunlp | grep 80 # web服务
netstat -tunlp | grep 443 # https服务

检查路由表情况

1
netstat -rn  # 等同于 route -n

显示网络接口情况

1
2
3
4
5
6
[root@center ~]# netstat -i  # 显示出所有网络接口的列表情况
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1500 0 0 0 0 0 0 0 0 BMU
ens160 1500 83567 0 0 0 23242 0 0 0 BMRU
lo 65536 31 0 0 0 31 0 0 0 LRU

字段解释:
Iface
网络设备的名字
MTU
最大的传输单元,单位是字节
RX-OK/TX-OK
正确接收了多少数据包,发送了多少数据包
RX-ERR/TX-ERR
接收、发送数据包的时候,丢弃了多少数据包
RX-OVR/TX-OVR 由于错误遗失了多少的数据包
Flg标记
L:回环地址
R:这个网络接口正在运行中
U:接口正在处于活动的状态
B:设置了广播地址
M:接收所有的数据包
O:在该接口上禁止arp
P:端对端的连接

CentOS 7 之后出现的网络查看工具 ss

如果没有要安装yum install iproute

1
2
ss -an  # 显示所有的套接字连接情况
ss -tunlp # 显示出所有正在监听中的套接字情况

本文作者:liyijie

本文链接:https://liyijie.cn/2024/linux-network/

文章默认以 署名-非商业性使用-相同方式共享 授权。