网络知识
第1章 静态路由配置
1.1 网络
通过介质把物体连接起来能够互相通信称为网络。
1.1.1 网络的重要性
所有的系统都有网络!
我们的生活已经离不开网络。
运维生涯50%的生产故障都是网络故障!
1.1.2 网线 8芯 水晶头反过来
网线制作(线序):568A:绿白-1,绿-2,橙白-3,蓝-4,蓝白-5,橙-6,棕白-7,棕-8。
568B:橙白-1,橙-,绿白-3,蓝-4,蓝白-5,绿-6,棕白-7,棕-8。常用线序
4芯正常可用1236 一根网线正常可以带两台电脑
4芯额外供电 POE设备 反向供电箱--->305米
网线的有线距离100米-->超过100米 加设备 HUB 交换机
1.2 如何通过网络实现多台主机之间的通讯
1.2.1 在两台主机之间需要有传输介质(网线、光纤、无线等)
1.2.2 在两台主机上面需要有网卡设备
在发送信息时:将二进制(数字信号)信息转换为高低电压(电信号) #调至过程
在接收信息时:将高低电压(电信号)信息转换为二进制数(数字信号) #解调过程
1.2.3 在进行数据传输之前,需要协商网络传输速率。
网卡速度参数 100Mbps==100M bit 每秒==每秒钟传输多少个bit(0或1)
100000k==100000000 bit/s=1bit/xxns
网络传输数据单位:比特 bit 1bit=1/8byte
磁盘存储数据单位:字节 byte 1byte=8bit
1.2.4 光纤
多模光纤 传输距离近2公里
单模光纤 传输距离远20公里
1.2.5 无线网络 4G 5G
1.2.6 电脑之间通信需要硬件地址 网卡 唯一标识 出厂就是惟一的 MAC地址16进制
PS: 如果在公网环境或者局域网中MAC两台PC手机平板相同 会出现一台电脑或者两台电脑没网络
PS:如果局域网内的MAC和路由器的MAC相同 整个局域网无法上网
1.2.7 电脑之间通信还需要逻辑地址 IP地址 (可变)
网络的传输单位:
网卡传输的速率 100Mbps==100M bit 每秒==每秒钟传输多少个bit(0或1)
我家买了一个100M 的带宽 但是我DIAN测试没有达到100M?
100Mb bit 1/8字节
1Byte=8bit
磁盘的计算单位:
100Mbit=12.5MB
1.3 交换机 只负责数据转发 没有路由的功能 不能配置IP地址
1.3.1 在数据前面设置目标地址和源地址,目标地址和源地址用mac地址进行标识
mac称为物理地址,每块网卡上都有的一个标识身份信息的
mac地址全球唯一,不能进行修改,mac地址用16进制标识
1.3.2 在网络通讯初期,会利用广播方式进行发送数据包,在通讯的过程,数据包的发送一定是有去有回的。
在一个交换网路中,如果产生了大量广播数据包时会产生广播风暴,影响主机性能,这样的问题称为广播风暴问题
#解决广播风暴问题思路:
减少广播产生数量,将一个大的交换网络切割为几个小的交换网络(局域网,广播域)
1.3.3 交换机的种类
傻瓜交换机(TP-link/Dlink/水星...)
程控交换机(存储程序控制交换机,配置管理,思科、华为、华三)
1.4 路由器 进行路由的选择 隔离广播域 可以配置IP地址
IP地址由两部分组成: 交换网络标识信息+主机地址标识信息===网段地址+主机地址
192.168.1 网段 网络标识
63 主机地址
1.4.1 需要有身份标识信息:ip地址
逻辑地址(可以改变的地址/???) 利用10进制方式进行显示
IP地址由两部分组成: 交换网络标识信息+主机地址标识信息===网段地址+主机地址
内网卡---交换机 192.168.11.0/24(192.168.11.1~192.168.11.254)
外网卡---运营商 122.71.227.79(铁通)
1.4.2 查公网ip的方法
Windows打开浏览器,访问百度,搜IP即可
linux:curl ifconfig.me
高级路由器还有上网行为管理器和防火墙功能
论坛:鸿鹄论坛(网络工程师)
1.4.3 路由实现数据传输通讯时,会根据路由表信息进行数据包路由
实现不同网段之间通讯需要经过一条必经之路,这条路称为网关
1.5 路由器静态路由配置
路由器维护者路由表信息
路由器1:
网络标识1 IP地址 网关
192.168.1 1.254
192.168.2 2.254
路由器1配置:
1
2
3
4
5
6
|
Router> # 命令提示符 用户模式 只能操作部分命令 Router> enable # 进入特权模式 在特权模式查看大部分的配置 ? 查看所有当前模式可以执行命令 Router #show ip route # 查看路由表信息 路由器配置接口IP地址 从特权模式 进入到配置模式 简写config t Router #configure terminal (conf t) Router(config) # # 配置模式 |
1.5.1 第一步:进入路由器的网卡 PS: exit 退出到上一个模式
1
2
3
4
5
|
Router(config) #interface gigabitEthernet 0/0 Router(config- if ) # # 进入到了g0/0 outer(config- if ) #ip ad |
1.5.2 第二步: 配置IP地址和子网掩码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Router(config- if ) #ip address ? A.B.C.D IP address dhcp IP Address negotiated via DHCP Router(config- if ) #ip address 192.168.1.254 ? A.B.C.D IP subnet mask Router(config- if ) #ip address 192.168.1.254 255.255.255.0 ? <cr> Router(config- if ) #ip address 192.168.1.254 255.255.255.0 |
1.5.3 第三步: 启动网卡
1
2
3
4
5
6
7
|
Router(config) #interface gigabitEthernet 0/0 Router(config- if ) #no Router(config- if ) #no shu Router(config- if ) #no shutdown |
1.5.4 第四步: 查看配置
在特权模式下查看
1
|
Router #show interfaces gigabitEthernet 0/0 |
在特权模式下pingIP地址 出现.代表不通 出现!代表可以通信
1
2
3
4
5
6
7
8
9
10
|
Router #ping 192.168.1.1 .!!!! Success rate is 80 percent (4 /5 ), round-trip min /avg/max = 0 /0/1 ms Router(config) #interface g0/1 Router(config- if ) #ip add Router(config- if ) #ip address 192.168.2.1 255.255.255.0 Router(config- if ) #no shu Router(config- if ) #no shutdown Router(config- if ) # %LINK-5-CHANGED: Interface GigabitEthernet0 /1 , changed state to up |
修改路由器的提示符名称
1
2
3
4
|
Router(config) #hostname R3 R3(config) # R3(config) # R3(config) # |
--------------------------------------
路由器
家用路由器: TP-Link 腾达 小米 华为 穿墙王...
企业路由器: CISCO 华为 锐捷 中兴 H3C 瑞斯康达...
路由器维护者路由表信息
路由器R1:
1
2
3
4
5
6
7
|
网络标识1 IP地址 网关 192.168.1 1.254 G0 /0 ----> pc---IP 192.168.1.1----4.254通信 192.168.2 2.254 G0 /2 S 192.168.4.0 via 192.168.2.2 |
路由器R2:
1
2
3
4
|
192.168.2 2.2 G0 /0 192.168.3 3.1 G0 /1 S 192.168.4.0 via 192.168.3.2 S 192.168.1.0 via 192.168.2.1 |
路由器R3:
1
2
3
|
192.168.3 3.2 G0 /0 192.168.4 4.254 G0 /1 ------> 1.1 找到了 4.1 给1.1进行回复 S 192.168.1.0 via 192.168.3.1 |
数据包不知道下一步该往哪里走? 我们手动给它指定方向道路 称为静态路由
静态路由配置命令格式:
ip route add 去哪里 指定哪里走
网络中的称呼: 在做回来的路由配置时候 称为路由回指(指定下个接口的IP地址,自身的不用指定)
配置静态路由:
R1配置 下个接口的IP地址 称为 下一跳
1
|
R1(config) #ip route 192.168.4.0 255.255.255.0 192.168.2.2 |
R2配置
1
2
|
R2(config) #ip route 192.168.4.0 255.255.255.0 192.168.3.2 R2(config) #ip route 192.168.1.0 255.255.255.0 192.168.2.1 |
R3配置
1
2
|
R3(config) #ip route 192.168.1.0 255.255.255.0 192.168.3.1 192.168.1.0 255.255.255.0 可用IP地址1-254 我指定的静态路由可以和局域网192.168.1.1-192.168.1.254 任意的主机通信 |
取消静态路由:
1
|
no ip route 192.168.1.0 255.255.255.0 192.168.3.1 |
1.6 动态路由:
rip ospf BGP EIGRP(CISCO) ISIS
路由器1配置:
1
2
3
4
5
6
|
Router> # 命令提示符 用户模式 只能操作部分命令 Router> enable # 进入特权模式在特权模式查看大部分的配置 ? 查看所有当前模式可以执行命令 Router #show ip route # 查看路由表信息 路由器配置接口IP地址 从特权模式 进入到配置模式 简写config t Router #configure terminal Router(config) # # 配置模式 |
1.6.1 第一步:进入路由器的网卡 PS: exit 退出到上一个模式
1
2
3
|
Router(config) #interface gigabitEthernet 0/0 Router(config- if ) # # 进入到了g0/0 outer(config- if ) #ip add |
1.6.2 第二步: 配置IP地址和子网掩码
1
2
3
4
5
6
7
8
|
Router(config- if ) #ip address ? A.B.C.D IP address dhcp IP Address negotiated via DHCP Router(config- if ) #ip address 192.168.1.254 ? A.B.C.D IP subnet mask Router(config- if ) #ip address 192.168.1.254 255.255.255.0 ? <cr> Router(config- if ) #ip address 192.168.1.254 255.255.255.0 |
1.6.3 第三步: 启动网卡
1
2
3
4
|
Router(config) #interface gigabitEthernet 0/0 Router(config- if ) #no Router(config- if ) #no shu Router(config- if ) #no shutdown |
1.6.4 第四步: 查看配置
在特权模式下查看
1
|
Router #show interfaces gigabitEthernet 0/0 |
在特权模式下pingIP地址 出现. 代表不通 出现!代表可以通信
1
2
3
4
5
6
7
8
9
10
|
Router #ping 192.168.1.1 .!!!! Success rate is 80 percent (4 /5 ), round-trip min /avg/max = 0 /0/1 ms Router(config) #interface g0/1 Router(config- if ) #ip add Router(config- if ) #ip address 192.168.2.1 255.255.255.0 Router(config- if ) #no shu Router(config- if ) #no shutdown Router(config- if ) # %LINK-5-CHANGED: Interface GigabitEthernet0 /1 , changed state to up |
--------------------------------------------------------------------------
修改路由器的提示符名称
1
2
|
Router(config) #hostname R3 R3(config) # |
1.7 路由器的分类
家用路由器: TP-Link 腾达 小米 华为 穿墙王...
企业路由器: CISCO 华为 锐捷 中兴 H3C 瑞斯康达...
动态路由: 动态的自动的去学习路由
RIP OSPF BGP EIGRP(CISCO) ISIS
初始路由表信息:
路由器R1:
网络标识1 IP地址 网关
1
2
3
4
|
192.168.1 1.254 G0 /0 192.168.2 2.254 G0 /2 R 192.168.3.0 /24 via 192.168.2.2 R 192.168.4.0 /24 [120 /2 ] via 192.168.2.2 |
路由器R2: 学习(RIP)
1
2
3
4
|
192.168.2 2.2 G0 /0 192.168.3 3.1 G0 /1 R 192.168.1.0 /24 via 192.168.2.1 R 192.168.4.0 /24 [120 /1 ] via 192.168.3.2, 00:00:09 |
路由器R3: 学习(RIP)
1
2
3
4
|
192.168.3 3.2 G0 /0 192.168.4 4.254 G0 /1 R 192.168.1.0 /24 [120 /2 ] via 192.168.3.1 R 192.168.2.0 /24 [120 /1 ] via 192.168.3.1 |
配置RIP动态协议 最短路径优先 最大只支持16
1)取消静态路由
1
2
3
4
5
|
no ip route 192.168.4.0 255.255.255.0 192.168.3.2 no ip route 192.168.1.0 255.255.255.0 192.168.2.1 no ip route 192.168.2.0 255.255.255.0 192.168.3.1 no ip route 192.168.1.254 255.255.255.255 192.168.3.1 no ip route 192.168.1.1 255.255.255.255 192.168.3.1 |
2) 配置RIP协议
1
2
3
4
5
6
7
8
9
10
11
12
13
|
R1: R1(config) #route rip R1(config-router) #network 192.168.1.0 R1(config-router) #network 192.168.2.0 R2: R2(config) #route rip R2(config-router) #network 192.168.2.0 R2(config-router) #network 192.168.3.0 R3: R3(config) #route rip R3(config-router) #network 192.168.3.0 R3(config-router) #network 192.168.4.0 OSPF-->BGP--> 路由重发布 案例 运营商网络缓存案例 |
第2章 网络架构
2.1 网络层次结构
核心层:主要部署路由器设备,用于连接外网线路,还要具备冗余能力(安全备份)
汇聚层:主要部署三层交换设备,用于相应安全访问控制 进行链路汇聚
接入层:主要部署二层交换设备,用于终端设备接入.
基本网络层次划分示意图
2.2 网络类型
局域网:本地私有的一个网络范围。规模较大的局域网,也会称为园区网。
城域网:网络的覆盖面积达到了一个城市,就可以称为城域网。
广域网:覆盖面积达到了全国或全球,就称为广域网,全球最大的广域网就是Internet互联网。
2.3 网络层次模型(OSI7模型)
OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
OSI7层模型(公司的组织架构)
层次模型结构:由上置下
管理部 公司决策 应用层
行政部 传达领导要求 组织活动 表示层
财务部 发工资 公司账目 会话层
市场部 推广宣传 传输层
销售部 销售产品 网络层
物流部 运输产品 数据链路层
仓储部 保存看管物品 物理层
每一个层级对应每一个层级,不能跨沟通
层次模型结构: 由上至下
2.4 OSI七层模型功能介绍
2.5 OSI七层模型详解
2.5.1 应用层
作用: 主要就是提供应用程序可以接入网络接口,并根据程序的不同对应不同的接口协议。
2.5.2 表示层
2.5.3 会话层
2.5.4 传输层
负责网络中端到端的连接(TCP、UDP)
2.5.5 网络层
2.5.6数据链路层
2.5.7 物理层
Layer1物理层:物理层标准规定了信号、连接器和电缆要求、接口类型、线缆类型、设备(集线器hub)。
单工:(广播电台)通讯时候。只有一方作为发送方,另一方作为接受方.
半双工:(对讲机) 通讯的某一时刻,只有一方作为发送方,另一方作为接受方,通讯时刻发生转变,发送方可以变为接收方,接收方可以变为发送方.
全双工:(电话) 同一时刻,双方皆可以是发送方,又可以是接收方.
2.6 数据包封装与解封装
2.6.1 封装
封装过程:由上至下进行封装
应用层、表示层、会话层 PDU 数据
传输层:分段 TCP协议
网络层:打包 TCP协议+IP地址
数据链路层:成帧 TCP协议+IP地址+MAC地址
物理层:位 数据成为比特
2.6.2 解封装
拆包过程:由下至上进行拆包
物理层:位 比特
数据链路层:查看MAC地址
网络层:查看IP地址
传输层:查看TCP协议
前三层:数据内容
不知名端口:1024以上的端口称为不知名端口
cat /proc/sys/net/ipv4/ip_local_port_range
2.7 TCP/IP模型(4层模型)
2.7.1 OSI7层模型与TCP/IP模型(DOD)对应关系
2.7.2 TCP/IP 协议簇相关协议汇总
TCP协议: 传输控制协议 --- 面向连接的网络协议
在线发送文件==面向连接
发送文件 --> 对端点击接收
优点: 数据传输可靠性高
缺点: 数据传输效率低
UDP协议: 用户报文协议 --- 无连接的网络协议
离线发送文件==无连接
发送文件 --> 直接发送了
优点: 数据传输效率高
缺点: 数据传输可靠性低
QQ离线传输文件/在线传输文件: TCP协议
在线传输
PC 传输文件 - 交换机 - 检查目标QQ主机是否在局域网中
路由器 - 目标主机
离线传输
PC 传输文件 - 互联网 - QQ公司服务器(临时存储服务器) --- 对端QQ是否登录在线
2.7.3 应用层协议介绍
FTP 21 明文协议,文件传输协议,基于TCP
TFTP 69 简单文件传输协议,基于UDP
SSH 22 安全外壳协议,远程连接,加密
Telnet 23 明文协议,远程连接
SNMP 161/162 简单网络管理协议,基于UDP
SMTP 25 简单邮件传输协议,基于TCP
HTTP 80 超文本传输协议
HTTPS 443 超文本传输安全协议
DHCP 67/68/546 动态主机设置协议,C(67),S(68),546(V6)
DNS 53
2.8 DHCP原理图
DHCP 动态获取IP地址
服务器是否需要DHCP功能?
访问网站--->访问IP地址--->MAC地址
域名--->IP进行绑定
局域网中使用DHCP服务
ICMP(在防火墙中禁止了ICMP协议 其他所有的用户 都无法ping通 禁ping)
禁traceroute
APR解析: 地址解析协议 把IP地址解析成MAC地址
DNS称为域名系统,在网站运行中起到了至关重要的作用,主要作用是负责把网站域名解析为对应的IP地址。
一般域名提供商,提供的dns服务器,都是走udp53端口的。
2.9 DNS解析过程
2.9.1 域名解析
举个例子,https://www.baidu.com,这个其实并不是域名,其中https是指协议,去掉https后www.baidu.com.(注意最后面有一个点号)才是真正的域名。
每个域名的最后面都有一个点号 "." 表示根域名,为了方便在实际使用的时候被省略了。
根域名的下一级就是顶级域名了,.com 也就是顶级域名,常见的顶级域名后缀有.com、.cn、.net、.org 等,这些都是固定的,用户不能自己修改,只能选择。
顶级域名的下一级又是权威域名,如baidu.com中的.baidu,这个权威域名就是我们自己可注册的域名。
顶级域名下就是主机名了,www是指主机名,这个是我们可以自己定义的,通常在http服务器如nginx中可以修改。
下面就还以www.baidu,com这个网址来分析一下dns的解析过程。
当浏览器拿到输入的www.baidu.com后,首先会去浏览器的dns缓存中去查询是否有对应记录,如果查询到记录就可以直接返回ip地址,完成解析。
如果浏览器没有缓存,那就再去查询操作系统的缓存,同样的,如果查询到记录就可以直接返回ip地址,完成解析。
如果操作系统也没有缓存,那就再去查看本地host文件,Windows下host文件一般位于 "C:\Windows\System32\drivers\etc"。
近几年网上流传的通过修改本地host文件来避免双11女友剁手的段子,其实就是将淘宝的支付接口解析到错误的ip地址,从而导致支付不成功。
如果本地host文件也没有相应记录,那就需要求助于本地dns服务器了,所以应该要知道本地dns的ip地址。
本地dns服务器ip地址一般是由本地网络服务商如移动、电信提供,一般是通过DHCP自动分配,当然你也可以自己手动配置。目前用的比较多的是谷歌提供的公用dns 8.8.8.8和国内的公用dns 114.114.114.114及阿里的223.5.5.5。
你之前可能有遇到过电脑可以正常上QQ但是就是不能打开网页的怪现象,这种情况大多数可能就是dns域名解析出问题了,你可以尝试手动把dns设置为公用dns。
找到本地dns后,它也会先去查询一遍它自己的缓存,如果有记录就返回,如果没有记录,它将开始要去我们前面提到的根域名服务器查询了。注意由于根域名服务器ip地址一般都是固定的,所以本地dns服务器一般都内置了根域名服务器ip地址。https://www.uedbox.com/post/50977/
目前全球一共有13个根域名服务器(这里并不是指13台服务器,是指13个ip地址,按字母a-m编号),为了能更高效完成全球所有域名的解析请求,根域名服务器本身并不会直接去解析域名,而是会把不同的解析请求分配给下面的其他服务器去完成,下面是dns域名系统的树状结构图。
注意dns域名服务器一般分三种,分别是根域名服务器(.)、顶级域名服务器(.com)、权威域名服务(.baidu.com) 。
当根域名接收到本地dns的解析请求后,发现是后缀是.com,于是就把负责.com的顶级域名服务器ip地址返给本地dns。
本地dns拿着返回的ip地址再去找到对应的顶级域名服务器,顶级域名又把负责该域名的权威服务器ip返回去。
本地dns又拿着ip去找对应的权威服务器,权威服务器最终把对应的主机ip的解析记录(俗称A记录)返回给本地dns。
本地dns会将解析后的ip地址信息进行缓存,缓存好将A记录信息返回给客户端。
客户端收到本地dns响应的A记录信息,会将A记录缓存到本地,然后使用解析后的ip地址访问www.baidu.com。
至此就完成了域名解析的全过程。
下面用一张图来展示上面迭代查询的过程。
解析期间涉及到两个特殊查询:
客户端---本地dns缓存:递归查询
本地dns服务器---根域名服务器 顶级域名服务器 权威域名服务器:迭代查询
所谓递归查询过程就是 “查询的递交者” 更替, 而迭代查询过程则是 “查询的递交者”不变。
A记录:
从域名到IP的解析过程,被称为A记录;www.baidu.com---1.1.1.1
获取A记录命令方法:
1) dig www.baidu.com
dig @223.5.5.5 www.baidu.com +trace ---显示完整DNS解析过程
2) nslookup www.baidu.com
3) host www.baidu.com
4) ping www.baidu.com
2.10 主机到主机层协议介绍
TCP: 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
特点:面向连接,可靠,传输效率低.
应用场景:web浏览器,电子邮件,文件传输程序.
UDP: 用户数据报协议,属于无连接的传输协议.
特点:无连接、不可靠、快速传输.
应用场景:域名系统(DNS),视屏流,IP语音(VOIP).
TCP UDP协议端口号范围 1 - 65535 (可以的),真正端口号总数为2的16次方=65536
面向连接:是指通信双方在通信时,要事先建立一条通信线路,其有三个过程:建立连接、使用连接和释放连接。
面向无连接:是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输。
2.11 控制字段介绍
ACK:表示确认控制字段,确认数据是否接收到.
SYN:表示请求建立连接字段,和主机建立连接时使用.
FIN:表示请求断开连接字段,和主机断开连接时使用.
PSH: 表示有DATA数据传输,PSH为1表示的是有真正的TCP数据包内容被传递
RST: 表示连接重置。一般是在FIN之后才会出现为1的情况,表示的是连接重置。
seq序列号:将大的数据进行拆分后标记序列信息,便于接收方将拆分后的数据信息进行组装,在原有序列号基础上+1进行回复,告知发送方下次再给我发送的数据是什么.
2.12 TCP三次握手
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。
刚开始, 客户端和服务器都处于CLOSED状态.
此时, 客户端向服务器主动发出连接请求, 服务器被动接受连接请求.
1. TCP服务器进程先创建传输控制块TCB, 时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态.
2. TCP客户端进程也是先创建传输hu控制块TCB, 然后向服务器发出连接请求报文,此时报文首部中的同步标志位SYN=1, 同时选择一个初始序列号seq = x, 此时TCP客户端进程进入了SYN-SENT(同步已发送状态)状态。TCP规定, SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
3. TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文。确认报文中的ACK=1, SYN=1, 确认序号是x + 1, 同时也要为自己初始化一个序列号seq = y, 此时TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据, 但是同样要消耗一个序号。
4. TCP客户端进程收到确认后还要向服务器给出确认。确认报文的ACK=1,确认序号是y + 1,自己的序列号是x + 1。
5. 此时TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
举个例子:
TCP三次握手好比在一个夜高风黑的夜晚,你一个人在小区里散步,不远处看见小区里的一位漂亮妹子迎面而来,但是因为路灯有点暗等原因不能100%确认,所以要通过招手的方式来确定对方是否认识自己。
你首先向妹子招手(syn),妹子看到你向自己招手后,向你点了点头挤出了一个微笑(ack)。同时妹子也向你招了招手(syn),你看到妹子向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack)。
于是两人加快步伐,走到了一起。
我们来回顾一下,这个过程中总共有四个动作,
你招手
妹子点头微笑
妹子招手
你点头微笑
其中妹子连续进行了两个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上我们可以将这两个动作合成一个动作,招手的同时点头和微笑(syn+ack)。于是这四个动作就简化成了三个动作。
你招手
妹子点头微笑并招手
你点头微笑
这就是三次握手的本质,中间的一次动作是两个动作的合并。通过这个案例,不知你对TCP三次握手,有没有进一步的理解。
2.13 TCP四次挥手
数据传输完毕后,双方都可以释放连接.
此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接.
1. 客户端进程发出连接释放报文,并且停止发送数据。
释放数据报文首部,FIN=1,其序列号为seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2. 服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为 u + 1,并且带上自己的序列号seq = v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。
TCP服务器通知高层的应用进程,客户端向服务器请求了断开连接,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3. 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)。
4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,确认序号为v + 1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq = w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w + 1,而自己的序列号是u + 1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
小知识点:在网络传输层,tcp模块中有一个tcb(传输控制模块,transmitcontrolblock),它用于记录tcp协议运行过程中的变量。对于有多个连接的tcp,每个连接都有一个tcb。tcb结构的定义包括这个连接使用的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列、应用层输出队列、tcp的重传有关变量。
2.13.1 TCP四次挥手的原因
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,主机1收到主机2的FIN报文段时,回复ACK,表示知道主机2也没有数据传输了,之后彼此就会愉快的中断这次TCP连接。
2.13.2 TIME_WAIT状态还需要等2*MSL秒之后才能返回到CLOSED状态的原因
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SENT状态到ESTABLISH状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
2.14 TCP协议的十一种状态集转换
2.15 TCP十一种状态集表示含义
各个状态的意义如下:
CLOSED: 初始状态,表示TCP连接是“关闭着的”或“未打开的”。
LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_RCVD:表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED状态。
SYN_SENT :这个状态与SYN_RCVD状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED :表示TCP连接已经成功建立。
FIN_WAIT_1:这个状态得好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态有时仍可以用netstat看到。
FIN_WAIT_2 :上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2是没有超时的(不像TIME_WAIT状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个FIN_WAIT_2状态将一直保持到系统重启,越来越多的FIN_WAIT_2状态会导致内核崩溃。
TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文。TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况)
CLOSING :这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT:表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK :当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK状态。当收到对方的ACK报文后,也就可以进入到CLOSED可用状态了。
第3章 因特网层协议介绍
ICMP Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
RARP 反向地址转换协议
ARP 地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。作用:有效的避免广播风暴的产生
动态ARP:自动完善ARP表信息,会定时更新ARP条目,自动更新ARP表时会消耗服务器性能,适用于主机更换频繁网络。
静态ARP:手工配置ARP表信息,不会实时更新ARP条目,节省服务器性能,适用于主机更换不频繁网络。
第4章 IP地址
4.1 IP地址基本概念
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。
IP地址在网络层将不同的物理网络地址统一到了全球唯一的IP地址上(屏蔽物理网络差异),是唯一标识互联网上计算机的逻辑地址(相当于手机号码,可以通过唯一的手机号码找到手机),所以IP地址也被称为互联网地址(可见其重要性)。
4.2 IP地址格式
我们目前常用的IPv4中规定,IP地址长度为32位二进制,在表示时,一般将32位地址拆分为4个8位二进制,再转为4个十进制数表示,每个数字之间用点隔开,如127.0.0.1(localhost),这种描述方式被称为“点-数表示法”。
IP地址层次:分为网络号和主机号两个层次。网络号表示主机所属网络,主机号表示主机本身。网络号与主机号的位数与IP地址分类有关。
4.3 IP地址分配
IP地址分配的基本原则是:要为同一网络(子网、网段)内不同主机分配相同的网络号,不同的主机号。
4.4 IP地址类型
#公有地址
公有地址(Public address)由Inter NIC(Internet Network Information Center因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。全球唯一,不能出现重复.
#私有地址
私有地址(Private address)属于非注册地址,专门为组织机构内部使用。缓解了地址枯竭 是可以重复使用的(不同局域网内)
#以下列出留用的内部私有地址
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
需要实现配置私网地址的服务器可以访问外网(互联网
NAT --- 网络地址转换技术(化妆),将私网地址转换为公网地址
4.5 特殊的IP地址
1.每一个字节都为0的地址(“0.0.0.0”)对应于当前主机;
2.IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址;
3.IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用。
4.IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试,如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。
5.169.254.0.0~169.254.255.255,是开启了dhcp服务的设备但又无法获取到dhcp的会随机使用这个网段的ip
第5章 子网掩码
子网掩码又叫网络掩码、地址掩码
上面我们说到IP地址分为网络号与主机号,但是路由如何区分网络号与主机号呢?就需要通过子网掩码。子网掩码必须与IP地址结合使用,A、B、C类的子网掩码分别为255.0.0.0,255.255.0.0与255.255.255.0(网络号字节为255,主机号字节为0)。
也就是说给你一个IP地址,那么怎么知道它的网络号和主机号各是多少位呢?
如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现
子网掩码的重要作用:就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码的位数就是网络的位数。
A类网络的网络位数是8位,子网掩码就是255.0.0.0,
B类网络的网络位数是16位,子网掩码是255.255.0.0,
C类是24位,255.255.255.0。
5.1 不同子网下的主机能否直接通信(是否在同一网络下/段下)
假设两个IP地址分别是172.20.0.18和172.20.1.16,子网掩码都是255.255.255.0。
我们可以知道两者的网络标识分别是172.20.0和172.20.1,无法直接通信,也就无法PING通。要想能相互通信,需要将子网掩码改成255.255.0.0
5.2 如何理解172.20.1.0/18
为什么要子网划分
一个大的地址范围区域,你不进行划分的时候,会造成地址浪费
一个大的地址范围区域,可能会产生大量广播风暴,影响主机性能
一个大的地址访问区域,可能会造成网关路由器负载过高
将一个大的网段切割成一个一个小的局域网段,就称为子网划分
一个网段中可以有多少个地址=2的n次方-2 n表示的就是这个网段中有多少个主机位
-2 表示网络地址不能用 表示广播地址不能用
一个局域网中的地址在使用时要预留一个作为网关地址
5.3 如何理解172.20.1.0/26
上文中的26代表主机ID的掩码地址长度,从前往后有26位,即子网掩码的地址是255.255.255.192。
子网掩码还可以用来将网络划分为更小的子网,将IP的两极结构扩充成三级结构,节约地址空间,减轻路由器负担。
子网掩码的划分
如果要将一个网络划分为多个子网,如何确定子网掩码?步骤如下:
第一步:将要划分的子网数目转换为2的m次方。如果不是恰好是2的多少次方,则按照取大原则。
第二步:将上一步确定的幂m按照高序占用主机地址前m位,再转化为十进制。如m为3,表示主机位中有3位被划分为网络标识号占用,因网络标识号都为1,故如是C类地址,主机号对应的字节变为11100000,转化为十进制后为224,故子网掩码为255.255.255.224,如果是B类网络,则子网掩码为255.255.224.0。
第6章 网关
上文中的26代表主机ID的掩码地址长度,从前往后有26位,即子网掩码的地址是255.255.255.192。
子网掩码还可以用来将网络划分为更小的子网,将IP的两极结构扩充成三级结构,节约地址空间,减轻路由器负担。
子网掩码的划分
如果要将一个网络划分为多个子网,如何确定子网掩码?步骤如下:
第一步:将要划分的子网数目转换为2的m次方。如果不是恰好是2的多少次方,则按照取大原则。
第二步:将上一步确定的幂m按照高序占用主机地址前m位,再转化为十进制。如m为3,表示主机位中有3位被划分为网络标识号占用,因网络标识号都为1,故如是C类地址,主机号对应的字节变为11100000,转化为十进制后为224,故子网掩码为255.255.255.224,如果是B类网络,则子网掩码为255.255.224.0。
第7章 抓包方式
抓包方式:wireshark抓包软件在windows中使用
Linux抓包命令tcpdump是一个抓包工具,用于抓取互联网上传输的数据包
tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器;它可以打印出所有经过网络接口的数据包的头信息。
tcpdump命令工作时先要把网卡的工作模式切换到混杂模式。所以tcpdump命令需要以root身份运行。tcpdump命令是linux下使用最广泛的网络协议分析工具。使用tcpdump命令时,必须精通TCP/IP协议工作原理。
语法格式: tcpdump [参数]
常用参数:
-a |
尝试将网络和广播地址转换成名称 |
-c<数据包数目> |
收到指定的数据包数目后,就停止进行倾倒操作 |
-d |
把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出 |
-dd |
把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出 |
-ddd |
把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出 |
-e |
在每列倾倒资料上显示连接层级的文件头 |
-f |
用数字显示网际网络地址 |
-F<表达文件> |
指定内含表达方式的文件 |
-i<网络界面> |
使用指定的网络截面送出数据包 |
-l |
使用标准输出列的缓冲区 |
-n |
不把主机的网络地址转换成名字 |
-N |
不列出域名 |
-O |
不将数据包编码最佳化 |
-p |
不让网络界面进入混杂模式 |
-q |
快速输出,仅列出少数的传输协议信息 |
-r<数据包文件> |
从指定的文件读取数据包数据 |
-s<数据包大小> |
设置每个数据包的大小 |
-S |
用绝对而非相对数值列出TCP关联数 |
-t |
在每列倾倒资料上不显示时间戳记 |
-tt |
在每列倾倒资料上显示未经格式化的时间戳记 |
-T<数据包类型> |
强制将表达方式所指定的数据包转译成设置的数据包类型 |
-v |
详细显示指令执行过程 |
-vv |
更详细显示指令执行过程 |
-x |
用十六进制字码列出数据包资料 |
-w<数据包文件> |
把数据包数据写入指定的文件 |
参考实例
监视指定网络接口的数据包:
[root@linuxcool ~]# tcpdump -i eth1
监视指定主机的数据包:
[root@linuxcool ~]# tcpdump host linuxcool
截获主机192.168.10.10 和主机192.168.10.20 或192.168.10.30的通信:
[root@linuxcool ~]# tcpdump host 192.168.10.10 and \ (192.168.10.20 or 192.168.10.30 \)
抓取80端口的HTTP报文,以文本形式展示:
[root@linuxcool ~]# tcpdump -i any port 80 -A
7.1 默认启动
tcpdump -vv #普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
过滤主机
tcpdump -i eth1 host 192.168.1.1 #抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
tcpdump -i eth1 src host 192.168.1.1 #指定源地址,192.168.1.1
tcpdump -i eth1 dst host 192.168.1.1 #指定目的地址,192.168.1.1
7.2 过滤端口
tcpdump -i eth1 port 80 #抓取所有经过eth1,目的或源端口是80的网络数据
tcpdump -i eth1 src port 80 #指定源端口
tcpdump -i eth1 dst port 80 #指定目的端口
7.3 协议过滤
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
#抓tcp某端口的数据包
tcpdump -i eth0 tcp port 21 -nn
7.4 常用表达式
非 : ! or "not" (去掉双引号)
且 : && or "and"
或 : || or "or"
#抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
#抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
#抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
第8章 Linux常用网络命令
8.1 网卡命令规则
CentOS-6之前基于传统的命名方式如:eth1,eth0....
Centos-7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名是全自动的、可预知的,缺点是比eth0、wlan0更难读。比如enp5s0
biosdevname和net.ifnames两种命名规范
#net.ifnames的命名规范为:
设备类型+设备位置+数字
#设备类型:
en 表示Ethernet
wl 表示WLAN
ww 表示无线广域网WWAN
#实际的例子:
eno1 #板载网卡
enp0s2 #pci网卡
ens33 #pci网卡
wlp3s0 #PCI无线网卡
wwp0s29f7u2i2 #4G modem
wlp0s2f1u4u1 #连接在USB Hub上的无线网卡
#biosdevname的命名规范为:
根据系统BIOS提供的信息对网络接口进行重命名。
em[1-N] #表示主板(嵌入式)NIC (对应机箱标签)
pci #表示PCI插槽中的卡,端口1至N
实际的例子:
em1 #板载网卡
p3p4 #pci网卡
p3p4_1 #虚拟网卡
CentOS-7
默认内核参数(biosdevname=0(dell服务器默认是1),net.ifnames=1): 网卡名 "enp5s2"
biosdevname=1,net.ifnames=0:网卡名 "em1"
biosdevname=0,net.ifnames=0:网卡名 "eth0" (最传统的方式,eth0 eth1)
#定义网卡命令规则
在安装系统时,选择安装选项,按tab键,在跳出的一行内容后面添加net.ifnames=0 biosdevname=0
#命令行设置网卡名称规则
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@qls ~] # cd /etc/sysconfig/network-scripts/ #修改网卡配置文件 [root@qls network-scripts] # mv ifcfg-ens33 ifcfg-eth0 [root@qls network-scripts] # sed -i "s#ens33#eth0#g" ifcfg-eth0 [root@qls ~] # vim /etc/sysconfig/grub #GRUB添加kernel参数 GRUB_CMDLINE_LINUX= "...net.ifnames=0 biosdevname=0 quiet" [root@qls ~] # grub2-mkconfig -o /boot/grub2/grub.cfg [root@qls ~] # reboot #重启系统生效 |
8.2 网卡配置文件详解
#动态ip
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
|
[root@qls ~] # cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE= "Ethernet" 网络类型:以太网 PROXY_METHOD= "none" 代理方式:关闭状态 BROWSER_ONLY= "no" 只是浏览器( yes |no) BOOTPROTO= "dhcp" 设置网卡获得ip地址的方式(static|dhcp|none|bootp) DEFROUTE= "yes" 设置为默认路由( yes |no) IPV4_FAILURE_FATAL= "no" 是否开启IPV4致命错误检测( yes |no) IPV6INIT= "yes" IPV6是否自动初始化 IPV6_AUTOCONF= "yes" IPV6是否自动配置 IPV6_DEFROUTE= "yes" IPV6是否可以为默认路由 IPV6_FAILURE_FATAL= "no" 是否开启IPV6致命错误检测 IPV6_ADDR_GEN_MODE= "stable-privacy" IPV6地址生成模型 NAME= "eth0" 网卡物理设备名称 UUID= "fb32c09d-5a9f-40b9-852b-0f44ff2202ed" UUID识别码 DEVICE= "eth0" 网卡设备名称 ONBOOT= "yes" 开机自启( yes |no) #静态ip IP地址 [root@qls ~] # cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE= "Ethernet" 网络类型:以太网 BOOTPROTO= "static" 设置静态模式 NAME= "eth0" 网卡名称 DEVICE= "eth0" 网卡设备名称 ONBOOT= "yes" 开机自启( yes |no) IPADDR= "10.0.0.200" IP地址 NETMASK= "255.255.255.0" 子网掩码 GATEWAY= "10.0.0.254" 网关 DNS1= "223.5.5.5" 备用DNS1服务器 DNS2= "223.6.6.6" 备用DNS2服务器 |
8.3 网络管理命令
ping 命令
ping命令主要用来测试主机之间网络的连通性,也可以用于。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
语法格式:ping [参数] [目标主机]
常用参数:
-d |
使用Socket的SO_DEBUG功能 |
-c |
指定发送报文的次数 |
-i |
指定收发信息的间隔时间 |
-I |
使用指定的网络接口送出数据包 |
-l |
设置在送出要求信息之前,先行发出的数据包 |
-n |
只输出数值 |
-p |
设置填满数据包的范本样式 |
-q |
不显示指令执行过程 |
-R |
记录路由过程 |
-s |
设置数据包的大小 |
-t |
设置存活数值TTL的大小 |
-v |
详细显示指令的执行过程 |
参考实例
检测与linuxcool网站的连通性:
1
|
[root@linuxcool ~] # ping www.linuxcool.com |
连续ping4次:
1
|
[root@linuxcool ~] # ping -c 4 www.linuxcool.com |
设置次数为4,时间间隔为3秒:
1
|
[root@linuxcool ~] # ping -c 4 -i 3 www.linuxcool.com |
利用ping命令获取指定网站的IP地址
1
2
|
[root@linuxcool ~] # ping -c 1 linuxcool.com | grep from | cut -d " " -f4 220.181.57.216 |
nc 命令
常用参数:
-l |
使用监听模式,管控传入的资料 |
-p |
设置本地主机使用的通信端口 |
-s |
设置本地主机送出数据包的IP地址 |
-u |
使用UDP传输协议 |
-v |
显示指令执行过程 |
-w |
设置等待连线的时间 |
-z |
使用0输入/输出模式,只在扫描通信端口时使用 |
参考实例
扫描80端口:
1
|
[root@linuxcool ~] # nc -nvv 192.168.3.1 80 |
扫描UDP端口:
1
|
[root@linuxcool ~] # nc -u -z -w2 192.168.0.1 1-1000 |
扫描TCP端口:
1
|
[root@linuxcool ~] # nc -v -z -w2 192.168.0.3 1-100 |
nmap 命令
语法格式:nmap [参数]
常用参数:
--traceroute |
扫描主机端口并跟踪路由 |
-p |
扫描指定端口和端口范围 |
-sP |
对目标主机进行ping扫描 |
-A |
使用高级功能进行扫描 |
-PE |
强制执行直接的ICMPping |
-sV |
探测服务版本信息 |
-d |
增加调试信息地输出 |
-PU |
发送udp ping |
-ps |
发送同步(SYN)报文 |
参考实例
扫描主机并跟踪路由:
1
|
[root@linuxcool ~] # nmap --traceroute www.linuxcool.com |
使用-p参数探测80、443端口:
1
|
[root@linuxcool ~] # nmap -p80,443 www.linuxcool.com |
探测服务器的1-10000端口范围:
1
|
[root@linuxcool ~] # nmap -p1-10000 www.linuxcool.com |
使用-A参数进行高级扫描:
1
|
[root@linuxcool ~] # nmap -A www.linuxcool.com |
telnet 命令一种远程登录的工具。
同样可以检查某个主机是否开启某个端口
语法格式: telnet [参数]
常用参数:
-8 |
允许使用8位字符资料,包括输入与输出 |
-a |
尝试自动登入远端系统 |
-b |
使用别名指定远端主机名称 |
-c |
不读取用户专属目录里的.telnetrc文件 |
-d |
启动排错模式 |
-e |
设置脱离字符 |
-E |
滤除脱离字符 |
-f |
此参数的效果和指定”-F”参数相同 |
-F |
使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机 |
-k |
使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名 |
-K |
不自动登入远端主机 |
-l |
指定要登入远端主机的用户名称 |
-L |
允许输出8位字符资料 |
-n |
指定文件记录相关信息 |
-r |
使用类似rlogin指令的用户界面 |
-S |
设置telnet连线所需的IP TOS信息 |
-x |
假设主机有支持数据加密的功能,就使用它 |
-X |
关闭指定的认证形态 |
参考实例
登录远程主机:
1
|
[root@linuxcool ~] # telnet 192.168.0.5 |
连接本地主机,端口号为23:
1
2
3
4
5
6
7
8
9
10
11
|
[root@linuxcool ~] # telnet localhost23 #用法 [C:\~]$ telnet 10.0.0.99 22 Connecting to 10.0.0.99:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]' . SSH-2.0-OpenSSH_7.4 |
netstat 命令
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
语法格式:netstat [参数]
常用参数:
-a |
显示所有连线中的Socket |
-p |
显示正在使用Socket的程序识别码和程序名称 |
-u |
显示UDP传输协议的连线状况 |
-i |
显示网络界面信息表单 |
-n |
直接使用IP地址,不通过域名服务器 |
参考实例
显示详细的网络状况:
1
|
[root@linuxcool ~] # netstat -a |
显示当前户籍UDP连接状况:
1
|
[root@linuxcool ~] # netstat -nu |
显示UDP端口号的使用情况:
1
2
3
4
5
6
|
[root@linuxcool ~] # netstat -apu Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID /Program name udp 0 0 0.0.0.0:bootpc 0.0.0.0:* 4000 /dhclient udp 0 0 localhost:323 0.0.0.0:* 3725 /chronyd udp6 0 0 localhost:323 [::]:* 3725 /chronyd |
显示网卡列表:
1
2
3
4
5
|
[root@linuxcool ~] # netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 181864 0 0 0 141278 0 0 0 BMRU lo 16436 0 3362 0 0 0 3362 0 0 0 LRU |
显示组播组的关系:
1
2
3
4
5
6
7
|
[root@linuxcool ~] # netstat -g IPv6 /IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 ALL-SYSTEMS.MCAST.NET eth0 1 ALL-SYSTEMS.MCAST.NET lo 1 ff02::1 eth0 1 ff02::1:ff0a:b0c eth0 1 ff02::1 |
ss 命令
语法格式:ss [参数]
ss命令用来显示处于活动状态的套接字信息。
常用参数:
-n |
不解析服务名称,已数字方式显示 |
-a |
显示所有套接字 |
-l |
显示处于监听状态的套接字 |
-o |
显示计时器信息 |
-e |
显示详细的套接字信息 |
-m |
显示套接字的内存使用情况 |
-p |
显示使用套接字的进程 |
-i |
显示内部的TCP信息 |
-s |
显示套接字使用概况 |
-4 |
仅显示ipv4的套接字 |
-6 |
仅显示ipv6的套接字 |
-0 |
显示PACKET套接字 |
-t |
只显示TCP套接字 |
-u |
只显示UDP套接字 |
-d |
只显示DCCP套接字 |
-w |
只显示RAW套接字 |
-x |
只显示 Unix套接字 |
-D |
将原始TCP套接字信息转储到文件 |
参考实例
显示TCP套接字:
1
2
3
4
5
6
|
[root@linuxcool ~] # ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0: ssh 0.0.0.0:* ESTAB 0 52 192.168.60.19: ssh 192.168.30.21:59321 LISTEN 0 128 *:websm *:* LISTEN 0 128 [::]: ssh [::]:* |
显示UDP套接字:
1
2
3
4
5
|
[root@linuxcool ~] # ss -u -a State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 0.0.0.0:bootpc 0.0.0.0:* UNCONN 0 0 127.0.0.1:323 0.0.0.0:* UNCONN 0 0 [::1]:323 [::]:* |
显示套接字使用概况:
1
2
3
4
5
6
7
8
9
|
[root@linuxcool ~] # ss -s Total: 185 TCP: 4 (estab 1, closed 0, orphaned 0, timewait 0) Transport Total IP IPv6 RAW 1 0 1 UDP 3 2 1 TCP 4 2 2 INET 8 4 4 FRAG 0 0 0 |
tracert 命令
(windows) 路由跟踪(检查你与目标之间每个路口是否畅通)
#常用选项
-d #禁止把IP解析为对应的域名(主机名)
traceroute 追踪数据包在网络上的传输时的全部路径
语法格式:traceroute [参数] [域名或者IP]
常用参数:
-d |
使用Socket层级的排错功能 |
-f<存活数值> |
设置第一个检测数据包的存活数值TTL的大小 |
-F |
设置勿离断位 |
-g<网关> |
设置来源路由网关,最多可设置8个 |
-i<网络界面> |
使用指定的网络界面送出数据包 |
-I |
使用ICMP回应取代UDP资料信息 |
-m<存活数值> |
设置检测数据包的最大存活数值TTL的大小 |
-n |
直接使用IP地址而非主机名称 |
-p<通信端口> |
设置UDP传输协议的通信端口 |
-r |
忽略普通的Routing Table,直接将数据包送到远端主机上 |
-s<来源地址> |
设置本地主机送出数据包的IP地址 |
-t<服务类型> |
设置检测数据包的TOS数值 |
-v |
详细显示指令的执行过程 |
-w |
设置等待远端主机回报的时间 |
-x |
开启或关闭数据包的正确性检验 |
参考实例
追踪本地数据包到www.linuxprobe.com的传输路径:
1
|
[root@linuxcool ~] # traceroute www.linuxprobe.com |
跳数设置:
1
|
[root@linuxcool ~] # traceroute -m 7 www.linuxprobe.com |
显示IP地址,不查主机名 :
1
|
[root@linuxcool ~] # traceroute -n www.linuxprobe.com |
把探测包的个数设置为值4:
1
|
[root@linuxcool ~] # traceroute -q 4 www.linuxprobe.com |
把对外发探测包的等待响应时间设置为3秒:
1
|
[root@linuxcool ~] # traceroute -w 3 www.linuxprobe.com |
iftop 命令
iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。
iftop界面说明:
界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。
中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
#常用选项
-i #设定监测的网卡
-B #以bytes为单位显示流量(默认是bits)
-n #使host信息默认直接都显示IP
-P #使host信息及端口信息默认就都显示
-m #设置界面最上边的刻度的最大值,刻度分五个大段显示
按q退出监控。
glances 命令
glances是一个相对比较新的系统监控工具,用 Python 编写的,使用 psutil 库从系统获取信息。可以用它来监控 CPU、平均负载、内存、网络接口、磁盘 I/O,文件系统空间利用率、挂载的设备、所有活动进程以及消耗资源最多的进程。
语法格式:glances [参数]
常用参数:
-b |
显示网络连接速度 Byte/ 秒 |
-s |
设置 glances 运行模式为服务器 |
-B |
绑定服务器端 IP 地址或者主机名称 |
-c |
连接 glances 服务器端 |
-t |
设置屏幕刷新的时间间隔,单位为秒,默认值为 2 秒,数值许可范围:1~32767 |
参考实例
192.168.10.10 主机启动 glances 服务:
1
|
[root@linuxcool ~] # glances -s -B 192.168.10.10 & |
从另一台主机查看 192.168.10.10 主机的系统负载状态:
1
|
[root@linuxcool ~] # glances -c 192.168.10.10 |
显示网络连接速度 Byte/ 秒:
1
|
[root@linuxcool ~] # glances -b |
设置屏幕刷新的时间间隔为6秒:
1
|
[root@linuxcool ~] # glances -t 6 |
8.4 常见面试题
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题3】为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
第9章 Linux配置多IP地址
9.1 每个网卡都可以配置多个公网IP 内网IP
9.1.1 可以配置任意接口
给eth0网卡配置10.0.0.201 临时生效 重启失效
1
|
[root@oldboyedu ~] #ip addr add 10.0.0.201/24 dev eth0 |
永久生效
/etc/rc.local
扩展:配置网卡的子接口 eth0:0 eth0:1 了解 绑定多网卡
1
|
[root@oldboyedu-lnb ~] # ip addr del 10.0.0.251/24 dev eth0 |
9.2 指定默认网关 笔试题
查看默认的网关
9.2.1 route -n
1
2
3
4
5
6
|
[root@oldboyedu ~] # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 |
9.2.2 查看网卡配置
9.2.2.1 删除默认的网关
第一种方法:
1
|
[root@oldboyedu ~] # route del default gw 10.0.0.2 |
第二种方法:使用静态路由的方式删除网关
1
|
[root@oldboyedu ~] # ip route del 0/0 via 10.0.0.2 |
9.2.2.2 设置默认网关
第一种方法:
1
|
[root@oldboyedu ~] # route add default gw 10.0.0.2 |
第二种方法:
1
|
[root@oldboyedu ~] #ip route add 0/0 via 10.0.0.2 |
9.2.2.3 工作中临时+永久
在命令行执行
1
2
3
|
ip route del default gw 10.0.0.2 #删除默认网关 ip route add default gw 10.0.0.254 #添加默认网关 vim /etc/sysconfig/network-scripts/ifcfg-eth0 #修改默认网卡 |
9.2.2.4 修改默认网关
1
2
|
ip route replace 直接修改 不需要先删除后添加 ip route replace default via 10.0.0.2 dev eth0 |
9.2.2.5 指定默认路由
1
2
3
|
ip route add 192.168.1.100 via 10.0.0.2 route add 10.0.0.1 netmask route –net 202.106.0.20 netmask 255.255.255.0 dev |
9.2.2.6 策略路由:
案例:如果服务器使用pptp拨号
1) 业务需要pptp拨号
2) 购买pptp账号
3) 拨号pptpset up
4) 安装pptp命令
[root@oldboyedu-lnb ~]# yum -y install pptp-setup
5) Linux系统拨号 Windows如何拨号 vpn的账号? 扩展
a. 删除默认的网关
b. 指定去往vpn服务器默认的路由
1
2
3
|
ping shh.91ip.vip ip route add 115.207.30.130 via 172.17.159.253 [root@oldboyedu-lnb ~] # pptpsetup --create test --server shh.91ip.vip --username 66951 --password 1234 --start |
6) 测试网络通信
7) 指定默认的路由走ppp0接口
1
|
[root@oldboyedu-lnb ~] # route add -net 0.0.0.0 netmask 0.0.0.0 ppp0 |
8) 无法通过SSH连接服务器
9) 使用策略路由 来给SSH进行回包
路由表:
/etc/iproute2/rt_tables
可以给里面的表名字 配置一个默认的路由
1
|
[root@oldboyedu-lnb ~] # ip route add 0/0 via 172.17.159.253 table test |
给test表配置了一个静态路由 去往任意IP的 网关为172.17.159.253
配置策略
1
|
[root@oldboyedu-lnb ~] # ip rule add from 39.153.181.202 table test |
PS:DNS作用:
域名解析 把域名解析成IP 我们和解析到的IP地址建立通信
没有域名 直接可以使用IP地址
linux的网卡配置文件 /etc/resolv.conf # 工作中建议使用