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 都属于传输层的协 ...
随机推荐
- [FAQ] swagger-php 支持 Authorization Bearer token 校验的用法
@OA\SecurityScheme 可以是 Controller 层面也可以是 Action 层面. 类型 type="apiKey". in="header" ...
- WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本
在 WPF 里面,提供的使用底层的方法绘制文本是通过 DrawGlyphRun 的方式,此方法适合用在需要对文本进行精细控制的定制化控件上.此方法特别底层而让调用方法比较复杂,本文告诉大家一些简单的使 ...
- git将本地项目关联远程仓库并上传到新分支
混合项目开发,项目交接的时候没做好,新入职接手老项目的时候一脸懵逼,进入开发阶段时,越搞越不对,越搞越不对,总感觉 本地跑的项目和己方测试环境以及客户的测试环境和目标环境不一致,结果发现着手的两套代码 ...
- 由初中生实现的 Windows 12 网页版!
大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...
- 通过AMDP调用HANA的PAL函数
SAP预测分析库(SAP Predictive Analysis Library,PAL)是SAP HANA中的一项功能,它允许我们在SAP HANA SQLScript过程中执行分析算法. 基于AB ...
- PLC输出指令频率F计算
本文章为学习记录,水平有限,望各路大佬们轻喷!!! 转载请注明出处!!!
- 那什么是URL、URI、URN?
URI Uniform Resource Identifier 统一资源标识符 URL Uniform Resource Locator 统一资源定位符 URN Uniform Resource Na ...
- 每天上一当系列之vue修饰符.number
今天使用number修饰符去处理el-input的内容为数字做校验原本以为省事不少,没想到,为0开头无法输入第二位以后,并且输入的比较多的时候会出现Infinity 很神奇,网上查了说是element ...
- java学习之旅(day.02)
java运行机制 编译型:转换为计算机可读的语言 解释型:用什么,读什么 预编译:java文件(源程序)通过javac命令到class文件,class文件(类)放入类加载器,这个类就加载到JVM中了, ...
- Mono 支持LoongArch架构
近期,著名的.NET开源社区Mono正式支持LoongArch(龙架构),目前LoongArch64架构已出现在.NET社区主干分支上. 详细内容可以跟踪 https://github.com/mon ...