路由配置
第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配置:
Router> # 命令提示符 用户模式 只能操作部分命令 Router>enable # 进入特权模式 在特权模式查看大部分的配置 ? 查看所有当前模式可以执行命令 Router#show ip route # 查看路由表信息 路由器配置接口IP地址 从特权模式 进入到配置模式 简写config t Router#configure terminal (conf t) Router(config)# # 配置模式
1.5.1 第一步:进入路由器的网卡 PS: exit 退出到上一个模式
Router(config)#interface gigabitEthernet 0/0 Router(config-if)# # 进入到了g0/0 outer(config-if)#ip ad
1.5.2 第二步: 配置IP地址和子网掩码
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 第三步: 启动网卡
Router(config)#interface gigabitEthernet 0/0 Router(config-if)#no Router(config-if)#no shu Router(config-if)#no shutdown
1.5.4 第四步: 查看配置
在特权模式下查看
Router#show interfaces gigabitEthernet 0/0
在特权模式下pingIP地址 出现.代表不通 出现!代表可以通信
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
修改路由器的提示符名称
Router(config)#hostname R3 R3(config)# R3(config)# R3(config)#
————————————–
路由器
家用路由器: TP-Link 腾达 小米 华为 穿墙王…
企业路由器: CISCO 华为 锐捷 中兴 H3C 瑞斯康达…
路由器维护者路由表信息
路由器R1:
网络标识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:
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:
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地址 称为 下一跳
R1(config)#ip route 192.168.4.0 255.255.255.0 192.168.2.2
R2配置
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配置
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 任意的主机通信
取消静态路由:
no ip route 192.168.1.0 255.255.255.0 192.168.3.1
1.6 动态路由:
rip ospf BGP EIGRP(CISCO) ISIS
路由器1配置:
Router> # 命令提示符 用户模式 只能操作部分命令 Router>enable # 进入特权模式在特权模式查看大部分的配置 ? 查看所有当前模式可以执行命令 Router#show ip route # 查看路由表信息 路由器配置接口IP地址 从特权模式 进入到配置模式 简写config t Router#configure terminal Router(config)# # 配置模式
1.6.1 第一步:进入路由器的网卡 PS: exit 退出到上一个模式
Router(config)#interface gigabitEthernet 0/0 Router(config-if)# # 进入到了g0/0 outer(config-if)#ip add
1.6.2 第二步: 配置IP地址和子网掩码
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 第三步: 启动网卡
Router(config)#interface gigabitEthernet 0/0 Router(config-if)#no Router(config-if)#no shu Router(config-if)#no shutdown
1.6.4 第四步: 查看配置
在特权模式下查看
Router#show interfaces gigabitEthernet 0/0
在特权模式下pingIP地址 出现. 代表不通 出现!代表可以通信
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
————————————————————————–
修改路由器的提示符名称
Router(config)#hostname R3 R3(config)#
1.7 路由器的分类
家用路由器: TP-Link 腾达 小米 华为 穿墙王…
企业路由器: CISCO 华为 锐捷 中兴 H3C 瑞斯康达…
动态路由: 动态的自动的去学习路由
RIP OSPF BGP EIGRP(CISCO) ISIS
初始路由表信息:
路由器R1:
网络标识1 IP地址 网关
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)
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)
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)取消静态路由
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协议
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
#命令行设置网卡名称规则
[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
[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网站的连通性:
[root@linuxcool ~]# ping www.linuxcool.com
连续ping4次:
[root@linuxcool ~]# ping -c 4 www.linuxcool.com
设置次数为4,时间间隔为3秒:
[root@linuxcool ~]# ping -c 4 -i 3 www.linuxcool.com
利用ping命令获取指定网站的IP地址
[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端口:
[root@linuxcool ~]# nc -nvv 192.168.3.1 80
扫描UDP端口:
[root@linuxcool ~]# nc -u -z -w2 192.168.0.1 1-1000
扫描TCP端口:
[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)报文 |
参考实例
扫描主机并跟踪路由:
[root@linuxcool ~]# nmap --traceroute www.linuxcool.com
使用-p参数探测80、443端口:
[root@linuxcool ~]# nmap -p80,443 www.linuxcool.com
探测服务器的1-10000端口范围:
[root@linuxcool ~]# nmap -p1-10000 www.linuxcool.com
使用-A参数进行高级扫描:
[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 |
关闭指定的认证形态 |
参考实例
登录远程主机:
[root@linuxcool ~]# telnet 192.168.0.5
连接本地主机,端口号为23:
[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地址,不通过域名服务器 |
参考实例
显示详细的网络状况:
[root@linuxcool ~]# netstat -a
显示当前户籍UDP连接状况:
[root@linuxcool ~]# netstat -nu
显示UDP端口号的使用情况:
[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
显示网卡列表:
[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
显示组播组的关系:
[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套接字:
[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套接字:
[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 [::]:*
显示套接字使用概况:
[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的传输路径:
[root@linuxcool ~]# traceroute www.linuxprobe.com
跳数设置:
[root@linuxcool ~]# traceroute -m 7 www.linuxprobe.com
显示IP地址,不查主机名 :
[root@linuxcool ~]# traceroute -n www.linuxprobe.com
把探测包的个数设置为值4:
[root@linuxcool ~]# traceroute -q 4 www.linuxprobe.com
把对外发探测包的等待响应时间设置为3秒:
[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 服务:
[root@linuxcool ~]# glances -s -B 192.168.10.10 &
从另一台主机查看 192.168.10.10 主机的系统负载状态:
[root@linuxcool ~]# glances -c 192.168.10.10
显示网络连接速度 Byte/ 秒:
[root@linuxcool ~]# glances -b
设置屏幕刷新的时间间隔为6秒:
[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 临时生效 重启失效
[root@oldboyedu ~]#ip addr add 10.0.0.201/24 dev eth0
永久生效
/etc/rc.local
扩展:配置网卡的子接口 eth0:0 eth0:1 了解 绑定多网卡
[root@oldboyedu-lnb ~]# ip addr del 10.0.0.251/24 dev eth0
9.2 指定默认网关 笔试题
查看默认的网关
9.2.1 route -n
[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 删除默认的网关
第一种方法:
[root@oldboyedu ~]# route del default gw 10.0.0.2
第二种方法:使用静态路由的方式删除网关
[root@oldboyedu ~]# ip route del 0/0 via 10.0.0.2
9.2.2.2 设置默认网关
第一种方法:
[root@oldboyedu ~]# route add default gw 10.0.0.2
第二种方法:
[root@oldboyedu ~]#ip route add 0/0 via 10.0.0.2
9.2.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 修改默认网关
ip route replace 直接修改 不需要先删除后添加 ip route replace default via 10.0.0.2 dev eth0
9.2.2.5 指定默认路由
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服务器默认的路由
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接口
[root@oldboyedu-lnb ~]# route add -net 0.0.0.0 netmask 0.0.0.0 ppp0
8) 无法通过SSH连接服务器
9) 使用策略路由 来给SSH进行回包
路由表:
/etc/iproute2/rt_tables
可以给里面的表名字 配置一个默认的路由
[root@oldboyedu-lnb ~]# ip route add 0/0 via 172.17.159.253 table test
给test表配置了一个静态路由 去往任意IP的 网关为172.17.159.253
配置策略
[root@oldboyedu-lnb ~]# ip rule add from 39.153.181.202 table test
PS:DNS作用:
域名解析 把域名解析成IP 我们和解析到的IP地址建立通信
没有域名 直接可以使用IP地址
linux的网卡配置文件 /etc/resolv.conf # 工作中建议使用