Linux网络基础
网络就是把分布在不同地理位置上的主机,通过传输介质(网线、卫星等)连接起来,实现主机之间数据传输共享的目的。
OSI 7层网络模型传输过程
数据从一个主机A发送到主机B时候,每一层都会包住一个头部信息,从应用层(如手机或电脑)应用设备开始,数据打包到物理层,最后发给主机B
主机B接收到数据后,通过网卡,接收到在物理层,然后分别在每一次在进行拆包拿数据,最后到主机B的应用层,当然数据发送和接收都是可以的。
具体每一层详细信息可以参考之前写的:网络协议介绍
TCP协议
传输控制协议,简称TCP协议,在IP协议基础上,增加了确认重发、滑动窗口和复用 等机制。
TCP协议提供了稳定、安全、面向连接的字节流服务。
TCP是基于OSI 7层网络模型定义出的4层网络模型
- 应用层 = OSI的 应用层 + 表示层 + 会话层
- 传输层 和OSI的传输层一样
- 网络层 和OSI的网络层一样
- 数据链路层 = OSI的 数据链路层 + 物理层
TCP/IP体系结构的优点:
- 简化了计算机网络的结构,从原来的七层模型变成了现在的四层,但是功能却没有减少
- 每一层即独立又有联系,独立是因为如果那一层出现问题了不会影响其他层的工作,联系是因为上层协议又使用下层协议提供的服务。
TCP协议是面向连接的单播协议。
- 单播 一对一服务,有来有回,数据发送和接收前,双发必须建立一条连接。
- 广播 通常用在交换机,一对多的服务。
TCP传输数据的3个阶段:
- 建立连接
- 数据传输
- 断开连接
TCP采用3次握手4次挥手
TCP协议数据传输过程
TCP报文格式
- ACK:表示确认号有效
- SYN:用于发起TCP连接
- FIN:用户断开TCP连接
- PSH:表示接收方需要尽快数据交给应用层
- RST:重新连接
TCP3次握手抓包分析
通过使用wreshark工具抓包总结了TCP3次握手的原理
- 刚开始,客户端发送SYN,并且发送了Seq(这是ISN码,是用于一个识别码),这时的Seq是0
- 服务端收到连接,发送了SYN 还发送了ACK确认,并且也给客户端发送了一个Seq,这个Seq也是0
这个Seq 和客户端第1次握手时候发送的Seq没有任何关系,是两个端各自发送的。
但第2次握手服务端发送的ACK的值 和第1次握手客户端发送的Seq的值有关系,这个ACK的值是在客户端发送的Seq的值基础上+1 - 客户端接收到了服务端发送的ACK以后,也发送了一个ACK,这个ACK也是等于Seq + 1,这个Seq是第2次握手时候服务端发送的Seq。
发送ACK同时,还会再发送一个Seq,这个Seq等于是客户端第2次发送Seq了,这个Seq的值是客户端第1次握手时发送的Seq + 1
断开连接4次挥手
断开连接的基础上首先肯定是已经建立了连接
断开连接伴随着7种状态要知道
如图:如果客户端先要断开连接,先发送FIN命令,服务端收到后回应ACK确认命令,然后再次回应了FIN命令,客户端收到了2个服务端回应的命令,发送ACK确认断开连接
- 客户端第1次发送FIN码 + Seq 想要断开连接,这个Seq是之前建立好连接后的Seq的值
- 服务端接收到了FIN后,回应一个ACK,这个ACK是Seq + 1,就是客户端第1次挥手时候的Seq
- 服务端还会再发送一个FIN码,并且也给了一个新的Seq给客户端,这个Seq和之前客户端第1次挥手时候发送的Seq没有关系
- 客户端回应给服务端一个ACK,这个ACK是刚刚接到的服务端第3次挥手时候给的Seq + 1
至此4次挥手完成,断开连接。
IP协议介绍
如图:
一个主机通过交换机的连接到达另一个网段主机它们就可以通信。
IP是TCP模型中最重要的协议。
主要作用:
- 数据传输 将数据从一个主机传送另一个主机
- 寻址 根据子网划分和IP地址,找到正确目的主机地址
- 路由选择 选择数据在互联网上的传送路径
- 数据报文分段 传送数据大于MTU时,将数据分段发送和接受,并重新组装。
IP地址分类
常见应用端口:
- 21 FTP
- 22 SSH
- 23 Telnet
- 25 SMTP邮件
- 53 DNS默认端口
- 80 HTTP
- 443 HTTPS
IP地址:是逻辑地址,是可变的。标识网络种的主机,原则上一个网络中主机的IP地址是唯一的,目的是为了防止冲突。
IP地址的构成分3部分:
- 类别:用来区分IP地址的类型,比如A、B、C、D 等级分类
- 网络标识:网络位,也就是Network ID,表示主机所在的网络
- 主机标识:主机位,也就是Host ID,表示主机再网络中的表示
IPv4 和 IPv6 介绍
-
IPv4:32位,10进制数以
.
隔开分4部分表示,就是点分二进制。每一个部分是8位,最大的表示256个,也就是 0 ~ 255- IPv4地址分类:
- A类:网络标识占前1个字节,最高位是0,后面3个字节表示主机标识。A类的网络地址有128个,允许支持127个网络,每个网络大约允许有1670万台主机的存在。通常用于网络运行商的大公司的主干网络。
- B类:前2个字节表示网络标识,后2个字节表示主机标识。用于节点比较多的网络,区域网络等。B类地址允许有16000个网络,每个网络大约有66000台主机。
- C类:是最常见的地址。高3位标识类型,110表示。网络表示占3个字节,主机标识占1个字节。C类地址支持约20万个网络,最后一个字节主机,最大值256,实际能表示254个。通常0和255不能分配给主机。0表示网段,255表示广播地址。
- D类:多播地址,高4位表示网络标识,后24位表示多播地址。
- E类:保留地址。
- IP地址分类开始字段:
- A类:000 ~ 127
- B类:128 ~ 191
- C类:192 ~ 233
- D类:224 ~ 239
- E类:240 ~ 255
- IPv4地址分类:
-
IPv6:相比IPv4来说简化了报文头格式,字段只有8个,加快报文转发提高数据吞吐量,提高安全性,身份认证和隐私权是IPv6的关键特性。
IP地址和传统的IPv4有很大区别,一般采用冒号16进制表示法,如这样的:fe80::143d:685e:34b0:3073%24
,分8个字段,用冒号:
隔开,IPv6是128位,IPv4是32位,所以就比IPv4的地址空间增大了296倍
常见的特殊的IP地址
子网掩码
子网掩码定义:
子网掩码是一个32位字段的一个数值,利用这个字段来屏蔽原来网络地址的划分情况,从而能获得一个范围较小的可以实际使用的网络。
子网掩码好处:
- 节约IP地址资源
- 减少广播域
- 减少寻址空间
子网掩码分类:
- A类:255.0.0.0
- B类:255.255.0.0
- C类:255.255.255.0
子网掩码计算方法
通过子网掩码可以确定网段,计算主机。
一般最常用的C类网的一个网段最多有254个IP地址:从192.168.0.1
到192.168.0.254
,通常会用这两个里面其中一个作为网关地址。
198.168.0.0
表示一个网络,不能用来表示一个主机地址,192.168.0.255
表示系统的网络广播地址。
IP地址与子网掩码进行与操作,如果两个IP地址计算结果相同,就说明它们在一个网络中。
实例:
有两个IP地址192.168.1.150
和 192.168.1.151
,假设子网掩码是255.255.255.128
计算结果一样:
子网划分
划分子网IP地址段必须是2的幂次数范围,就可以推算出 子网掩码 = 主机位 - IP地址段广播地址(就是最大的那个地址)
如图:
如果表示192.168.1.0
这个网段的64大小的子网,因为64满足2的幂次数,所有是64大小。
64个的话用 0 ~ 63来表示,192.168.1.0
是网段标识,192.168.1.63
这个最大的IP就用来标识广播地址,那么这个子网IP地址段可用的IP是192.168.1.1
到 192.168.1.62
子网掩码的计算就是通过主机位的最大二进制数(刚好是192.168.1.63
这个IP)来得出,63用2进制表示是0011 1111
,255就是1111 1111
,那255 - 63 就是1100 0000
刚好是十进制的192
可以得出结论:划分子网时,随着子网地址借用了主机位数增多,子网的数目就随之增加,但是子网中的可用主机IP逐渐减少。
写出所有子网IP地址段:
route 命令
route -n
命令查看路由列表信息,如果没有就安装:yum install -y net-tools
如上图:
- Gateway 路由网关
- Genmask 子网掩码
route 其他命令:
操作 | 命令说明 |
---|---|
添加网关 | route add -net 【如:192.168.0.0】 gw 【如:10.0.0.2】 |
删除网关 | route del -net 【如:192.168.0.0】 gw 【,如:10.0.0.2】 |
添加网段 | route add -net 【如:192.168.0.0】 netmask 【如:255.255.255.0】 dev 【如:ens33】 |
IP 命令
使用IP命令也可以操作路由,比如不能连接网络的虚拟机,不能使用route命令,就可以使用IP命令。
使用ip r
查看路由:
使用ip命令添加网关:
静态路由
如图:
主机A可以和主机B相互ping通,主机B和主机C可以相互ping通,但是主机A不能直接ping通主机C
使用配置路由就可以让主机A连通到主机C
- 给主机A添加路由:设置成主机C的网段,网关配置成和主机B连接的ip
- 给主机C添加路由:同理,设置成主机A的网段,网关配置成和主机B连接的ip
- 在主机B中开启内核转发:在
/etc/sysctl.conf
中添加net.ipv4.ip_forward=1
设置ip转发,然后使用sysctl -p
使其生效
这样就可以让主机A和主机C直接ping通