TCP握手协议过程及相关细节参数

本文详细介绍了TCP的三次握手和四次挥手过程,以及在进行压力测试时遇到的端口被占用问题。文章讨论了TCP连接的各个状态,并指出大量连接处于TIME_WAIT状态可能导致端口无法释放。同时,文章提到了相关系统参数如time_wait、backlog和somaxconn的调整,以适应不同场景的需求,并警告在NAT网络下重复使用端口可能导致链接失败。
摘要由CSDN通过智能技术生成

时间记录:2019-6-2
问题描述:笔者在进行压力测试的时候遇到了奇怪的问题,压力机的环境是win7的环境,在进行压力测试的时候发现了系统的端口一直被占用,无法释放开来,进行了接口的查找发现了大量的端口处于time_wait的状态,处于未被释放的状态,在这里进行总结下,以后续出现相关问题的查找。
从如下的几个问题下进行总结:
握手协议的状态,握手协议的链接过程,相关系统参数的调整以适应要求。
1:握手协议
握手协议包括三次握手和四次握手,三次握手协议是进行连接,四次握手是进行终止的,这里描述的是TCP的连接和断开的握手。

三次握手协议(连接)
指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。

注意: 这里如果只发送SYN报文后结束其余的握手不执行那么会造成队列的拥挤形成了

四次握手(终止):
由于TCP的半关闭(half-close)造成的,既然一个TCP连接是全双工的(即数据在两个方向上能同同时传递),因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

2:握手协议的链接过程
三次握手过程
1)请求端(通常被称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(INS
2)服务器发回包含服务器的出事序号的SYN报文段作为应答。同时,将确认序列号设置为客户的ISN1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
3)客户必须将确认序号设置为服务器的ISN1以对服务器的SYN报文段进行确认。

注意:这里有个小细节问题,在服务端接收到了客户端发送的SYN报文的时候,那么需要去处理这个问题,那么这时候服务器接收到了大量的连接请求的时候需要将需要处理的请求放置到一个队列中,如果队列超出了限制那么将请求失败,同样的请求连接结束的时候需要将这个连接放置到一个队列中。这里有一个半连接全连接的说法。这里就要提及到backlog somaxconn 问题了,在linux内核参数中进行调整(一般情况下linux的初始参数设置是不满足要求的,需要自己进行调整),在后续介绍具体的调整。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值