文章目录
- 网络设备
- 交换机
- 交换机的工作原理
- 路由器
- 路由器工作原理
- TCP/IP协议栈
- TCP/IP四层模型
- TCP/IP通信过程
- TCP特性
- TCP包头结构
- 源端口、目标端口
- 序列号(seq)
- 确认号(小ack)
- 标记位
- TCP协议端口号
- 端口号分类
- ssh服务
- nc工具
- 抓包
- socket套接字
- 端口占用
- 三次握手
- Wireshark抓包
- tcpdump
- 四次挥手
- Wireshark抓包
- 有限状态机
网络设备
交换机
交换机是工作在OSI参考模型数据链路层的设备,外表和集线器相似。它通过判断数据帧的目的MAC地址,不断地MAC地址学习,从而将数据帧从合适端口发送出去。
交换机作为网络的核心设备,其主要功能是高效地转发数据,减少冲突,提高网络带宽利用率。通过MAC地址学习和帧转发机制,交换机能够确保数据准确且快速地传递到目标设备。此外,交换机支持的VLAN功能和生成树协议等特性,进一步增强了网络的安全性和稳定性。
交换机的工作原理
交换机的工作原理
1."MAC地址学习":当一个设备首次通过交换机发送数据时,交换机会记录该设备的MAC地址和数据来自的端口号。
通过这种方式,交换机建立并维护一张MAC地址表。
2."数据帧的转发":
2.1 "未知帧广播":如果交换机收到一个数据帧,但MAC地址表中没有目标地址的信息,交换机会将该帧广播到所有端口,
除发送端口外。此时,所有连接的设备都能收到数据包,但只有目标设备会响应。
2.2 "单播转发":一旦目标设备的MAC地址被学习到,后续发送给该设备的数据帧就会直接转发到相应的端口,而不会再广播。
3."帧过滤":交换机会过滤掉不必要的帧,比如目标MAC地址与源MAC地址相同的帧,避免回环。
4."VLAN功能":交换机可以配置VLAN,通过将不同端口划分到不同的VLAN中,实现虚拟网络隔离。
这样,即使在同一个物理交换机上,处于不同VLAN的设备也无法直接通信,增加了网络的安全性。
5."生成树协议(STP)":为了避免网络中出现回路,交换机使用生成树协议(STP)来确定最佳路径并关闭多余的路径,从而防止广播风暴。
路由器
路由器(Router)是连接多个网络的网络设备,通常用于连接局域网(LAN)和广域网(WAN),并且在网络层(第三层)操作。路由器根据IP地址来确定数据包的路径,从而实现不同网络之间的数据传输。
路由器把一个数据包从一个设备发送到不同网络里的另一个设备上去。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成。
路由器工作原理
路由器的工作原理
1."路由表的维护":
1.1 路由器使用路由表来决定数据包的转发路径。路由表包含了目标网络的IP地址及其对应的下一跳(即下一个路由器或网关)的信息。
1.2 路由表可以通过手动配置(静态路由)或动态路由协议自动生成和更新。
2."数据包的转发":
2.1 当路由器接收到一个数据包时,它会检查数据包的目标IP地址,并在路由表中查找匹配的条目。
2.2 路由器根据路由表中的信息将数据包转发到相应的接口或下一跳设备。
2.3 如果路由器找不到匹配的路由,它可能会将数据包转发到默认网关或丢弃数据包。
3."路径选择":
3.1 路由器使用路由协议(如RIP、OSPF、BGP)来获取和分享路由信息,并选择最佳路径。
这些协议基于度量值(如跳数、延迟、带宽)来确定数据包的最佳传输路径。
3.2 在有多条路径时,路由器会选择最优路径进行数据转发,以提高网络的效率和可靠性。
4."网络地址转换(NAT)":
4.1 当内部网络中的设备发送数据包到外部网络(如互联网)时,
路由器会将设备的私有IP地址转换为路由器的公有IP地址。这是通过NAT功能实现的。
4.2 当外部网络的数据包返回时,路由器会将公有IP地址映射回私有IP地址,确保数据包到达正确的内部设备。
5."访问控制和安全":
5.1 路由器可以使用访问控制列表(ACL)来定义允许或拒绝的数据包,增强网络的安全性。
5.2 通过防火墙功能,路由器可以监控和过滤进出网络的数据流,防止攻击和未经授权的访问。
6."广播域和冲突域的隔离":
6.1 路由器将不同网络隔离在不同的广播域中,这意味着广播数据包不会跨越路由器,从而减少网络中的广播流量。
6.2它还隔离了冲突域,防止来自不同网络的数据包在同一段物理网络中发生冲突。
TCP/IP协议栈
TCP/IP四层模型
TCP/IP通信过程
TCP特性
TCP特性
1."面向连接"
解释: TCP是一种面向连接的协议,在传输数据之前必须先建立连接。
这个过程通过“三次握手”来实现,以确保发送端和接收 端都准备好通信。建立连接后,才能进行数据传输。
优点: 提供可靠的端到端通信,确保数据传输的顺序和完整性。
2."可靠性"
解释: TCP 提供可靠的数据传输服务。它通过确认应答、超时重传、序列号等机制来保证数据的可靠性。
确认应答: 每当发送方发送数据段时,接收方需要发送确认应答(ACK),表示已成功接收数据。
超时重传: 如果发送方在一定时间内未收到确认应答,会重新发送数据段。
序列号: 每个数据段都有一个序列号,用于确保数据按照正确的顺序传输和组装。
3."数据流控制"
解释: TCP 采用流量控制机制,确保发送方不会过快地向接收方发送数据,从而避免接收方的缓冲区溢出。
这个机制通过窗口大小(Window Size)来实现。
滑动窗口: 发送方根据接收方的接收能力调整发送速率,窗口大小决定了发送方可以在未收到确认应答前发送的数据量。
4."拥塞控制"
解释: TCP 还具备拥塞控制功能,以避免网络拥塞。常见的拥塞控制算法包括慢启动、拥塞避免、快重传和快恢复等。
慢启动(Slow Start): 发送方开始时发送速度较慢,逐渐增加,直到检测到网络拥塞。
拥塞避免: 发送方通过监控网络状态来避免发送速率增长过快。
快重传和快恢复: 在检测到数据包丢失时快速重传丢失的数据,并调整拥塞窗口。
5."全双工通信"
解释: TCP支持全双工通信,即数据可以同时在两个方向上独立传输。这意味着发送方和接收方可以同时发送和接收数据,而不会互相影响。
6."有序数据传输"
解释: TCP保证数据按发送顺序接收。即使网络中发生乱序,接收方也会根据序列号将数据重新排序,确保数据的完整性。
7."流量控制"
解释: TCP使用滑动窗口协议来进行流量控制,以防止发送方发送过多数据而使接收方无法处理。
流量控制确保了接收方有足够的资源来处理数据。
8."数据完整性校验"
解释: TCP使用校验和(Checksum)来保证数据的完整性。每个数据段在发送时都会生成校验和,
接收方会检查数据段的校验和,以验证数据是否在传输过程中被破坏。
9."三次握手和四次挥手"
"三次握手": TCP在建立连接时使用“三次握手”来确保连接的可靠性。
1.客户端发送SYN 请求包给服务器。
2.服务器收到SYN后,回应SYN-ACK包给客户端。
3.客户端收到SYN-ACK后,再发送ACK包给服务器,连接建立。
"四次挥手": 断开连接时,使用“四次挥手”来安全关闭连接。
1.客户端发送FIN请求断开连接。
2.服务器收到后,回应ACK包确认。
3.服务器再发送FIN包表示同意断开。
4.客户端收到后,发送ACK确认,连接关闭。
更多关于tcp的内核参数,可参看man 7 tcp
TCP包头结构
源端口、目标端口
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536。
序列号(seq)
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始。
确认号(小ack)
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方,我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
标记位
标记位的表示要么是0要么是1
"URG":表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
"ACK":表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。
TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
"PSH":提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。
如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,
如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
"RST":如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
"SYN":在建立连接时使用,用来同步序号。当SYN=1,ACK=O时,表示这是一个请求建立连接的报文段;
当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。
只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
"FIN":表示通知对方本端要关闭连接了,标记数据是否发送完毕。
如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了",带FIN标志的TCP报文段称为结束报文段
TCP协议端口号
传输层通过端口号(port),确定应用层协议,范围0-65535
维基百科:https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
linux上和windows上都有常见tcp端口号范围,
linux在“/etc/services”文件里
windows在“C:\Windows\System32\drivers\etc\services”文件里
[root@rocky ~]# less /etc/services
端口号分类
IANA互联网数字分配机构负责域名,数字资源,协议分配
1.系统端口
0-1023:系统端口或特权端口(仅管理员可用),
众所周知,永久的分配给固定的系统应用使用, 22/tcp(ssh), 80/tcp(http), 443/tcp(https)
2.用户端口
1024-49151:用户端口或注册端口,但要求并不严格,
分配给程序注册为某应用使用,
1433/tcp(SqlServer), 1521/tcp(oracle), 3306/tcp(mysql), 11211/tcpludp (memcached).
3.动态端口
49152-65535:动态或私有端口,客户端随机使用端口,(这些端口并不是一个固定范围,是可以调整的)
范围定义: /proc/sys/net/ipv4/ip_local_port_range
查看动态端口范围和修改范围
[root@centos8 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@centos8 ~]# echo 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
20000 62000
系统端口只能系统管理员使用,普通用户使用会权限拒绝
ssh服务
在windows上我们通过Xshell软件来连接vmware上的虚拟主机,其实是虚拟主机上的运行了ssh服务,我们通过该服务连接到了远程主机。
nc工具
nc号称是网络中的瑞士军刀
抓包
157发给158
158发给157
socket套接字
可以简单的理解为:
socket套接字=IP+port(tcp/udp) 唯一标识网络中应用程序
端口占用
可以使用ss和lsof工具查看占用端口程序
lsof工具需要安装
三次握手
注意三次握手建立连接过程中的状态切换。
使用ss命令的a选项可以看到各种状态
[root@centos8 ~]# man ss
DESCRIPTION
ss is used to dump socket statistics.
It allows showing information similar to netstat.
It can display more TCP and state information than other tools.
[root@centos8 ~]# ss -help
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
-n, --numeric don't resolve service names
-a, --all display all sockets
-l, --listening display listening sockets
-t, --tcp display only TCP sockets
Wireshark抓包
157的机器ssh远程链接158
第一次握手
第二次握手
第三次握手
tcpdump
安装tcpdump
[root@centos8 ~]# dnf -y install tcpdump
四次挥手
TCP断开连接时,客户端和服务端都有可能主动关闭。就像离婚一样,离婚很纠结,需要男女双方都同意才行。
B站弹幕网友说等待2MSL是离婚冷静期。为什么要等,因为网络中,数据包被拆分发送后,有可能先发的数据包后到,后发的数据包先到,为了保证数据包被接受的完整,客户端会等待服务端没有报发送了才断开连接。
但是四次挥手断开连接只是比较理想的状态,若服务器直接宕机了,就不需要跟你确认了。就像电影《消失的她》,妻子被丈夫直接笼沉大海了,就算她不同意离婚也没办法了。
Wireshark抓包
第一次挥手
第二次挥手
第三次挥手
第四次挥手
有限状态机
11种状态机
1.CLOSED 没有任何连接状态
2.LISTEN 侦听状态,等待来自远方TCP端口的连接请求.
3.SYN-SENT 在发送连接请求后,等待对方确认
4.SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
5.ESTABLISHED 代表传输连接建立,双方进入数据传送状态
6.FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
7.FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
8.TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
9.CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
10.LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失.
11.CLOSING 双方同时尝试关闭传输连接,等待对方确认
[root@rocky ~]# man 8 netstat
State
The state of the socket. Since there are no states in raw mode and usually no states used in UDP and UDPLite, this column may be left blank.
Normally this can be one of several values:
ESTABLISHED
The socket has an established connection.
SYN_SENT
The socket is actively attempting to establish a connection.
SYN_RECV
A connection request has been received from the network.
FIN_WAIT1
The socket is closed, and the connection is shutting down.
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown from the remote end.
TIME_WAIT
The socket is waiting after close to handle packets still in the network.
CLOSE The socket is not being used.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting for acknowledgement.
LISTEN The socket is listening for incoming connections. Such sockets are not included in the output unless you specify the --listening (-l)
or --all (-a) option.
CLOSING
Both sockets are shut down but we still don't have all our data sent.
UNKNOWN
The state of the socket is unknown.