目录
实验:如果我需要知道某台机器的6个端口,22 23 25 3306 80 8000 哪些端口是开放的,哪些没有开放?如何做呢?
参考文章(GOOD):4.1 TCP 三次握手与四次挥手面试题 | 小林coding
listen 时候参数 backlog 的意义?(半连接队列(SYN 队列)、全连接队列(Accpet 队列))
TIME_WAIT这个状态在哪台机器上可以看到,就表示是哪台机器发送的断开连接请求
TIME_WAIT状态特别多(Web服务器上),说明了什么问题?
TCP的头部封装
实验:如果我需要知道某台机器的6个端口,22 23 25 3306 80 8000 哪些端口是开放的,哪些没有开放?如何做呢?
shell脚本:
[root@sc-server port]# cat scan_port.sh
#!/bin/bash
#如果我需要知道6个端口,22 23 25 3306 80 8000 哪些端口是开放的,哪些没有开放?如何做呢?
#创建文件
>open_port.txt
>closed_port.txt
#定义端口数组
port=(22 23 25 53 3306 80 8000)
for i in "${port[@]}"
do
if nc -z -w 1 $1 $i ;then
echo "$i端口开放" |tee -a open_port.txt
else
echo "$i端口未开放"|tee -a closed_port.txt
fi
done
[root@sc-server port]#
python脚本:
import socket
"""
socket:socket 是 Python 提供的用于网络通信的模块,它允许我们创建和操作套接字。
socket.AF_INET:AF_INET 是地址族(Address Family)的常量,用于指定 IPv4 地址族。这表示我们将使用 IPv4 的网络通信。
socket.SOCK_STREAM:SOCK_STREAM 是套接字类型(Socket Type)的常量,用于指定 TCP 套接字类型。这表示我们将创建一个基于流的、可靠的、面向连接的 TCP 套接字。
通过将 socket.AF_INET 和 socket.SOCK_STREAM 作为参数传递给 socket.socket() 函数,我们创建了一个 TCP 套接字,用于在网络上进行基于流的通信。
这种套接字可以用于与其他计算机建立可靠的连接,并在连接的两端之间传输数据流。TCP 套接字提供了可靠性、有序性和错误检测等特性,适用于需要稳定连接的应用程序,如网页浏览器、邮件客户端和数据库连接等。
"""
def check_port(domain, port):
ip = socket.gethostbyname(domain) # 解析域名获取IP地址
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1) # 设置超时时间为1秒钟
result = sock.connect_ex((ip, port))
#connect_ex() 方法返回一个表示连接状态的数字,其中 0 表示连接成功,非零值表示连接失败或错误码。
sock.close()
if result == 0:
print(f"Port {port} is open")
else:
print(f"Port {port} is closed")
domain = "www.baidu.com" # 指定域名
ports = [22, 23, 25, 3306, 80, 8000] # 指定端口列表
for port in ports:
check_port(domain, port)
socket的分类:网络socket和文件socket
socket 槽、接口、接头--》建立连接的库
网络socket: ip+port 192.168.1.1:80
实现不同的机器之间的进程和进程之间的通信
文件socket: 系统里的一个文件
实现相同的机器里的进程和进程之间的通信socket 在操作系统里是实现进程和进程之间通信的一种方式
参考文章(GOOD):4.1 TCP 三次握手与四次挥手面试题 | 小林coding
TCP的三次握手
面试时该怎么讲TCP的三次握手呢?
TCP三次握手报文解释:
首先我们先设HostA为Client,HostB为Web服务器,首先我们的客户机向Web服务器发起连接,源端口为50000,目的端口为80,起始发送的序列号seq为100,同时我们的控制位SYN为1,数据就会通过网络传递给我们的Web服务器,我们的Web服务器就会回复我们,因为它一直监控着他的80端口,当接收到Client发送的数据后,我们的Web服务器就会开始封装数据,它会把SYN设置为1,ACK设置为1,同时序列号seq假设设置为300,而确认号ack为101(为上一个数据包序列号seq+1),然后通过网络发送给Client客户机,我们的客户机收到后就会发送一个确认包,它会将ACK设置为1,同时序列号seq为101(上次Client发送的序列号的基础上加一),确认号ack为301,当我们的Web服务器收到后,我们的TCP三次握手就完成了。
TCP三次握手状态解释:
当我们的Client发送第一个包后,他的状态就会变成SYN-SENT(同步发送状态)状态,我们的Web服务器之前是LISTEM(监听状态)状态,收到Client发送的包后就会变成SYN-RCVD(同步接收状态)状态,然后它会回应包给Client,当我们的Client客户机收到Web服务器发送的回应包后,他的状态就会变成ESTABLISHED(建立连接状态)状态,然后Client会发送响应包给Web服务器,当我们的Web服务器收到包后也会变成ESTABLISHED(建立连接状态)状态,至此,我们的客户机和服务器成功的建立了TCP连接
总结:
首先我们的Client客户机会向Web服务器发送请求,其中源端口为50000,目的端口为80,请求包发送的序列号seq为100,同时控制位SYN为1,并且请求包会通过网络传递给我们的Web服务器,此时我们的Clinet客户机的状态就会变成SYN-SENT(同步发送状态)状态,我们的Web服务器会收到Client发送的请求包,并且会回应给Client客户机一个回应包,其中回应包中会把SYN设置为1,ACK设置为1,同时序列号seq假设设置为300,确认号ack为101,Web服务器的状态会从LISTEM(监听状态)状态转变为SYN-RCVD(同步接收状态)状态,并通过网络将回应包发送给Client客户机,Client客户机收到Web服务器发送的回应包后,就会发送一个确认包给Web服务器,目的是确认产生TCP连接,确认包中包含了将控制位ACK设置为1,同时序列号seq为101确认号ack为301,此时我目的Client客户机的状态就会转变为ESTABLISHED(建立连接状态)状态,并通过网络传输确认包给Web服务器,当Web服务器接收到确认包后它的状态也会变成ESTABLISHED(建立连接状态)状态,至此,我们的Client客户机和Web服务器成功的建立的TCP连接。
为什么需要进行三次握手,我们进行两次不行吗?
因为我们只进行两次握手的话可能会造成问题,问题是我们的Client客户机发送了请求包给了Web服务器,当我们的Web服务器收到了请求包,并也发送回应包给了Client客户机,但是我们的Client客户机没有接收到回应包(可能是回应包丢失了(丢包)或者 可能我们的Client服务器断网了,无法接收到Web服务器发送的任何包了),着就会导致网络连接异常,双方无法连接上。
我们如果过进行三次握手的话就可以排除这个错误,可以防止当回应包丢失后,可以使我们的Web服务器继续发送Web回应包(Web服务器会一直发送回应包,直到收到Client客户机发送的确认包后停止或者是一段时间后停止),直到是我们的Client客户机接收到回应包,并发送确认包给Web服务器。
listen 时候参数 backlog 的意义?(半连接队列(SYN 队列)、全连接队列(Accpet 队列))
Linux内核中会维护两个队列:
- 半连接队列(SYN 队列):接收到一个 SYN 建立连接请求,处于 SYN_RCVD 状态;
- 全连接队列(Accpet 队列):已完成 TCP 三次握手过程,处于 ESTABLISHED 状态;
backlog(积压的未完成的工作)
半连接队列、全连接队列拓扑图
三个方面分析三次握手的原因:
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
原因一:避免历史连接(简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。)
原因二:同步双方初始序列号()
原因三:避免资源浪费
ping某个IP是否会建立TCP三次握手呢?
不会,因为ping命令使用的是ICMP协议,是存在于IP协议中的,是运行在网络层的,所以并不会影响到传输层的TCP协议。
SYN攻击(洪水攻击)
什么是 SYN 攻击?如何避免 SYN 攻击?
我们都知道 TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN
报文,服务端每接收到一个 SYN
报文,就进入SYN_RCVD
状态,但服务端发送出去的 ACK + SYN
报文,无法得到未知 IP 主机的 ACK
应答,久而久之就会占满服务端的半连接队列,使得服务端不能为正常用户服务。
攻击者会发送大量的给你的机器发送SYN为1同步报文,致使你的机器的TCP 半连接和全连接队列大量的消耗,直到消耗殆尽,导致一些正常的TCP连接无法连接上过来
破解之法:
第一是可以增加 TCP 半连接队列数(增加设被性能(加钱))
第二是减少 SYN+ACK 重传次数
TCP的四次挥手
四次挥手拓扑图
四次挥手过程:
当客户端(主动关闭方)调用 close 函数后,就会向服务端发送 FIN 报文,试图与服务端断开连接,其中包含了控制位FIN为1,ACK为1,序列号seq为101,确认号ack为301,此时客户端的连接进入到
FIN_WAIT_1
状态。当服务端接收到客户端发送的FIN报文后,它会回应发送一个ACK报文给客户端,其中包含了控制位ACK为1,序列号seq为301,确认号ack为102,此时Web服务器进入了CLOSE_WAIT状态
正常情况下,如果能及时收到服务端(被动关闭方)的 ACK报文,客户端会很快变为
FIN_WAIT2
状态。服务端处于 CLOSE_WAIT 状态一段时间后,主动调用了 close 函数,内核就会发出 FIN 报文,其中包含了控制位FIN为1,ACK为1,序列号seq为301,确认号ack为102,同时服务端连接进入 LAST_ACK状态,等待客户端返回 ACK 来确认连接关闭。
当客户端收到服务端的第三次挥手的 FIN 报文后,就会回 ACK 报文,也就是第四次挥手,其中包含了控制位ACK为1,序列号seq为102,确认号ack为302,此时客户端连接进入
TIME_WAIT
状态,大概在TIME_WAIT状态
等待2MSL时间,客户端就会进入CLOSE状态当服务端接收到客户端发送的ACK报文后,服务端就会从LAST_ACK状态转变为CLOSE状态。
MSL代表着什么?
在 Linux 系统里 2MSL
默认是 60
秒,那么一个 MSL
也就是 30
秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒。
TIME_WAIT这个状态在哪台机器上可以看到,就表示是哪台机器发送的断开连接请求
TIME_WAIT状态特别多(Web服务器上),说明了什么问题?
1、表示有大量的连接到你的Web服务器,但是他们没有继续访问其他的页面,在一个页面停留的时间很长(Web服务器就会主动断开) --》这是正常现象
2、也有可能有人正在攻击你,并且是真正的建立连接的那种
TCP的流控机制-滑动窗口
流控机制--》流量控制
步骤:
接收方通过传输控制块(TCB)中的窗口字段来通知发送方自己的可接收窗口大小(滑动窗口),即剩余的缓冲区大小。初始窗口大小由接收方的操作系统决定,并且可以根据网络情况动态调整。
发送方根据接收方通知的窗口大小,确定自己可以发送的数据量。发送方将数据分成小块(也称为报文段或分段),每个报文段的大小不会超过接收方的窗口大小。
发送方发送第一个报文段,并开始启动计时器,等待接收方的确认。
接收方收到报文段后,如果数据没有错误,则对数据进行确认,并将已成功接收的数据放入缓冲区。
接收方发送一个确认报文段给发送方,其中包含了新的窗口大小。
发送方收到确认报文段后,根据接收方的窗口大小再次确定可以发送的数据量,并继续发送数据。
此过程循环进行,发送方根据接收方的窗口大小和确认信息动态调整发送速率,以适应网络的状况。
计时器:
重传计时器:只是ACK控制位为1的数据段,不会重传,其他的都会重传
坚持计时器-为了防止零窗口死锁
保活计时器-防止两个TCP之间的连接出现长时间的空闲
时间等待计时器-连接终止期间使用的,在发送了最后一个ACK后,不立即关闭连接,而是等待一段时间,保证能接收到重复的FIN数据段。
等待2MSL 60秒 MSL=30秒(linux内)
重传计时器(体现了TCP 的可靠性)
常用端口号:
查看linux系统常用端口号:
[root@sc-server nginx]# vim /etc/services
端口 协议 说明
21 FTP 文件传输协议,用于上传、下载
22 SSH
23 Telnet 用于远程登录,通过连接目标计算机的这一端口,得到验证后可以远程控制管理目标计算机
25 SMTP 简单邮件传输协议,用于发送邮件
53 DNS 域名服务,当用户输入网站的名称后,由DNS负责将它解析成IP地址,这个过程中用到的端口号是53
80 HTTP 超文本传输协议,通过HTTP实现网络上超文本的传输
443 HTTPS 加密的http协议
3306 MYSQL服务
110 POP3
67 dhcp server udp
68 dhcp client udp
DOS攻击
拒绝服务(DoS):DoS是 Denial of service的简称,即拒绝服务,任何对服务的干涉,使得其可用性降低或者失去可用性均称为拒绝服务。例如一个计算机系统崩溃或其带宽耗尽或其硬盘被填满,导致其不能提供正常的服务,就构成拒绝服务
DOS攻击是指恶意用户或黑客通过各种手段,如向目标服务器发送大量的请求、利用漏洞进行攻击等,旨在使目标服务器或网络资源无法正常提供服务。DOS攻击的目的是消耗目标系统的资源,使其无法响应合法用户的请求,从而导致服务不可用。(DOS模拟的是真实的访问最好的解决方法就是增加带宽和硬件资源,加钱搞更多的服务器)
SYN Flood 攻击:攻击者向目标服务器发送大量TCP连接请求中的SYN包,但不会完成三次握手过程,从而占用服务器资源并导致服务不可用。
ICMP Flood 攻击:攻击者发送大量伪造的ICMP(Internet Control Message Protocol)请求给目标主机,造成目标主机资源耗尽,无法响应正常的请求。
UDP Flood 攻击:攻击者发送大量伪造的UDP(User Datagram Protocol)数据报给目标服务器,使其处理大量无效请求而导致资源耗尽。
HTTP Flood 攻击:攻击者模拟大量合法用户向目标服务器发送HTTP请求,使服务器超负荷运行或者占用所有可用的连接,导致无法处理真实用户的请求。
解决方法:
1、增加带宽和硬件资源
2、流量过滤和反向代理
3、配置防火墙和入侵检测系统
4、配置合理的网络架构和负载均衡
5、使用限流和连接数限制
DDOS攻击
DDOS分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击,使攻击的目标无法正常使用,分布式拒绝服务攻击已经出现了很多次,导致很多的大型网站都出现了无法进行操作的情况,这样不仅仅会影响用户的正常使用,同时造成的经济损失也是非常巨大的(它会使用肉鸡攻击)
肉机(肉鸡): 被黑客控制了的机器(中了木马或者病毒的机器)
10万肉鸡
10万台机器连接到你的电脑: 消耗你的带宽、cpu、内存、磁盘IO---》导致你的服务器崩溃
CC攻击
攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(Challenge Collapsar)。
CC(ChallengeCollapsar,挑战黑洞)攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求。
CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。
cc攻击 --》特殊的DDOS攻击--》http业务 web业务 网站业务
合法代理商---》10万---》出租服务器 ---》正常的网站访问