传输层:4层-->负载均衡-->4层、7层
作用:提供端到端的连接
工作原理:TCP封装格式、TCP的连接与断开、流量控制、拥塞控制、差错控制、计时器、TCP的应用
TCP(Transmission Control Protocol)
传输控制协议,可靠的、面向连接的协议,传输效率低

端口号的范围:2^16=65536 0~65535
常见的端口 0~1023 被很多经典的服务占用了
确认号:告诉发送端这个序号之前的数据段都收到了
6个控制位:表示数据段的特殊含义(flag)
URG:紧急位 1
ACK:确认位,表示对别人给你发的数据的确认
PSH:急迫位,提醒接收端,赶紧处理发送过来的数据push
RST:重置位,重新建立连接reset
SYN:同步位,1表示发起连接了sync
FIN:终止位,断开连接finish
窗口值:表示本地可以接收多少数据,最大65536-->对双方进行流量控制
tcp的头部占20个字节,ip包头也占20个字节,1500-20-20=1460 是应用层封装的数据的最大值

TCP 三次握手
主要是为了在客户端和服务端之间建立可靠的连接
第一次:(客户端->服务端)客户端发送一个SYN包(同步信号),告诉服务端:"我想建立连接",并携带一个初始序列化seq=x,此时客户端进入syn-sent状态
第二次:(服务端->客户端)服务端收到后,回复一个SYN+ACK,意思是:"我收到你的请求,我也准备好连接了",确认号是ack=x+1,同时也带上自己的序列号seq=y,此时服务端进入syn-rcvd状态
第三次:(客户端->服务端)客户端收到后,再回复一个ACK包,确认号为ack=y+1,表示"好的,我也收到你的确认了",此时双方都进入ESTABLISHED(连接建立)状态,可以开始传数据了
为什么要三次
为了防止已失效的连接请求突然传到了服务器 ,导致错误建立连接,从而浪费资源
Recv&&Send

- Recv-Q 高 :通常是代码问题。程序读数据太慢,或者被阻塞了。
- Send-Q 高 :通常是网络问题 或对端问题。网络丢包严重,或者对方程序挂了/处理太慢,导致你的数据发过去石沉大海
四次挥手
释放资源 (进程、消耗cpu、内存、网络带宽等),客户端和服务端都可以提出断开

第一次挥手(A发起关闭请求):A主动想要关闭连接,向B发送一个FIN包(FIN=1),并携带序列号seq=u,但此时A虽然发了FIN,但还能接收数据
第二次挥手(B确认收到):B收到A的FIN包后,发送一个ACK包(ACK=1),确认号为ack=u+1,序列号为seq=v,B收到A的请求,但还有数据没发完,稍微等一下,还可以继续向A发送剩余的数据
第三次挥手(B也准备关闭):发送完剩余数据后,向A发送FIN包(FIN=1),同时带上ACK标志(ACK=1),我的数据发送完了,我也要关闭了
第四次挥手(A最后确认):客户端A收到B的FIN后,发送一个ACK 包(ACK=1),进入TIME-WAIT 状态,必须等待2MSL的时间,才能进入CLOSED状态,而B收到ACK后,直接进入CLOSED状态,连接彻底断开
计时器:1、重传计时器:防止数据在传输的过程中丢失,超时重传
2、时间等待计时器:连接终止期间使用的,在发送了最后一个ACK后,不立即关闭连接,而是等待一段时间,保证能接收到重复的FIN数据段-->MSL:最大报文段寿命
为什么要有TIME-WAIT状态?
1、保证A发送的最后一个ACK能到达B
2、防止"旧连接的报文"干扰新连接
服务器里查看网络状态发现大量time-wait,判断服务器出现了什么问题?
web服务器-->httpd服务->短连接 nginx->长连接64秒
长连接:三次握手成功建立连接后,传输数据完成后,不会立马进行四次断开,会等一段(64秒)时间,然后再进行四次断开
短连接 :三次握手成功建立连接后,传输数据完成后,立马进行四次断开
1、说明服务器有大量的访问-->正常、不正常(黑客攻击)
2、服务器主动断开
攻击方式
SYN泛洪攻击:
利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求 ,而被攻击端发出的响应 报文将永远发送不到目的地 ,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
防范措施:降低SYN timeout时间 ,使主机尽快释放半连接的占用;采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击
DOS拒绝服务攻击
已消耗完我们的资源为目的,导致我们没有能力为其他的用户提供服务了
防范措施:攻击工具:模拟1000个人访问 封一个IP
DDOS分布式拒绝服务攻击
dos升级版,分布的,协同的大规模攻击方式,借助数百、甚至数千台被入侵后安装了攻击进程的主机同时发起的集团行为
防范措施:加服务器,购买流量清洗服务(360、齐安信、天融信、深信服、启明星辰-->安全厂商)
CC(ChallengeCollapsar,挑战黑洞)
使用代理服务器向受害服务器发送大量貌似合法的请求
TCP的流控机制--滑动窗口
指明本地可接收数据的字节数
2^16/1024=64k
滑动窗口:本机缓存里能接收多少数据
通过滑动窗口的值来进行流量控制-->网络不堵的情况下
拥塞控制:中间的传输网络的带宽的反馈
TCP差错控制的3种方式
- 校验和
- 确认-->受损伤的数据段、丢失的数据段、重复的数据段、失序的数据段、确认的丢失
- 超时
TCP的计时器
- 重传计时器-为了控制丢失的数据段
- 坚持计时器 -为了防止零窗口死锁win=0,发送探测数据段,提醒接收端确认已丢失,如果没有 坚持计时器和探测数据段,ack丢失时,双方将会进入等待死锁的状态
- 保活计时器 -防止两个TCP之间的连接长时间的空闲**,** 发送探测数据段,如果发送了10个探测数据段,还没有响应,则断开连接
- 时间等待计时器 -连接终止期间使用,在发送了最后一个ACK后,不立即关闭连接,而是等待一段时间,保证能接收到重复的FIN数据段
UDP(User Datagram Protocol)
用户数据报协议 ,不可靠 的、无连接的服务,传输效率高

UDP没有流控机制
只有校验和-提供->UDP的差错控制(需要上层协议来提供差错控制:如TFTP协议)
ntp:(Network time protocol)网络时间协议,在互联网上同步时间
linux同步时间法一:
[root@xiaoyu ~]# date
2026年 04月 18日 星期六 11:16:44 CST
[root@xiaoyu ~]# date -s "2036-4-18"
2036年 04月 18日 星期五 00:00:00 CST
[root@xiaoyu ~]# date
2036年 04月 18日 星期五 00:00:01 CST
[root@xiaoyu ~]# service chronyd restart
Redirecting to /bin/systemctl restart chronyd.service
[root@xiaoyu ~]# date
2026年 04月 18日 星期六 11:17:30 CST
法二:使用utpdate命令去同步时间
yum install epel-release -y
yum install ntpsec -y
which ntpdate
网络相关的命令
1、netstat-->看自己开放了哪些端口,有哪些人和自己建立连接

2、nc和nmap-->扫描别人的机器开放了哪些端口
- ping 使用的是 ICMP 协议 ,它只负责探测网络通断,不涉及端口。
- nc 使用的是 TCP 协议 ,它必须指定端口才能建立连接
不是开放的端口越多越好,越多表示公开的服务多,容易受到攻击,还有消耗的cpu和内存就会多
2个角度去思考:安全性、资源消耗



root@xiaoyu nat\]# nc -z -w 1 www.baidu.com 8090 //-z 只是建立连接,不发送数据 -w 指定超时时间

[root@xiaoyu nat]# cat port_scan.sh
#!/bin/bash
#端口号写死
#port="22 3306 80 443 67 68 110 25 143 53"
#端口号从文件里获得
port_file="/nat/port.txt"
#需要去扫描的服务器ip地址文件
server_ip="/nat/server_ip.txt"
for ip in $(cat $serve_ip)
do
for i in $(cat $port_file)
do
echo $i
if nc -w 1 -z $ip $i;then
echo "$ip $i port is open"|tee -a server_open_port.txt
else
echo "$ip $i port is closed"|tee -a server_closed_port.txt
fi
done
done
[root@xiaoyu nat]# bash port_scan.sh
120.24.223.108 22 port is closed
120.24.223.108 3306 port is closed
120.24.223.108 80 port is open
120.24.223.108 443 port is open
120.24.223.108 67 port is closed
vim里进入可视行模式(大写的V)--\>选中需要缩进的多行(**上下方向键**)--\>按shift+\> 右移
\[root@xiaoyu nat\]# echo "hello,world"\|**tee** -a hello.txt //屏幕上输出,同时写往文件 -a 追加

python编写脚本
1、使用库,调用linux的命令
2、使用库,不调用linux的命令--\>推荐的方法
python里的哪个库可以调用linux命令?--\>import subprocess
python/go里的哪个库可以实现扫描端口的功能?--\>python socket库 go net包来实现扫描端口的功能
库:别人写好的用来实现某些功能的.py结尾的文件--\>轮子
[root@xiaoyu nat]# cat port_scan.py
#!/usr/bin/python
import socket
def port_scanner(host,start_port,end_port):
open_ports = []
for port in range(start_port,end_port+1):
#实例化对象sock
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置连接的超时时间
sock.settimeout(1)
#真正的去发起连接
result = sock.connect_ex((host,port))
if result == 0:
open_ports.append(port)
sock.close()
return open_ports
host = 'localhost'
start_port = 1
end_port = 30
open_ports = port_scanner(host,start_port,end_port)
print(f"Open ports on {host} are:{open_ports}")
[root@xiaoyu nat]# python3 port_scan.py
Open ports on localhost are:[22]
>>> import subprocess
>>> result = subprocess.run("ip add",shell=True,check=True,stderr=subprocess.PIPE)
1: lo: