ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TCP三次握手和四次挥手

2021-05-16 20:02:58  阅读:177  来源: 互联网

标签:seq ACK 握手 TCP ack 四次 服务端 客户端


转详细说明载猿人谷

TCP三次握手和四次挥手

TCP三次握手和四次挥手

TCP是面向连接的,所以每一个TCP连接都会有三个阶段状态:

  • 建立连接: 三次握手

  • 数据传输

  • 连接拆除: 四次挥手

TCP建立连接的"三次握手"

在这里插入图片描述

三次握手过程:

第一次:当客户端向服务器发起连接请求时,客户端会发送标志位为SYN=1序列号seq=x的数据包到服务器,等待服务器确认,这时客户端的状态为SYN_SENT

  • SYN=1 表示客户端发起一个新连接,用来同步
  • seq=x 用来标识从TCP源端向目端发起的字节流,发起方发送数据数对此进行标记

第二次:当服务器收到客户端发送的SYN后,服务器要做的是确认客户端发送过来的SYN即接受连接请求。所以服务器端会向客户端发送SYN=1、ACK=1、seq=y、ack=x+1的数据包。这时服务器的状态为SYN_RECV。在此时,服务器为该TCP连接分配TCP缓存和变量。服务器资源在此时分配(而客户端在第三次完成时才分配资源)。记录了客户端的请求信息,如果没有收到来自客户端的第三次回话,就会在一段时间内缓存TCP信息,这也是黑客攻击服务器的SYN洪泛攻击

  • SYN=1 表示服务端发起一个同步请求
  • ACK=1 表示确认号ack=x+1有效,ACK标志位表示应答
  • seq=y 用来标识从TCP源端向目端发起的字节流,发起方发送数据数对此进行标记
  • ack=x+1 表示确认客户端发送过来的seq=x信息已接收,用ack=对方序号+1来表示

第三次:客户端收到服务器发送的SYN和ACK包后,需向服务器发送确认包ACK(ACK=1、seq=x+1、ack=y+1),这里的ACK为1,发送完毕后,客户端和服务器的状态为ESTABLISH,即TCP连接成功。

  • ACK=1 表示确认ack=y+1的信息有效
  • seq=x+1 第二个报文段seq的值为上个报文段序列号seq+1
  • ack=y+1 表示确认客户端发送过来的seq=y信息已接收,用ack=对方序号+1来表示

TCP建立连接的"四次挥手"

在这里插入图片描述

四次挥手过程:

第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

  • FIN 表示发起方请求释放连接
  • seq=u 用来标识从TCP源端向目端发起的字节流,发起方发送数据数对此进行标记

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为确认好ack的值,表明已经收到客户端的报文了,并用seq=v标识自己数据信息,此时服务端处于 CLOSE_WAIT 状态。此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。(可以看做等待服务端将客户端的请求数据发送完毕)

  • ACK 表示确认号ack=u+1有效
  • seq=v 用来标识从TCP源端向目端发起的字节流,发起方发送数据数对此进行标记
  • ack=u+1 表示确认客户端发送过来的seq=u信息已接收,用ack=对方序号+1来表示

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

  • FIN 表示要发送的数据已经发送完毕,现在可以释放连接了
  • ACK=1 表示确认号ack=u+1有效
  • seq=w 用来标识从TCP源端向目端发起的字节流,发起方发送数据数对此进行标记
  • ack=u+1 表示确认客户端发送过来的seq=u信息已接收,用ack=对方序号+1来表示

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。

  • ACK 表示确认号ack=w+1有效
  • seq=u+1 上一个报文序列号加一表示数据信息
  • ack=w+1 用来确认接受到服务端发送过来的FIN释放连接数据包。用对方的序列号+1表示

标签:seq,ACK,握手,TCP,ack,四次,服务端,客户端
来源: https://blog.csdn.net/qq_46093534/article/details/116867211

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有