TCP的握手

TCP的握手主要有两个:建立连接时的三次握手、释放连接时的四次握手

首先理解下TCP协议中用到的几个关键字:

tcp关键字

最常用的是SYN(发起连接时的同步序列号)、ACK(确认包的接收)、FIN(结束连接)、RST(重置连接、通知双方马上关闭连接)

一、建立TCP连接的三次握手:

示意图:

tcp连接的建立

  1. 首先由某一方主机主动发起连接(C/S架构中通常时Client发起),发送SYN命令同时附带值为x的序列号;
  2. 另一端收到这个连接请求之后,会回复一个SYN命令同时附带值为x+1的ACK(表明x+1之前不包括x+1的所有值都收到了,下一次再发应从x+1开始发),同时附带自己的一个值为y的序列号;
  3. 然后这边再收到之后,回复一个ACK=y+1的表明收到了对方的SEQ=y,同时附到自己的序列号SEQ=x+1。当这个包发出去之后,其会同步开启本方的连接
  4. 另一端收到这个包之后,不再回复确认包,直接开启本方的连接,由此,双方都各自开启了连接,一个TCP连接由此形成。下面就可以全双工地发数据了。

二、释放TCP连接的四次握手:

示意图:

tcp连接的释放

  1. 首先,由host1主动发起结束连接的请求,发送FIN包以及SEQ=x的序列号,注意,这之后host1不会再发送data,单仍会接收data
  2. host2接收到来自host1的请求之后,回复一个ACK包,但并不会发送SEQ,要等到下一次发包,这是因为host2本机可能仍有数据没发完给host1,所以需要一些时间来进行这些殿后的处理
  3. host2把殿后的工作处理完了,发送一个FIN包附带SEQ=y,告诉host1我已经准备好了可以释放连接了,这之后host2页不再发送数据
  4. host1接收到来自host2的FIN包之后,回复一个Ack=y+1的ACK包,然后再等待一个timeout wait时间之后才正式关闭连接(这个timeout是用来防止来自host2的包在网络中延迟稍晚才来到)
  5. host2接收到这个ACK包之后也正式关闭TCP连接,至此,TCP连接完全关闭(释放)
### TCP三次握手过程详解 TCP三次握手是建立可靠连接的关键步骤,以下是其具体过程: #### 第一次握手 客户端发起连接请求,将标志位`SYN`置为1,随机生成一个初始序列号`seq=J`,然后将此数据发送至服务器。此时,客户端进入`SYN_SENT`状态,等待服务器的确认[^1]。 ```python # 客户端第一次握手示例 packet = { 'SYN': 1, 'SEQ': J, # 随机生成的初始序列号 } send(packet) ``` #### 第二次握手 服务器接收到客户端的数据包后,通过判断标志位`SYN=1`得知这是连接请求。服务器随即也将自己的`SYN`和`ACK`标志位置为1,同时生成自身的初始序列号`seq=K`,将确认号设为`ack=J+1`(表示已接收认可客户端的序列号)。随后,服务器将该数据包返回给客户端,进入`SYN_RCVD`状态[^1]。 ```python # 服务器第二次握手示例 response_packet = { 'SYN': 1, 'ACK': 1, 'SEQ': K, # 服务器的初始序列号 'ACK_NUM': J + 1, # 对客户端序列号的认可 } send(response_packet) ``` #### 第三次握手 客户端接收到服务器的响应后,验证`ack`是否等于`J+1`以及`ACK`是否为1。如果验证无误,则客户端将自己的`ACK`标志位置为1,将确认号设为`ack=K+1`,以此告知服务器其序列号已被接受。最后,客户端将此数据发送回服务器,双方均进入`ESTABLISHED`状态,完成三次握手[^1]。 ```python # 客户端第三次握手示例 final_ack_packet = { 'ACK': 1, 'SEQ': J + 1, 'ACK_NUM': K + 1, # 对服务器序列号的认可 } send(final_ack_packet) ``` --- ### 解决与TCP握手相关的问题 在实际应用中,可能会遇到一些与TCP三次握手有关的问题,例如SYN洪泛攻击。这种攻击利用了服务器在收到SYN包后需创建半连接的特点,通过伪造大量不存在的IP地址发送SYN请求,使服务器资源耗尽。为了缓解此类问题,可以通过以下方法优化系统配置: - **缩短超时时间**:减少服务器维持半连接的时间,以便更快释放资源。 - **启用SYN Cookie技术**:无需为每个SYN请求分配内存空间,而是通过计算得出一个加密值作为确认依据[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值