TCP三次握手和四次挥手
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP三次握手和四次挥手相关的知识,希望对你有一定的参考价值。
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表示
以上是关于TCP三次握手和四次挥手的主要内容,如果未能解决你的问题,请参考以下文章