1.计算机网络体系结构和参考模型
1.1 计算机网络分层结构及基本概念
层次划分的必要性:
两个系统中计算机的通信是一个很复杂的过程,为了降低协议设计和调试过程的复杂性,也为了便于对网络进行研究、实现和维护,促进标准化工作,通常对计算机的网络体系结构以分层的方式进行建模。
分层的基本原则:
- 每层都实现一种相对独立的功能,降低大系统的复杂度
- 各层之间界面自然清晰,易于理解,互相交流尽可能少
- 各层功能精确定义独立于具体实现的方法,可以采用最合适的技术来实现
- 保持下层对上层的独立性,上层单向使用下层提供的服务
- 整个分层结构应能促进标准化工作
协议:交换数据规则的集合,它是平行的。
接口:同一结点内相邻两层间交换信息的连接点,每层只能为紧邻的层次之间定义接口
服务:下层为紧邻的上层提供的功能调用,它是垂直的。
1.2 OSI参考模型
国际标准化组织(OSI)提出的网络体系结构模型,称为开放系统互连参考模型,通常简称为OSI参考模型。OSI的层次结构和通信过程如图所示。
-
第一层 物理层
物理传输层的单位是比特,任务是透明的传输比特流,它负责管理电脑通信设备和网 络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等
-
第二层 数据链路层
数据链路层的传输单位是帧,任务是将网络层传来的IP数据报组成帧。功能可以概括为成帧、差错控制、流量控制和传输管理等,实现点到点的通信。
-
第三层 网络层
网络层的传输单位是数据报,主要任务是吧网络层的协议数据单元(分组)从源端传到目的端,为分组交换网上的不同主机提供通信服务。关键是对分组进行路由选择,并实现流量控制、拥塞控制、差错控制和网际互连等功能
-
第四层 传输层
传输层的传输单位是报文段(TCP)或用户数据报(UDP),传输层负责主机中两个进程之间的通信。
-
第五层 会话层
管理主机间的会话进程,包括建立、管理及终止进程间的会话
-
第六层 表示层
数据格式交换、数据加密解密和数据压缩恢复。
-
第七层 应用层
应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如: HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等
在高层次中如:会话层、表示层和应用层的协议数据单元 (PDU:Protocol Data Unit)都是消息 message
范例:
#查看网卡是否启用
[root@centos8 data]# mii-tool -v eth0
SIOCGMIIPHY on 'eth0' failed: Operation not supported
[root@centos8 data]# ethtool eth0
Settings for eth0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Unknown! (255)
Port: Other
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Link detected: yes
[root@centos8 data]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:12:a3:c2 brd ff:ff:ff:ff:ff:ff
1.3 TCP/IP模型
OSI参考模型与TCP/IP参考模型如图:
-
面向连接
分为三个阶段:1.建立连接;2.传输数据;3.释放连接
-
面向无连接
直接进行数据传输
-
OSI先有模型;TCP/IP先有协议,后有模型
5层参考模型:综合了OSI和TCP/IP的优点
2.传输层协议
2.1 传输层介绍
2.1.1传输层功能
-
提供进程与进程之间的逻辑通信
-
复用和分用
复用:应用层所有的应用进程都可以通过传输层再传输到网络层
分用:传输层从网络层接收到数据后交付指明的应用进程
-
对收到的报文进行差错检测
-
传输层的两种协议
2.1.2 传输层的寻址与端口
端口是传输层的接口,用于标识主机中的应用进程
端口长度为16bit,能表示65536个不同的端口号
- 0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用, 22/tcp(ssh), 80/tcp(http), 443/tcp(https)
- 1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用, 1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)
- 49152-65535:动态或私有端口,客户端随机使用端口,范围定 义:/proc/sys/net/ipv4/ip_local_port_range
套接字Socket=主机IP地址+端口号
范例:
#调整客户端的动态端口范围
[root@centos8 data]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@centos8 data]# echo 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 data]# cat /proc/sys/net/ipv4/ip_local_port_range
20000 62000
#找到端口冲突的应用程序
[root@centos8 data]# nc -l 22
Ncat: bind to 0.0.0.0:22: Address already in use. QUITTING.
[root@centos8 data]# ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=910,fd=13))
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=133609,fd=8),("nginx",pid=133608,fd=8))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=976,fd=5))
LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=113712,fd=16))
LISTEN 0 128 [::]:5355 [::]:* users:(("systemd-resolve",pid=910,fd=15))
LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=133609,fd=9),("nginx",pid=133608,fd=9))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=113712,fd=17))
[root@centos8 data]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 976 root 5u IPv4 24095 0t0 TCP *:ssh (LISTEN)
sshd 261372 root 5u IPv4 3935567 0t0 TCP centos8.2:ssh->49.118.65.208:7218 (ESTABLISHED)
sshd 261386 root 5u IPv4 3935567 0t0 TCP centos8.2:ssh->49.118.65.208:7218 (ESTABLISHED)
#判断端口是否正在打开
[root@centos8 data]# < /dev/tcp/127.0.0.1/80
[root@centos8 data]# echo $?
0
[root@centos8 data]# < /dev/tcp/127.0.0.1/8090
-bash: connect: Connection refused
-bash: /dev/tcp/127.0.0.1/8090: Connection refused
[root@centos8 data]# echo $?
1
2.2 TCP协议
2.2.1 TCP协议特性
-
TCP是面向连接的传输层协议
-
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点
-
TCP提供可靠的服务
-
TCP提供全双工通信。
发送缓存:准备发送的数据和已发送但尚未收到确认的数据
接收缓存:按序到达但尚未被接受应用程序的读取的数据和不按序到达的数据
-
TCP面向字节流:TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
2.2.2 TCP报文段首部格式
- URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
- ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规 定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
- PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如 果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来。
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
- 同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文。
- 终止位FIN:FIN=1时,表明此报文段发送方数据已发完,要求释放连接。
- 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
- 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6。
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数。
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…
2.2.3 TCP的连接管理
TCP连接传输三个阶段:
连接建立→数据传送→连接释放
TCP连接建立:
seq为序号段数值为随机,ACK与ack应是同时存在,ack为确认号段。
TCP连接释放:
内核TCP参数优化
参看帮助: 使用man tcp 、也可以访问官网查看 /proc/sys/net目录中对应网络相关文档https://man7.org/linux/man-pages/man5/proc.5.html
2.3 UDP协议
2.3.1 UDP协议特性
无连接,减少开销和发送数据之前的时延
不保证可靠交付
面向报文,适合一次性传输少量数据的网络应用
无拥塞控制
首部开销小,8B,TCP20B
2.3.2 UDP首部格式
3.网络层
3.5 IP地址
3.5.1 IP地址组成
IP地址:全世界唯一的32位/4字节标识符,标识路由器主机的接口。
IP地址={<网络号>,<主机号>}
3.5.2 IP地址分类
私有IP地址:
- A类:10.0.0.0~10.255.255.255
- B类:172.16.0.0~172.31.255.255
- C类:192.168.0.0~192.168.255.255
3.5.3 特殊地址
-
0.0.0.0
0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络
-
255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机
-
127.0.0.1~127.255.255.254
本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包
-
224.0.0.0到239.255.255.255
组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF 路由器,地址 多用于一些特定的程序以及多媒体程序
-
169.254.x.x
如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地址,系统会为主 机分配这样地址
3.5.5 子网掩码
无分类域间路由选择CIDR:
1.消除了传统的A类,B类和C类地址以及划分子网的概念。
CIDR:无类域间路由,目前的网络已不再按A,B,C类划分网段,可以任意指定网段的范围
CIDR记法:IP地址后加上“/”,然后写上网络前缀(可以任意长度)的位数。 e.g. 128.14.32.0/20
2.融合子网地址与子网掩码,方便子网划分。
CIDR把网络前缀都相同的连续的IP地址组成一个 “CIDR地址块”。
范例:
一个主机:172.16.1.100/28
1、此主机所在的网段最多有多少主机?主机数=2^(32-28)-2=14
2、网络ID? IP和子网掩码相与,172.16.1.96
-
10101100 00010000 00000001 01100100
-
11111111 11111111 11111111 11110000
-
10101100 00010000 00000000 01100000
172 16 1 96
3、此网段的主机中最小的IP:172.16.1.97,最大的IP?172.16.1.110
- 10101100 00010000 00000000 01100001
- 10101100 00010000 00000000 01111110
3.5.6 子网划分和超网划分
划分子网:将一个大的网络(主机数多)划分成多个小的网络(主机数少),主机ID位数变少,网络ID 位数变多,网络ID位向主机ID位借位
合并超网:将多个小网络合并成一个大网,主机ID位向网络ID位借位
范例:
中国电信10.0.0.0/8 给32个各省公司划分对应的子网
1)每个省公司的子网的netmask?
2^5>=32 借5位网络ID
8+5=13
255.248.0.0
2)每个省公司的子网的主机数有多少?
2^(32-13)-2=524286
3)河南省得到第10个子网,网络ID?
10.00000 000.0.0/13
10.01001 000.0.0/13
10.72.0.0/13
4)河南省得到第10个子网的最小IP和最大的IP?
10.01001 000.0.1
10.01001 111.11111111.11111110
10.72.0.1---10.79.255.254
5)所有子网中最大,最小的子网的netid?
10.00000 000.0.0/13 10.0.0.0/13
10.11111 000.0.0/13 10.248.0.0/13
4.网络配置
4.1 网络配置命令
4.1.1 ip命令
来自于iproute包,可用于代替ifconfig
格式:
ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT := { link | addr | route }
ip link - network device configuration
set dev IFACE,可设置属性:up and down:激活或禁用指定接口,相当于 ifup/ifdown
show [dev IFACE] [up]::指定接口 ,up 仅显示处于激活状态的接口
ip 地址管理
ip addr { add | del } IFADDR dev STRING [label LABEL] [scope {global|link|host}]
[broadcast ADDRESS]
[label LABEL]:添加地址时指明网卡别名
[scope {global|link|host}]:指明作用域,global: 全局可用.link: 仅链接可用,host: 本机可
用
[broadcast ADDRESS]:指明广播地址
ip address show
ip addr flush
范例:
#禁用网卡
ip link set eth1 down
#网卡改名
ip link set eth1 name wangnet
#启用网卡
ip link set wangnet up
#网卡别名
ip addr add 172.16.100.100/16 dev eth0 label eth0:0
ip addr del 172.16.100.100/16 dev eth0 label eth0:0
#清除网络地址
ip addr flush dev eth0
4.1.2 ss 命令
来自于iproute包,代替netstat,netstat 通过遍历 /proc来获取 socket信息,ss 使用 netlink与内核 tcp_diag 模块通信获取 socket 信息
格式:
ss [OPTION]... [FILTER]
选项:
- -t: tcp协议相关
- -u: udp协议相关
- -w: 裸套接字相关
- -x:unix sock相关
- -l: listen状态的连接
- -a: 所有
- -n: 数字格式
- -p: 相关的程序及PID
- -e: 扩展的信息
- -m:内存用量
- -o:计时器信息
范例:
#显示本地打开的所有端口
ss -l
#显示每个进程具体打开的socket
ss -pl
#显示所有tcp socket
ss -t -a
#显示所有的UDP Socekt
ss -u -a
#显示所有已建立的ssh连接
ss -o state established '( dport = :ssh or sport = :ssh )'
#显示所有已建立的HTTP连接
ss -o state established '( dport = :http or sport = :http )'
[root@centos8 ~]#ss -no state established '( dport = :21 or sport = :21 )'
Netid Recv-Q Send-Q
Local Address:Port Peer Address:Port
tcp 0 0
[::ffff:10.0.0.8]:21 [::ffff:10.0.0.7]:46638
timer:(keepalive,119min,0)
#列出当前socket详细信息
ss -s
4.2 网络配置文件
4.2.1 网络基本配置文件
IP、MASK、GW、DNS相关的配置文件:
/etc/sysconfig/network-scripts/ifcfg-IFACE
/usr/share/doc/initcripts-*/sysconfig.txt
4.2.2 配置当前主机的主机名
#centos6 之前版本
/etc/sysconfig/network
HOSTNAME=
#centos7 以后版
/etc/hostname
HOSTNAME
4.2.3 路由相关的配置文件
/etc/sysconfig/network-scripts/route-IFACE
两种风格:
(1) TARGET via GW
如:10.0.0.0/8 via 172.16.0.1
(2) 每三行定义一条路由
ADDRESS#=TARGET
NETMASK#=mask
GATEWAY#=GW
4.3 多网卡 bonding
将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP 地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址
4.3.1 nmcli实现bonding
#创建名位bond0的绑定
[root@centos8 ~]# nmcli con add type bond con-name bond0 ifname bond0 mode active-backup
Connection 'mybond0' (9301ff97-abbc-4432-aad1-246d7faea7fb) successfully added.
#添加从属接口
[root@centos8 ~]#nmcli con add type bond-slave ifname ens160 master bond0
[root@centos8 ~]#nmcli con add type bond-slave ifname ens192 master bond0
#先启动从属接口
[root@centos8 ~]# nmcli con up bond-slave-ens160
[root@centos8 ~]# nmcli con up bond-slave-ens192
#启动绑定网卡
[root@centos8 ~]# nmcli con up bond0
#生成的相关配置文件
[root@centos8 ~]# ls /etc/sysconfig/network-scripts/
ifcfg-bond0-1 ifcfg-bond-slave-ens160 ifcfg-bond-slave-ens192
#注意:本次是在Vmware虚拟机中进行,还需将ifcfg-bond0-1配置文件中fail_over_mac设定为1,若使用默认选项0,由于mac地址相同,会出现断开一个网卡无法,另一个网卡不能发挥作用情况
[root@centos8 ~]# cat !*ifcfg-bond0-1
cat /etc/sysconfig/network-scripts/ifcfg-bond0-1
BONDING_OPTS="mode=active-backup fail_over_mac=1"
...
5 Ubuntu网络配置
ubuntu在线帮助文档(部分版本支持中文)http://manpages.ubuntu.com/manpages/
ubuntu:focal版本中文帮助文档http://manpages.ubuntu.com/manpages/focal/zh_CN/
5.1主机名
hostnamectl
hostnamectl [OPTIONS...] {COMMAND}
设置主机名
root@ubuntu:~# cat /etc/hostname
ubuntu
root@ubuntu:~# hostnamectl set-hostname ubuntu20
root@ubuntu:~# exit
logout
user1@ubuntu:~$ su - root
Password:
root@ubuntu20:~#
5.2 网卡名称
默认ubuntu的网卡名称和 CentOS 7 类似
设备节点的名字,可以通过"/etc/udev/rules.d/
"里的 udev 文件来配置,规则设置可以参考/usr/share/doc/udev/writing_udev_rules/index.html
更多详细信息可以查看https://www.debian.org/doc/manuals/debian-reference/index.zh-cn.html中文在线文档
#修改配置文件为下面形式
root@ubuntu1804:~#vi /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0"
#或者sed修改
root@ubuntu1804:~# sed -i.bak '/^GRUB_CMDLINE_LINUX=/s#"$#net.ifnames=0"#'
/etc/default/grub
#生效新的grub.cfg文件
root@ubuntu1804:~# grub-mkconfig -o /boot/grub/grub.cfg
#或者
root@ubuntu1804:~# update-grub
root@ubuntu1804:~# grep net.ifnames /boot/grub/grub.cfg
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a-8c14-
fe1a48ba153c ro net.ifnames=0
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a8c14-fe1a48ba153c
ro net.ifnames=0
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a8c14-fe1a48ba153c
ro recovery nomodeset net.ifnames=0
linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a8c14-fe1a48ba153c
ro net.ifnames=0
linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a8c14-fe1a48ba153c
ro recovery nomodeset net.ifnames=0
#重启生效
root@ubuntu1804:~# reboot
5.3 Ubuntu网卡配置
https://ubuntu.com/server/docs/network-configuration
5.3.1 配置自动获取IP
root@ubuntu20:~# man 5 netplan
root@ubuntu20:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: true
version: 2
#使用netplan命令使配置生效
root@ubuntu20:~# netplan apply
5.2.2 配置静态IP
root@ubuntu1804:~#vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.8.10/24,10.0.0.10/8] #或者用下面两行,两种格式不能混用
- 192.168.8.10/24
- 10.0.0.10/8
gateway4: 192.168.8.1
nameservers:
search: [google.com]
addresses: [180.76.76.76, 8.8.8.8, 1.1.1.1]