TCP的3次握手和4次挥手

三次握手

 第一次握手

客户端向服务端发送一个TCP报文,报文的头部信息:

SYN=1  SYN(sync)标志位表示同步,表示想向服务端建立连接

seq 序列号(Sequence number)的意思,是一个可以装载数值的地方,我们给它设置为随机数,是用来做凭证(token)的,稍后服务端会使用它

 

第二次握手

服务端向客户端发送一个TCP报文(服务端针对客户端的消息做回应),TCP报文头部:

ACK 标志位设置为 1,表示已知悉(acknowledge)客户端的连接请求;

ack   ack 的值设置为客户端传过来的 seq 值 + 1(即 x+1);

SYN  标志位设置为 1,表示服务端也要连接;

seq 设置一个随机数(假设随机数为 y);

注:

服务端通过 ACK 和 ack 来告知客户端已知悉连接请求,并发送自己的 SYN 和 seq 来请求和客户端的连接。

 

第三次握手

客户端收到服务端的消息后确认ACK是否为1,ack是否为x+1,如果是,说明服务端的这个发送是对应第一次握手的返回。

客户端向服务端发送TCP消息(客户端对服务端建立连接的回应)

ACK 设置为1

ack 设置为服务端 ack 的值 + 1(即 y + 1)

 

 

四次挥手

 第一次挥手

客户端向服务端发送断开连接TCP请求,TCP头部信息

FIN 设置为1

seq  设置为随机数x

FIN 是一个标志位,表示结束(finish)的意思,1 等同于 true;

seq 是个序列号,一个装数据的地方,我们这里给他设置为一个随机数,用于给服务端做确认,好对应上这个 TCP 请求;

 

第二次挥手

服务端向客户端发送TCP请求(服务端对客户端的请求做出回应)TCP头部信息

ACK 设置为 1(acknowledge,表示 “收到” 的意思)

ack 确认号设置为 x+1(x 来自第一次挥手)

此时,客户端到服务端的连接通道关闭,客户端不能正常向服务端发送请求,此时服务端到客户端还是可以发送数据的,如果服务端有一些之前的 TCP 请求没来得及响应,在第二次挥手和第三次挥手期间还是可以去返回的。

(服务端会在第三次挥手之前将之前客户端发出未响应的TCP请求处理完成)

 

第三次挥手

服务端向客户端发送 TCP 请求(请求断开服务端到客户端的通道)

FIN 设置为1

seq 设置一个随机数y

 

第四次挥手

客户端向服务端发送TCP请求

ACK 设置为 1

ack 确认号设置为 y+1

注:第四次挥手时,客户端会等待2MSL长的时间才释放,因为当服务端没后收到客户端第四次挥手信息时就会重新向客户端发起第三次挥手报文,报文一来一回的时间为2MSL

(MSL是Maximum Segment Lifetime的缩写,译为报文最大生存时间,也就是任何报文在网络上存活的最大时间,一旦超过该时间,报文就会被丢弃,2MSL为报文最长寿命的2倍)

 

posted @ 2023-10-10 16:41  流年sugar  阅读(4)  评论(0编辑  收藏  举报