01-network
eth:Ethernet 英 /ˈiːθənet/ n. 以太网
1. OSI模型
- 分层解耦
- 开放式系统互联通信参考模型(Open_System_Interconnection_Reference_Model,缩写为OSI)
1. OSI七层参考模型
- 应用层(Application_Layer)
- 提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,SSH,SMTP,POP3,TELNET等
- 表示层(Presentation_Layer)
- 把数据转换为能与接收者的系统格式兼容并适合传输的格式
- 会话层(Session_Layer)
- 负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接
- 传输控制层(Transport_Layer)
- 把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等
- 网络层(Network_Layer)
- 决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络数据。例如:互联网协议(IP)等
- 链路层(Data_Link_Layer)
- 负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等
- 分为两个子层:逻辑链路控制(logic link control,LLC)子层和介质访问控制(media access control,MAC)子层
- 物理层(Physical_Layer)
- 在局部局域网上传送数据帧(data frame),它负责管理计算机通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等
2. TCP/IP精简后5层
- 应用层(用户态)
- http协议:浏览器访问网站
- ssh协议:连接虚拟机
- smtp协议:发邮件
- 传输控制层(内核态,以下)
- tcp协议:面向连接的、可靠传输方式。三次握手,四次分手
- udp协议:没有连接的,不可靠的传输方式
- 网络层
- ip协议
- 链路层
- arp协议
- 点对点协议(PPP,Point-to-Point Protocol)
- 物理层
2. 应用层
- http协议。超文本传输协议(Hyper Text Transfer Protocol)
- ssh协议。安全外壳协议(Secure Shell)
- smtp协议
其他各式各样的应用(用户态),将用户的请求数据(依据http协议)准备好,其他层来传输
cd /proc/$$/fd
# 1. 第一步建立连接
exec 8<> /dev/tcp/www.baidu.com/80
# 2. 第二步才是传送数据(http协议:规范标准)
echo -e 'GET / HTTP/1.0\n' >& 8
cat <& 8
# $$:当前进程id
# fd:文件描述符
[root@localhost ~]# cd /proc/$$/fd
[root@localhost fd]# pwd
/proc/30879/fd
[root@localhost fd]# ll
总用量 0
lrwx------. 1 root root 64 6月 4 17:47 0 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 1 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 2 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 255 -> /dev/pts/0
# 任何进程都有:输入、输出、错误
# System.in, System.out, System.error
# 1. 第一步建立和百度的握手
[root@localhost fd]# exec 8<> /dev/tcp/www.baidu.com/80
[root@localhost fd]# ll
总用量 0
lrwx------. 1 root root 64 6月 4 17:47 0 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 1 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 2 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:47 255 -> /dev/pts/0
lrwx------. 1 root root 64 6月 4 17:48 8 -> socket:[479168] # 增加8输入输出fd
# 2. 第二步才是传送数据(http协议:规范标准)
# >:命令重定向,将前面命令东西转出到后面命令
# & 8:文件描述符8
# echo:打印
# -e:将\n变为换行符
# `GET / HTTP/1.0\n`:http协议请求头最小写法
# /:uri请求资源
# 1.0:协议版本
# /n:必须有
[root@localhost fd]# echo -e 'GET / HTTP/1.0\n' >& 8
# 3. 从fd里取响应数据
[root@localhost fd]# cat <& 8
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 9508
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com;
Content-Type: text/html
Date: Sun, 04 Jun 2023 09:48:22 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=EBC1BC743879C38ED155D6E85CB448A1:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=EBC1BC743879C38ED155D6E85CB448A1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1685872102; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=EBC1BC743879C38ED273D7CEA43C3BB0:FG=1; max-age=31536000; expires=Mon, 03-Jun-24 09:48:22 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 168587210235470154348916788132063570218
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1l
应用层操作,遵循http协议。浏览器请求百度,其实就是对http协议封装
- 如何表示数据
- 如何加密
- ...
3. 传输控制层
- tcp协议。面向连接的可靠的传输方式
- udp协议。不面向连接,不可靠的传输方式
传输控制层其实是创建了各种包,握手包、确认包
1. 三次握手、四次分手
三次握手后,双方才会在内存开辟线程、开辟对象、开辟所有描述符,建立相应资源。现在和应用层数据无关
- 我要握手
- 伸手
- 握(粘连,确认包和数据一起发送)
一台OS创建的端口数量是有限的,65535个。所以分手是必然的
- 我要关连接!
- 关吧
- 你关了吗?
- 关了
- 不可分割:负载均衡,握手和分手之间,不能切换服务器
- (三次握手 => 数据传输 => 四次分手)成为一个最小粒度,不可分割
2. 系统连接命令
形形色色连接,来自于哪里,访问的哪个端口号,具体是哪个进程,负载量多大
netstat -natp
n
:ip地址不要用逻辑名称显示a
:所有t
:tcpp
:pid进程id
- socket:local_ip:port,foreign_ip:port => 有连接状态,及哪个程序在使用
- sshd:ssh表示远程登录。d表示daemon,后台守护进程
[root@localhost ~]# netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
# xshell主进程
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 9130/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 9365/master
# 子进程对应xshell页签
tcp 0 0 192.168.10.10:22 192.168.10.1:52344 ESTABLISHED 30790/sshd: root@pt
tcp 0 0 192.168.10.10:48018 110.242.68.3:80 CLOSE_WAIT 30879/-bash
tcp6 0 0 :::22 :::* LISTEN 9130/sshd
tcp6 0 0 ::1:25 :::* LISTEN 9365/master
4. 网络层
ip协议。负责IP地址,dns用来解析域名和ip的映射,dns是全网的
IP
:通信中的一个节点的坐标。点分字节,一个数字代表一个字节,范围 0 ~ 255NETMASK
:按位与。ip & netmask = 网络号
,没有被描述到的是主机位GATEWAY
:网关,电脑连接的路由器的ipDNS
:将域名解析为ip
[root@localhost network-scripts]# cd /etc/sysconfig/network-scripts
[root@localhost network-scripts]# ll
总用量 232
-rw-r--r--. 1 root root 367 4月 16 00:27 ifcfg-ens33
-rw-r--r--. 1 root root 254 8月 24 2018 ifcfg-lo
...
[root@localhost network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b36f1aaf-4819-49b4-b7d0-92ffbb49ca0c
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.10.10 # ip
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.10.2 # 网关
DNS1=114.114.114.114 # 域名解析
1. route表
网络层:下一跳机制
route -n
- Iface:本机网卡
- ping:ICMP协议,dns会把域名转为真实ip
- 三层以上的设备都会有路由表,连接网络路由表会有两条
- Gateway为0.0.0.0 => 网络号路由。访问局域网内主机。Destination为网络号
- Gateway为路由器ip => 默认路由。访问其他网络。Destination为0.0.0.0
# Genmask & 目标ip => Destination
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface # 物理网卡
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
# dns解析得到真实ip
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=128 time=14.7 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=128 time=15.1 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=3 ttl=128 time=13.7 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 13.716/14.532/15.123/0.612 ms
[root@localhost ~]# ping www.qq.com
PING ins-r23tsuuf.ias.tencent-cloud.net (221.198.70.47) 56(84) bytes of data.
64 bytes from www47.asd.tj.cn (221.198.70.47): icmp_seq=1 ttl=128 time=9.31 ms
64 bytes from www47.asd.tj.cn (221.198.70.47): icmp_seq=2 ttl=128 time=15.6 ms
64 bytes from www47.asd.tj.cn (221.198.70.47): icmp_seq=3 ttl=128 time=15.9 ms
--- ins-r23tsuuf.ias.tencent-cloud.net ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 9.317/13.654/15.957/3.070 ms
5. 链路层
- arp协议。负责MAC地址,用来解析ip和网卡mac地址映射,arp是同一局域网内的
- MAC地址(Media Access Control Address,网卡地址)直译为媒体存取控制位址,也称为局域网地址(LAN Address)、MAC位址、以太网地址(Ethernet Address)、物理地址(Physical Address):每台设备唯一的网络标识,由网络设备制造商生产时写在硬件内部
1. arp表
arp表网卡都会缓存。缓存没有,pkg里目标mac设置为FFFF,交换机将pkg广播。正确的主机会将mac返回,并存到arp
arp -a
# ip和mac地址mapping
[root@bogon ~]# arp -a
? (192.168.90.19) at 60:18:95:4e:c0:91 [ether] on enp2s0
? (192.168.90.27) at f0:18:98:ee:50:06 [ether] on enp2s0
? (192.168.90.13) at 00:e0:4c:81:2e:bc [ether] on enp2s0
? (192.168.90.30) at b0:25:aa:21:f6:3a [ether] on enp2s0
? (192.168.90.52) at a4:53:ee:d0:f3:68 [ether] on enp2s0
gateway (192.168.90.254) at 8c:e6:66:67:75:68 [ether] on enp2s0
? (192.168.90.16) at 54:ee:75:da:5e:7a [ether] on enp2s0
? (192.168.90.10) at a4:53:ee:d0:45:e1 [ether] on enp2s0
? (192.168.90.1) at 68:f7:28:b6:8f:a8 [ether] on enp2s0
...
6. 网络通信总结
结论:TCP/IP协议,基于下一跳的机制
- IP是端点间
- mac是节点间
1. 数据包(pkg)
- 最外层mac地址。下一跳只会改变为每个节点的mac地址
- 中间ip地址
- 最内层port端口号
2. 动态场景分析
1. 主机接入网络
电脑一般是单网卡(告诉别人我来了)
- 主机。send初始pkg
- 源mac、目标mac为FFFF
- 目标ip、源ip为空
- 交换机
- 维护mac表(源mac和网口mapping)
- 识别FFFF,进行广播
- 路由器
- 维护arp表:分配源ip与源mac的mapping
- 响应pkg:源mac、目标mac、目标ip、源ip
- 其他主机,放弃FFFF的pkg
- 交换机
- 维护mac表(源mac与网口mapping)
- 定向转发pkg
- 主机
- pkg源ip即为网关,目标ip即为主机ip
- 维护arp表(WG_ip与WG_mac的mapping)
- 维护route表:默认路由。网络号路由
2. 路由器接入网络
- 网络工程师会配置好各个节点路由表,还有路由学习协议,各个路由器之间可以简单学习附近路由,形成局部拓扑
- 路由器都自带交换机功能,企业级的交换机和路由器是分开的
- 路由器上至少有两个网卡,衔接不同网络,通过路由表
# Genmask & 目标ip => Destination
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface # 物理网卡
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
路由器相当于一个主机接入另一个局域网。1 ~ 4 阶段和《6.2.1. 主机接入网络》一样,5阶段区别
- 维护arp表(下一跳路由WG_ip与WAN_mac的mapping)
- 创建LAN口的网络号
192.168.1
,生成LAN_ip - 维护route表
- 网络号路由。访问局域网内主机(LAN口)。Destination为
192.168.1.0
,Gateway为0.0.0.0
,Iface为LAN网卡 - 默认路由。访问其他网络(WAN口)。Destination为
0.0.0.0
,Gateway为路由器ip,Iface为WAN网卡
- 网络号路由。访问局域网内主机(LAN口)。Destination为
3. 发送请求
- 主机1
- pkg:源mac、源ip、目标ip、目标mac
- 目标ip:DNS解决域名得到目标ip
- 目标mac:通过目标ip在route表mapping,找到下一跳ip,及相应网卡。下一跳ip在arp表mapping,找到下一跳mac
- 交换机
- mac表转发pkg
- 路由器(切换目标mac)
- 目标mac:通过目标ip在route表mapping,找到下一跳ip,及相应网卡。下一跳ip在arp表mapping,找到下一跳mac
- 主机2(局域网)
- 解析pkg
7. 总结
一般的路由器有交换机功能
1. 常识
- 计算机、服务器:7层或者5层
- 交换机:2层,只有mac表。接同一网络
- 路由器:3层,route表、arp表。衔接不同网络
2. 主机两张网卡路由跳转
# 1. 13机,上增加虚拟网卡
ifconfig ens33:3 192.168.88.88/24
# 2. 14机,直接ping不通
ping 192.168.88.88
# 3. 14机增加以13机为GW的route
route add -host 192.168.88.88 gw 192.168.10.10
# 4. 14机,可以ping通
ping 192.168.88.88
# 5. 删除路由
route del -host 192.168.88.88
[root@localhost ~]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 96 bytes 8320 (8.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 96 bytes 8320 (8.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::f2b7:c58e:92b:b4c7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:57:29 txqueuelen 1000 (Ethernet)
RX packets 6105179 bytes 7756722217 (7.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3595448 bytes 9137206545 (8.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 13机,上增加虚拟网卡
[root@localhost ~]# ifconfig ens33:3 192.168.88.88/24
[root@localhost ~]# ifconfig
ens33:3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.88 netmask 255.255.255.0 broadcast 192.168.88.255
ether 00:0c:29:e5:57:29 txqueuelen 1000 (Ethernet)
# ...
# 14机,增加路由。将192.168.10.10作为网关
[root@localhost ~]# route add -host 192.168.88.88 gw 192.168.10.10
# 14机,路由表,Gateway即为《下一跳》网卡的ip。0.0.0.0代表局域网,交换机直连
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.88.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
192.168.88.88 192.168.10.10 255.255.255.255 UGH 0 0 0 ens33
# 14机,联通
ping 192.168.88.88