tcp的三次握手,四次挥手

为了更好的记住知识点,所以将最近学习的知识点记录下来:

最开始A和B都处于closed(关闭连接状态)

1.tcp的第一次握手:客户端A  向服务器端B 发送请求连接报文段(包含SYN=1,初始序号seq=x),客户端A进入同步发送状态

2.tcp的第二次握手:服务器端B接收到客户端A的请求,如果同意连接,向客户端A发送确认报文段(SYN=1,ACK=1,ack=x+1,初始序号seq=y),服务器端B进入同步接收状态

3.tcp的第三次握手:客户端A接收到服务器端B的确认,向服务器B发送确认信息(ACK=1,确认号ack=y+1,序号seq=x+1),TCP连接已经建立,客户端A进入established(已连接状态),操作系统为该TCP连接分配TCP缓存和变量

服务器端B接收到A的确认信息,也进入到established(已连接状态)

最开始A和B都处于established(已连接状态)

1.tcp的第一次挥手:客户端A 向服务器B发送释放连接报文,客户端A进入fin_wait1(终止等待)状态,等待B的确认。(客户端告诉服务器,我已经没有数据发送了,请求断开TCP连接)

2.tcp的第二次挥手:服务器端B接收到A的请求,向A发送确认报文信息ACK,告诉A已经知道了,需要确认服务器还有没有数据需要发送给A,A收到确认后,进入fin_wait2状态,等待服务器发送释放连接报文

3.tcp的第三次挥手:服务器端B没有数据需要发送,向客户端A发送释放连接报文,服务器B进入last_ack(最后确认)状态,等待A的确认报文,收到A的确认报文,B关闭closed.

4.tcp的第四次挥手:客户端A接收到服务器B的释放连接报文,向B发送确认信息,并进入time_wait(时间等待)状态,等待2MSL(最长报文寿命段),A关闭closed.

MSL最长报文段寿命Maximum Segment Lifetime,MSL=2

答:  两个理由:1)保证A发送的最后一个ACK报文段能够到达B2)防止“已失效的连接请求报文段”出现在本连接中。

  • 1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
  • 2)A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

三次握手总结:

  • 第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
  • 第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
  • 第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。

四次挥手总结:

起初A和B处于ESTABLISHED状态——A发出连接释放报文段并处于FIN-WAIT-1状态——B发出确认报文段且进入CLOSE-WAIT状态——A收到确认后,进入FIN-WAIT-2状态,等待B的连接释放报文段——B没有要向A发出的数据,B发出连接释放报文段且进入LAST-ACK状态——A发出确认报文段且进入TIME-WAIT状态——B收到确认报文段后进入CLOSED状态——A经过等待计时器时间2MSL后,进入CLOSED状态

原文地址:https://www.cnblogs.com/hjl666/p/10522211.html