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连接参数调优

  1. 开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0表示关闭:

    net.ipv4.tcp_syncookies = 1
  2. 开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0表示关闭:

    net.ipv4.tcp_tw_reuse = 1
  3. 开启TCP连接中TIME_WAIT sockets的快速回收,默认为0表示关闭:

    net.ipv4.tcp_tw_recycle = 1
  4. 系统默认的TIMEOUT时间

    net.ipv4.tcp_fin_timeout = 5
  5. 当keepalive启用的时候,TCP发送keepalived消息的频度,默认是2h,改为20min:

    net.ipv4.tcp_keepalive_time = 1200
  6. 用于向外连接的端口范围

    net.ipv4.ip_local_port_range = 32768 60999
  7. SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数

    net.ipv4.tcp_max_syn_backlog = 8192
  8. 系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息

    net.ipv4.tcp_max_tw_buckets = 65536

TCP三次握手和四次挥手全过程的更多相关文章

  1. 【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答

    TCP三次握手和四次挥手的全过程   TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ...

  2. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  3. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  4. 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题

    重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...

  5. 【HTTP协议】---TCP三次握手和四次挥手

    TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道.     在Http工作之前,Web浏览器通过网络和W ...

  6. 网络通信 --> TCP三次握手和四次挥手

    TCP三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 一.TCP报文格式 如下图: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发 ...

  7. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  8. TCP‘三次握手’和‘四次挥手’(通俗易懂)

      概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...

  9. [ 转载 ] Tcp三次握手和四次挥手详解

    #TCP的报头: 源端口号:表示发送端端口号,字段长为16位.目标端口号:表示接收端口号,字段长为16位.序列号:表示发送数据的位置,字段长为32位.每发送一次数据,就累加一次该数据字节数的大小.注意 ...

  10. 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手

    网络的五层划分是什么? 应用层,常见协议:HTTP.FTP 传输层,常见协议:TCP.UDP 网络层,常见协议:IP 链路层 物理层 TCP 和 UDP 的区别是什么 TCP/UDP 都属于传输层的协 ...

随机推荐

  1. 这款 AI 代码辅助插件真不错,还能帮你发现 bug!

    大家好,我是树哥. 随着 ChatGPT 风靡全球之后,编程界也迎来了许多代码辅助工具,有非常出名的 Github Copilot 工具.今天,树哥给大家介绍一款免费的代码辅助插件,它无需代理上网,直 ...

  2. 日志服务 HarmonyOS NEXT 日志采集最佳实践

    背景信息 随着数字化新时代的全面展开以及 5G 与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求.在这个背景下,华为公司自主研发的鸿蒙操作系统(HarmonyOS)应运而生,旨在满足 ...

  3. netcore5下js请求跨域

    后端代码如下: using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System ...

  4. Mybatis学习一(介绍/举例/优化)

    MyBatis介绍: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  5. virtualbox Ubuntn配置多站点

    1.编辑站点文件: nano /etc/nginx/sites-available/default cd /etc/nginx/sites-available/  ls2. 把default的设置文件 ...

  6. 纯JavaScript制作动态增加的网页数字

    看到别的网页上打开,会显示一个动态的数字,感觉这个效果增加了网页的灵动感.就尝试着写代码,最终实现的方法: 会从0增加到一个数值,实现的代码: <!-- html 部分 --> <d ...

  7. Wordpress给每一个分类栏目定制不同的广告位

    给分类栏目添加广告位,等同于添加自定义字段. 如果需要依据不同的栏目给广告位添加不同的tag来源,需要在模板页面中获取栏目的分类别名,读取不同的广告. 图1 如图1所示添加新的图片输入框 1. 实现的 ...

  8. three.js教程1补充-gui.js库使用

    gui.js是一个前端js库,对HTML.CSS和JavaScript进行了封装,学习开发的时候,借助dat.gui.js可以快速创建可手动控制三维场景的UI交互界面,打开API文档中案例体验一下就能 ...

  9. 4G EPS 第四代移动通信系统

    目录 文章目录 目录 4G EPS 4G EPS 4G(the 4th generation mobile communication technology,第四代移动通信技术)提供了 3G 不能满足 ...

  10. java学习之旅(day.05)

    switch多选择结构 多选择结构还有一个实现方式就是switch case switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支 switch(expression ...