一、网络基础概念
1、如何通过网络实现多台主机之间的通讯
- 在两台主机之间需要有传输介质(网线、光纤、无线等)
- 在两台主机上面需要有网卡设备
网卡:全球唯一的地址(MAC)类似家位置
发送信息时:将二进制(数字信号)信息转换为高低电压(电信号)
接收信息时:将高低电压(电信号)信息转换为二进制数(数字信号) - 在进行数据传输之前,需要协商网络传输速率
- 1Byte(字节)=8bit(位)
- 1KB=1024Byte(字节)
- 1MB=1024KB
- 1024MB=1GB
- 1024GB=1TB
二、网络设备说明介绍
1、什么是交换机
- 实现一个网络内多台主机之间的通讯
1.1、如何利用交换机实现通讯?
- 在数据前面设置目标地址和原地址,目标地址和原地址用mac地址进行标识
- mac称为物理地址,每块网卡都有的一个标识身份信息的
- mac地址全球唯一,不能进行修改,mac地址用16进制标识
- 在网络通讯初期,会利用广播方式进行发送数据包,在通讯的过程,数据包的发送一定是有去有会的,在一个交换网络中,如果产生了大量广播数据包时会产生广播风暴,影响主机性能,这样的问题称为广播风暴问题
1.2、解决广播风暴问题思路:
- 减少广播产生数量,将一个大的交换网络切割为几个小的交换网络(局域网,广播域)
1.3、交换机的种类
- 傻瓜交换机(TP-link/Dlink/水星...)
- 4口 8口 12口 16口 24口 48口
- 程控交换机(存储程序控制交换机,配置管理,思科、华为、华三、锐捷、中兴、瑞斯康达)
2、什么是路由器
2.1、基本概念
- 实现不同局域网之间主机通讯,可以隔离广播风暴(路由不同的接口连接不同广播域)
- 路由类似于现实生活中从A地去往B地可能需要先步行,在坐车,在做飞机才能到达B地,这样的整个过程在网络中对应数据的传递过程就称为路由。因此一个数据信息跨越不同的网段传递到目的地址,就可以把传递数据的过程称为路由,也可以看做每条传递数据的路径。
2.2、实操理解
1)需要有身份标识信息:ip地址
逻辑地址(可以改变的地址/???) 利用10进制方式进行显示
IP地址由两部分组成: 交换网络标识信息+主机地址标识信息===网段地址+主机地址
192.16.11 网段 1-254 主机地址
10.0.0 网段 1-254 主机地址
昌平区 网段 xx地址 192.168.11.X
海淀区 网段 xx地址 192.168.10.X
内网卡---交换机 192.168.11.0/24(192.168.11.1~192.168.11.254)
外网卡---运营商 IP : 221.218.210.53
查公网ip的方法:
windows,打开浏览器,访问百度,搜IP即可
linux:curl ifconfig.me
高级路由器还有上网行为管理器和防火墙功能
论坛:鸿鹄论坛(网络工程师)
2)路由实现数据传输通讯时,会根据路由表信息进行数据包路由
实现不同网段之间通讯需要经过一条必经之路,这条路称为网关
3) 查看路由条目信息方法
[root@qls ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.254 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
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
[root@qls ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.0.254 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 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
第一列:所能去往网段的信息
第二列:0.0.0.0 通过局域网即可到达
10.0.0.254 想去往其他网段的必经节点,称为网关
第三列:子网掩码(告诉网段内可以容纳多少主机)
最后一列:到达指定目标,通过哪一个接口出去
2.3、路由分类:
- 静态路由:需要自己进行配置,稍微麻烦一点,适用于几个人的应用场景
- 动态理由:系统自动匹配,简单快捷,适用于人数较多的情况
三、网络层次结构
1、网络拓扑
1.1、网络层次结构:
- 核心层:主要部署路由器设备,用于连接外层线路,还要具备冗余能力
- 汇聚层:主要部署三层交换机设备,用于相应安全访问控制,进行链路汇聚
- 接入层:主要部署二层交换涉笔,用于终端设备接入
- 一层交换机:只支持物理层协议
- 二层交换机:支持物理层和数据链路层协议
- 三层交换机:支持物理层,数据链路层及网络层协议
2、网络类型
- 局域网:本地私有的一个网络范围,规模较大的局域网,也被称为园区网,例如:教师、家庭等
- 公网:全球任意一个可以上网的地方都可以直接访问到
- 城域网:网络的覆盖面积达到了一个城市,就可以称为城域网
- 广域网:覆盖面积,达到了全球或全国,称为广域网,全球最大的广域网是internet互联网
3、网络层次模型(OSI 7层模型)
- 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
3.1、应用层
- 为应用软件提供接口,是应用程序能够使用网络服务,简单说就是产生数据/信息,主要就是提供应用程序可以接入网络接口,并根据程序的不同对应不同的接口协议
- 常见应用层协议:http(80)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23)、dns(53)
3.2、表示层
- 数据的解码和编码
- 数据的加密和解密
- 数据的压缩和解压缩
3.3、会话层
- 作用:建立、维护、管理应用程序直接到会话
- 功能:对话控制、同步
3.4、传输层
- 作用:负责建立端与端之间的传输
- 功能:服务点编制、分段与重组、连接控制、流量控制、差错控制
- 负责网络总端到端的连接(TCP、UDP)
3.5、网络层:
- 作用:负责将分组数据从源端传输到目的端
- 功能:为网络设备提供逻辑地址,进行路由选择,分组转发
- 网络层主要作用:路由和寻址,主要接触的是IP协议,即IP地址
3.6、数据链路层:
- 作用:在不可靠的物理链路上,提供可靠的数据传输服务,把帧从一跳(结点)移动到另一跳(结点)
- 功能:组帧、物理编址、流量控制、差错控制、接入控制
3.7、物理层:
- 作用:负责吧逐个的比特从一跳(结点)移动到另一跳(结点)
- 功能:
- 定义接口和媒体的物理特征
- 定义比特的标识,数据传输速率、信号的传输模式(单工、半双工、全双工)
- 定义网络物理拓扑(网状、星型、环形、总线型等拓扑)
四、数据包封装与解封装
1、封装
- 封装过程:由上至下进行封装
- 应用层、表示层、会话层、PDU 数据
- 传输层:分段 TCP协议
- 网络层:打包 TCP+IP地址
- 数据链路层:成帧 TCP协议+IP协议+MAC地址
- 物理层:二进制数据转换 数据以比特形式传输
2、解封装
- 拆包过程:由下至上进行拆包
- 物理层:电信号转换为二进制数据,并将其送至数据链路层
- 数据链路层:查看MAC地址
- 网络层:查看对应IP,若是则拆掉IP头部,继续传输
- 传输层:查看TCP头部,判断应该去往哪里,然后重组数据,传输到应用层
- 应用层:数据恢复
五、TCP/IP模型(4层模型)
1、OSI 7层模型与 TCP/IP 模型(DOD)对应关系
2、TCP/IP 协议簇相关协议汇总
3、DNS解析过程:
3.1、什么是域名?
举个例子:https://www.baidu.com,这个其实并不是域名,其中https是指协议,去掉https后,www.baidu.com.(注意最后面有一个点号)才是真正的域名。
每个域名的最后面都有一个点号“.” 表示根域名,为了方便在实际使用的时候被省略
根域名的下一级就是顶级域名,.com也就是顶级域名,常见的顶级域名后缀有.com、.cn、.net、.org等,这些都是固定到,用户不能自己修改,只能选择
顶级域名的下一级又是权威域名,比如baidu.com中的.baidu,这个权威域名就是我们自己可以注册的域名
顶级域名下就是主机名了,www是指主机名,这个是我们可以自己定义的,通常在http服务器如nginx中可以修改
http https 协议
.com .cn .org .net. ... 顶级域名
baidu sina weibo linuxnc 权威域名
www.baidu.com --->显示百度的主页
news.baidu.com --->显示的百度的新闻页面
www.baidu.com的www news.baidu.com 的news 表示主机名 表示不同的业务 不同的页面
.com.
.cn.
.org.
.是根域名
3.2、域名解析过程:
1、浏览器输入www.baidu.com查询浏览器缓存,有则返回ip;没有则查询本地的HOSTS
2、如果HOSTS有则返回IP,如果没有继续查询本地的DNS
3、本地DNS一般是我们自己配置的比如233.5.5.5(阿里云),查询本地DNS是否有对应的IP,如果有则返回,没有则查询.根服务器
4、根服务器不存储域名解析,会给LDNS返回顶级域.com服务器的IP地址
5、LDNS重新请求.com域名服务器 .com不存在域名解析 .com会返回权威域名服务器的ip地址给LDNS
6、LDNS重新请求baidu.com权威域名解析服务器,权威域名服务器就是我们自己配置的A记录解析,将A记录对应的IP地址返回给LDNS
7、LDNS拿到后自己缓存一份,返回给浏览器一份
8、浏览器和拿到的百度服务器IP地址建立联系
1、浏览器缓存--->本地HOSTS--->本地DNS
2、本地DNS--->根 根返回 顶级域.com
3、本地DNS--->顶级域 顶级域返回权威域
4、本地DNS--->权威域 权威域返回 A记录解析对应的服务器IP地址
5、浏览器--->百度IP建立连接
4、TCP三次握手
4.1、剖析:
- 客户端A向服务端B发送一个带有SYN报文请求建立连接并发送第一个随机seq序列号
- 服务端B接收到客户端A发送的报文和序列号之后,回复给客户端A一个ACK报文表示接收,一个SYN报文表示请求建立连接,一个seq=y的随机序列,ack=x+1下次你应该给我发送的序列
- 客户端A向服务端B发送一个ACK表示我收到了,发送第二个数据包seq=x+1序列号,ack=y+1表示你下次应该给我发送的序列号
4.2、为什么要三次握手?
- 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误;即防止服务器的一直等待而浪费资源
- 数据信息分组之后,第一段数据信息还没到,而其他三段数据信息已经来了,长期等待第一段数据信息会造成服务器资源浪费
5、TCP四次挥手
5.1、剖析:
- 首先客户端A向服务端B发送一个FIN断开请求
- 服务端B向客户端A发送一个ACK报文表示已经接收
- 第二次服务端B再向客户端A发送一个FIN断开请求
- 客户端A向服务端B发送ACK报文表示接收
- 分手
5.2、为什么要四次分手?
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,主机1收到主机2的FIN报文段时,回复ACK,表示知道主机2也没有数据传输了,之后彼此就会愉快的中断这次TCP连接。
6、TCP协议的11种状态集转换
6.1、TCP的11种状态机表示含义
客户端发送FIN给服务端-->ESTABLISHED-->FIN_WAIT1第一次等待
服务端收到回复ACK: ESTABLISHED--->CLOSED_WAIT关闭等待
收到后客户端:FIN_WAIT1-->FIN_WAIT2第二次等待
服务端继续回复客户端FIN: CLISED_WAIT--->LAST_ACK
客户端回复确认ACK:FIN_WAIT2-->TIME_WAIT时间等待-->CLOSED状态
最后服务端收到确认ACK: LAST_ACK---> CLOSED
各个状态的意义如下:
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可用状态了。
六、抓包方式
1、Linux抓包命令tcpdump是一个抓包软件,用于抓取互联网上传输的数据包
- tcpdump是一个用于截取网络分组,并输出分组内容的工具。凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具
- tcpdump支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮您其过滤掉无用的信息
2、常用选项及其案例
[root@web01 ~]#yum -y install tcpdump
-i # 监听哪个网卡
-n # 不把ip解析成主机名
-nn # 不把端口解析成应用层协议
-C # 指定抓包的数量
-S # 不把随机序列和确认序列解析成绝对值
-w # 将流量保存到文件中,文件中的信息时无法直接查看的
-r # 读取文件中的内容
-v # 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv # 输出详细的报文信息
-nnvvi eth0
# 实例
1、默认启动
tcpdump -vv # 普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包
2、过滤主机
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
3、过滤端口
tcpdump -i eth1 port 80 # 抓取所有经过eth1,目的或源端口是80的网络数据
tcpdump -i eth1 src port 80 # 指定源端口
tcpdump -i eth1 dst port 80 # 指定目的端口
4、协议过滤
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
5、常用表达式
非:! 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,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
七、Linux常用网络命令
1、nc
- nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
#常用选项
-l #用于指定nc将处于侦听模式。
-u #指定nc使用UDP协议,默认为TCP
-v #输出交互或出错信息,新手调试时尤为有用
-w #超时秒数,后面跟数字
-z #表示zero,表示扫描时不发送任何数据
2、nmap
- Nmap即网络映射器对Linux系统/网络管理员来说是一个开源且非常通用的工具。Nmap用于在远程机器上探测网络,执行安全扫描,网络审计和搜寻开放端口。
-p #指定端口号
-p22 #单个端口
-p22,80 #多个端口
-p1-1000 #1到1000之间的端口
3、netstat
- 打印网络连接、路由表、tcp 11种状态
#常用选项
-l #只显示监听套接字。
-n #不做名字解析
-t #显示tcp端口
-u #显示udp端口
-p #显示pid和程序名字
-r #显示路由表
-a #显示所有的套接字
标签:ACK,0.0,报文,网络,TCP,须知,FIN,WAIT
From: https://www.cnblogs.com/9Dusk/p/18366355