三次握手四次挥手
第一次握手
A 创建本地的传输控制模块 TCB,然后创建一个 TCP 报文段,报文段中:
SYN = 1 同步控制位(=1 时候不能携带数据)
seq = x;序号,供 B 确认
由于此时 SYN 为 1,不能给携带数据,但是要消耗掉一个序号 seq,发送完以后客户端进入 SYN-SENT(同步已发送) 状态
第二次握手
B 在接收到 A 传来的建立连接请求以后,如果是同意建立连接,则会给 A 响应以确认自己同意建立连接,报文段如下:
SYN = 1 同步控制位(=1 时候不能携带数据)
ACK = 1 确认控制位
ack = x + 1 在 A 传来的序号 x 基础上+1,以确认
seq = y 创建自己的 序号 y,供 A 去确认
这一步主要是添加了 ACK =1 ,表示确认有效,然后再把 A 传来的 x 值加一,以供 A 去确认,再创建一个自己的序号 y。
最终把 TCP 报文传递给 A,B 进入 SYN-RCVD(同步收到) 状态。
第三次握手
A 在接收到 B 传来的 TCP 报文以后,还需要再次向 B 确认,
ACK = 1
ack = y + 1
seq = x + 1
此时把 ACK = 1表示确认,然后把 B 传来的 seq +1 作为确认序号 ack ,消耗自己的序号数 seq = x+1,
这个时候没有 SYN 控制位,此 TCP 是可以携带数据,但是会消耗自己的序号,如果不携带数据的话,不会消耗自己的序号,
等到下次数据传输的时候seq 还是 x+1,这个时候 TCP 连接已经建立,A进入ESTAB-LISHED(已建立连接)状态。
当 B 收到 A 传来的 TCP 报文的时候,也进入ESTAB-LISHED(已建立连接)状态。
第一次挥手
当客户端 A 没有数据要和服务器 B 交互的时候,就会发送一个 TCP 报文,
FIN = 1 标志着要断开此 TCP 连接
seq = u ;u 等于前面已经传送过数据的最后一个字节的序号 +1
A 发送了这个 TCP 报文以后就进入了 FIN-WAIT1(终止等待 1)状态,等待 B 的确认,这里要注意的是:即使 FIN 报文段不携带数据,也会将序号消耗掉一个。
第二次挥手
B 接收到 A 发来的请求终止 TCP 连接的报文以后,要回复给 A 一个确认报文,
ACK = 1 ;ACK =1 表示确认
ack = u+1 ;把 A 传来的 u 加 1 以后,通过确认序号返回给 A
seq = v ;自身前面已经传送过的数据的最后一个字节的需要+1 以后作为本次序号传递给 A
B 发送完了本次确认报文以后就进入了 CLOSE-WAIT(关闭等待)状态,这时的 TCP 连接处于半关闭状态,
即:A 没有数据要发送给 B,但是 B 还是有可能发送数据给 A 的,这个时候 A 仍然会对 B 发送的数据进行接收。
A 收到 B 传来的确认报文以后,就进入了 FIN-WAIT-2(终止等待 2) 状态,等待 B 发送最后的连接关闭报文
第三次挥手
这个时候发生在 B 也没有数据要发送给 A 了,这时 B 要发送报文告诉 A,B 自身也要关闭连接。
FIN = 1; 关闭连接控制位
ACK = 1; 确认控制位
seq = w; 如果在第二次握手以后 B 没有发送数据,那么 w = v,如果发生了数据发送,就 w > v
ack = u+1;重复发送上次发送的 u+1确认序号。
此时 B 发送了以后自身进入了LAST-ACK(最后确认)状态,等待 A 的确认
第四次挥手
A 在收到 B 的请求关闭连接的报文以后,在确认报文段中将 ACk 置为 1,表示确认,并给 B 回复:
ACK = 1;确认控制位
ack = w+1;确认序号为 B 发来的 w+1
seq = u+1;自身的序号+1
A 在发送了最后的报文以后,自身就进入了TIME-WAIT(时间等待)状态,此时的 TCP 连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间 2MSL 以后 A 才会进入到 CLOSED 状态。
只要 B 接收到 A 发来的确认报文,就进入了 CLOSED 状态,但是由于 A 要再发送报文以后等待一段时间才会关闭,所以B 的关闭会比 A 早一点。
第一次握手
A 创建本地的传输控制模块 TCB,然后创建一个 TCP 报文段,报文段中:
SYN = 1 同步控制位(=1 时候不能携带数据)
seq = x;序号,供 B 确认
由于此时 SYN 为 1,不能给携带数据,但是要消耗掉一个序号 seq,发送完以后客户端进入 SYN-SENT(同步已发送) 状态
第二次握手
B 在接收到 A 传来的建立连接请求以后,如果是同意建立连接,则会给 A 响应以确认自己同意建立连接,报文段如下:
SYN = 1 同步控制位(=1 时候不能携带数据)
ACK = 1 确认控制位
ack = x + 1 在 A 传来的序号 x 基础上+1,以确认
seq = y 创建自己的 序号 y,供 A 去确认
这一步主要是添加了 ACK =1 ,表示确认有效,然后再把 A 传来的 x 值加一,以供 A 去确认,再创建一个自己的序号 y。
最终把 TCP 报文传递给 A,B 进入 SYN-RCVD(同步收到) 状态。
第三次握手
A 在接收到 B 传来的 TCP 报文以后,还需要再次向 B 确认,
ACK = 1
ack = y + 1
seq = x + 1
此时把 ACK = 1表示确认,然后把 B 传来的 seq +1 作为确认序号 ack ,消耗自己的序号数 seq = x+1,
这个时候没有 SYN 控制位,此 TCP 是可以携带数据,但是会消耗自己的序号,如果不携带数据的话,不会消耗自己的序号,
等到下次数据传输的时候seq 还是 x+1,这个时候 TCP 连接已经建立,A进入ESTAB-LISHED(已建立连接)状态。
当 B 收到 A 传来的 TCP 报文的时候,也进入ESTAB-LISHED(已建立连接)状态。
第一次挥手
当客户端 A 没有数据要和服务器 B 交互的时候,就会发送一个 TCP 报文,
FIN = 1 标志着要断开此 TCP 连接
seq = u ;u 等于前面已经传送过数据的最后一个字节的序号 +1
A 发送了这个 TCP 报文以后就进入了 FIN-WAIT1(终止等待 1)状态,等待 B 的确认,这里要注意的是:即使 FIN 报文段不携带数据,也会将序号消耗掉一个。
第二次挥手
B 接收到 A 发来的请求终止 TCP 连接的报文以后,要回复给 A 一个确认报文,
ACK = 1 ;ACK =1 表示确认
ack = u+1 ;把 A 传来的 u 加 1 以后,通过确认序号返回给 A
seq = v ;自身前面已经传送过的数据的最后一个字节的需要+1 以后作为本次序号传递给 A
B 发送完了本次确认报文以后就进入了 CLOSE-WAIT(关闭等待)状态,这时的 TCP 连接处于半关闭状态,
即:A 没有数据要发送给 B,但是 B 还是有可能发送数据给 A 的,这个时候 A 仍然会对 B 发送的数据进行接收。
A 收到 B 传来的确认报文以后,就进入了 FIN-WAIT-2(终止等待 2) 状态,等待 B 发送最后的连接关闭报文
第三次挥手
这个时候发生在 B 也没有数据要发送给 A 了,这时 B 要发送报文告诉 A,B 自身也要关闭连接。
FIN = 1; 关闭连接控制位
ACK = 1; 确认控制位
seq = w; 如果在第二次握手以后 B 没有发送数据,那么 w = v,如果发生了数据发送,就 w > v
ack = u+1;重复发送上次发送的 u+1确认序号。
此时 B 发送了以后自身进入了LAST-ACK(最后确认)状态,等待 A 的确认
第四次挥手
A 在收到 B 的请求关闭连接的报文以后,在确认报文段中将 ACk 置为 1,表示确认,并给 B 回复:
ACK = 1;确认控制位
ack = w+1;确认序号为 B 发来的 w+1
seq = u+1;自身的序号+1
A 在发送了最后的报文以后,自身就进入了TIME-WAIT(时间等待)状态,此时的 TCP 连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间 2MSL 以后 A 才会进入到 CLOSED 状态。
只要 B 接收到 A 发来的确认报文,就进入了 CLOSED 状态,但是由于 A 要再发送报文以后等待一段时间才会关闭,所以B 的关闭会比 A 早一点。