本文介绍: A 在发送最后报文以后,自身就进入了TIME-WAIT(时间等待状态,此时的 TCP 连接没有释放掉,必须经过时间等待计时器(TIME-WAIT timer设置时间 2MSL 以后 A 才会进入到 CLOSED 状态。A 在发送了最后报文以后,自身就进入了TIME-WAIT(时间等待)状态,此时的 TCP 连接没有释放掉,必须经过时间等待计时器(TIME-WAIT timer设置的时间 2MSL 以后 A 才会进入到 CLOSED 状态。

一次握手
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 早一点。

原文地址:https://blog.csdn.net/weixin_41940961/article/details/134784508

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38948.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注