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 都属于传输层的协 ...
随机推荐
- 从 Uno Platform 4 更新 Uno Platform 5 的迁移方法
本文记录我的一个小项目从 Uno Platform 4 更新 Uno Platform 5 的一些变更和迁移方法,由于项目太小,可能踩到的坑不多 官方文档: Migrating to Uno Plat ...
- 一个库帮你轻松的创建漂亮的.NET控制台应用程序
前言 做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试.今天大姚给大家分 ...
- uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈
原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat. uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技 ...
- SpringBoot-Http请求工具类
一.编写请求配置类 import com.alibaba.fastjson.JSONObject; import org.springframework.context.annotation.Conf ...
- SQL Server实战七:自定义数据类型、标量值、内嵌表值、多语句表值函数的操作
本文介绍基于Microsoft SQL Server软件,实现数据库用户自定义数据类型的创建.使用与删除,以及标量值.内嵌表值.多语句表值函数等用户定义函数的创建.使用.删除方法. 目录 1 用S ...
- C语言:实现数组的删除和增加
/* 删除方法: 如:12 32 56 84 95 用覆盖的方法 若删除第三个,则第四个要覆盖第三个,第五个要覆盖第四个 覆盖完:12 32 84 ...
- pageoffice 6版本隐藏office工具栏和自定义按钮,并修改标题栏内容
在实际项目集成调用PageOffice的过程中: (1)有时需要把Office的工具栏隐藏,比如只读模式打开文件的时候,Office工具栏上的按钮几乎都是灰掉的,此时显示Office工具栏没有任何意义 ...
- 【数字基座·智慧物联】AIRIOT新品发布会在京举办
2023年6月6日,由航天科技控股集团股份有限公司主办的"数字基座·智慧物联"AIRIOT新品发布会在北京成功举办,重磅发布了AIRIOT 4.0物联网平台的五大核心能力引擎,并邀 ...
- yum install --downloadonly
yum install --downloadonly --downloaddir=[directory] [package] https://www.cnblogs.com/wangbaobao/p/ ...
- salesforce零基础学习(一百三十七)零碎知识点小总结(九)
本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_conditional_visibiliy_tab.ht ...