TCP三次握手和四次挥手全过程
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立连接:
SYN:同步标志。该标志仅在三次握手建立TCP连接时有效。
ACK:确认标志。同时提示远端系统已经成功接收所有数据
PSH: 表示有DATA数据传输
FIN: 结束标志
RST: reset表示连接重置
URG: urgent紧急指针字段值有效
建立TCP连接
三次握手: TCP的连接建立是一个三次握手的过程,目的是通信双方确认开始序列,以便后续通信的有序进行。
1. 连接请求: 连接开始时,客户端(Client)发送SYN包,并包含了一个初始的seq=a的值,客户端(Client)进入SYN_SENT状态,等待服务端(Server)确认
2. 请求确认: 服务端(Server)收到数据包后知道客户端(Client)请求建立连接,将回复一个SYN包,并包含了对上一个a包的回应信息ACK,ACK=a+1.然后还包含了一个随机的自己初始seq=b,服务端进入SYN_RCVD状态
3. 连接确认: 客户端(Client)收到确认SYN包后,检查ack是否为a+1,如果正确将回复发送一个ACK包,其中包含了一个ACK=b+1,和一个seq=a+1,服务端(Server)检查ACK是否为b+1,如果正确则建立连接,Client和Server进入ESTABLISHED状态,完成三次握手,Client和Server之间开始传输数据
断开TCP连接
四次挥手: 即终止TCP连接,需要Client端和Server端总共发送4个包已确认连接的断开
1. Client发送一个FIN并包含一个随机的seq=a,主动关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
2. Server收到FIN后,发送一个ACK并包含一个seq=a+1给Client,Server进入CLOSE_WAIT状态。
3. Server发送一个FIN并包含一个随机的seq=b和一个ACK=a+1,用来关闭Server到Client的数据传输,Server进入LAST_ACK状态。
4. Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK并包含一个seq=b+1给Server,Servr收到ACK包后进入CLOSED状态,完成四次挥手
TCP的连接请为什么会采用三次握手,若采用二次握手可以吗?
采用三次握手是为了防止失效的连接请求报文段突然又传送到Server端主机,因而产生错误。失效的连接请求报文段是指:
Client发出的连接请求没有收到Server的确认,于是一段时间后,client又重新向server发送方连接请求,且建立成功,顺利完成数据传输。
考虑这样一种特殊情况,client第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟到达server,Server主机以为是client又发起的新请求连接,于是server同意连接,并向client发回确认,但是此时client根本不会理会,server就一直等待client发送数据,导致server资源浪费。
采用二次握手不行,原因就是上面说的失效的连接请求的特殊情况,因此采用三次握手刚刚好,两次可能出实现失效,更多次则没必要,反而复杂了。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
统计TCP连接每种状态的连接的数量
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
zabbix ----监控TCP连接状态
TCP的连接状态可以看出网络的连接情况,服务器的压力情况,对服务器的并发有很好的直观反映,
基本查询命令:
[root@172-21-3-220 ~]# netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'
LISTEN 13
ESTABLISHED 26
TIME_WAIT 35
客户端配置:
1)TCP状态获取脚本
# vim /etc/zabbix/scripts/tcp_conn_status.sh
#!/bin/bash
#this script is used to get tcp and udp connetion status
#tcp status
metric=$1
tmp_file=/tmp/tcp_status.txt
/bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' > $tmp_file
case $metric in
closed)
output=$(awk '/CLOSED/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
listen)
output=$(awk '/LISTEN/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
synrecv)
output=$(awk '/SYN_RECV/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
synsent)
output=$(awk '/SYN_SENT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
established)
output=$(awk '/ESTABLISHED/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
timewait)
output=$(awk '/TIME_WAIT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
closing)
output=$(awk '/CLOSING/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
closewait)
output=$(awk '/CLOSE_WAIT/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
lastack)
output=$(awk '/LAST_ACK/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
finwait1)
output=$(awk '/FIN_WAIT1/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
finwait2)
output=$(awk '/FIN_WAIT2/{print $2}' $tmp_file)
if [ "$output" == "" ];then
echo 0
else
echo $output
fi
;;
*)
echo -e "\e[033mUsage: sh $0 [closed|closing|closewait|synrecv|synsent|finwait1|finwait2|listen|established|lastack|timewait]\e[0m"
esac
2)给脚本赋予执行权限并执行脚本进行测试,给tcp_status.txt文本zabbix权限
# chmod +x /etc/zabbix/scripts/tcp_conn_status.sh
# bash /etc/zabbix/scripts/tcp_conn_status.sh established
1239
# chown zabbix.zabbix /tmp/tcp_status.txt
3)配置zabbix监控项键值
# vim /etc/zabbix/zabbix_agentd.d/userparameter_tcp_conn.conf
UserParameter=tcp.status[*],/etc/zabbix/scripts/tcp_conn_status.sh $1
4)重启zabbix-agent
服务端配置:
获取 监控模板
模板链接:https://pan.baidu.com/s/1pq-2Swff1XzeHwVkvABQEQ 提取码:2iab
TCP连接参数调优
- 开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0表示关闭:
net.ipv4.tcp_syncookies = 1 - 开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0表示关闭:
net.ipv4.tcp_tw_reuse = 1 - 开启TCP连接中TIME_WAIT sockets的快速回收,默认为0表示关闭:
net.ipv4.tcp_tw_recycle = 1 - 系统默认的TIMEOUT时间
net.ipv4.tcp_fin_timeout = 5 - 当keepalive启用的时候,TCP发送keepalived消息的频度,默认是2h,改为20min:
net.ipv4.tcp_keepalive_time = 1200 - 用于向外连接的端口范围
net.ipv4.ip_local_port_range = 32768 60999 - SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_syn_backlog = 8192 - 系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息
net.ipv4.tcp_max_tw_buckets = 65536
TCP三次握手和四次挥手全过程的更多相关文章
- 【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答
TCP三次握手和四次挥手的全过程 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ...
- TCP三次握手及四次挥手详细图解
TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...
- 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制
关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
- 【HTTP协议】---TCP三次握手和四次挥手
TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道. 在Http工作之前,Web浏览器通过网络和W ...
- 网络通信 --> TCP三次握手和四次挥手
TCP三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 一.TCP报文格式 如下图: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- TCP‘三次握手’和‘四次挥手’(通俗易懂)
概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...
- [ 转载 ] Tcp三次握手和四次挥手详解
#TCP的报头: 源端口号:表示发送端端口号,字段长为16位.目标端口号:表示接收端口号,字段长为16位.序列号:表示发送数据的位置,字段长为32位.每发送一次数据,就累加一次该数据字节数的大小.注意 ...
- 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手
网络的五层划分是什么? 应用层,常见协议:HTTP.FTP 传输层,常见协议:TCP.UDP 网络层,常见协议:IP 链路层 物理层 TCP 和 UDP 的区别是什么 TCP/UDP 都属于传输层的协 ...
随机推荐
- 10.prometheus监控--监控进程process
一.进程监控 如果想要对主机的进程进行监控,例如chronyd,sshd等服务进程以及自定义脚本程序运行状态监控.我们使用node exporter就不能实现需求了,此时就需要使用process ex ...
- NetCore开发第一步 Log4Net日志引入
1.新建一个带mvc模板的项目: 2.引入Microsoft.Extensions.Logging.Log4Net.AspNetCore包,不要引入错了. 引入后后包的结果如下: 3.Startup类 ...
- 【Python Web】flask视频流
这篇文档,完全借鉴miguelgrinberg的博客. https://blog.miguelgrinberg.com/post/flask-video-streaming-revisited 想看具 ...
- 【图形数据集】CIFAR-10 dataset数据集
文献引用:https://www.cs.toronto.edu/~kriz/cifar.html The CIFAR-10 dataset The CIFAR-10 dataset consists ...
- 1、Linux基础
1.centos 安装 2.磁盘分区表示方法 1.2.3.4:主分区,最多4个主分区,后数据为逻辑分区 主分区可以激活,但一个硬盘只能激活一个主分区 被激活的主分区就是用来引导操作系统的主分区 扩展分 ...
- 第三章-常用的渗透测试工具-(sqlmap)
常用渗透测试工具 1.sqlmap 支持的数据库:MySQL.Oracle.PostgreSQL.SQL Server.Access.IBM DB2.SQLite.Firebird.Sybase.SA ...
- Debian(WSL)安装gprMax教程 - 适用于Windows系统
原文发布于:https://blog.zhaoxuan.site/archives/33.html: 第一时间获取最新文章请关注博客个人站:https://blog.zhaoxuan.site. 1. ...
- vue安装tinyMCE
目录 [参考视频] [参考文章] 官网: https://www.tiny.cloud/auth/signup/ 资源下载 tinymce 官方为 vue 项目提供了一个组件tinymce-vue n ...
- vscode插件安装和配置支持vue3
一.常用插件介绍 1.插件Vue 3 Snippets 作用:用于vue3的智能代码提示,语法高亮.智能感知.Emmet等.替代Vetur插件,Vetur在vue2时期比较流行. 常用命令:vuein ...
- java的synchronized有几种加锁方式
在Java中,synchronized关键字提供了内置的支持来实现同步访问共享资源,以避免并发问题.synchronized主要有三种加锁方式: 1.同步实例方法 当一个实例方法被声明为synchro ...