2020.12.12 三次握手和四次挥手

本文借鉴自https://yuanrengu.com/2020/77eef79f.html,特此感谢

.

1.三次握手

三次握手其实就是指建立一个TCP连接时,需要服务器和客户端总共发出3个包。发送三次握手的主要作用就是为了验证双方的收发能力是否正常,指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

刚开始客户端处于Closed状态,服务器处于Listen状态。假如客户端先发起连接请求,三次握手的过程如下:

在这里插入图片描述

(1)第一次握手

客户端给服务器发一个连接请求报文,并指明客户端的初始化序列号。此时客户端处于SYN_SENT状态
TCP标志位里SYN=1,ACK=0,选择一个初始序号seq=x

(2)第二次握手

服务器收到客户端的请求报文之后,会向客户端发送连接确认报文,并且也指明了自己的初始化序列号,此时服务器处于SYN_RCVD的状态
在确认报文段中SYN=1,ACK=1,确认号ack=x+1,选择一个初始序号seq=y。

(3)第三次握手

客户端收到连接确认报文之后,还要向客户端发出确认,此时客户端处于ESTABLISHED状态,ACK=1,确认号ack=y+1,序列号seq=x+1
服务器收到客户端的确认之后,也处于ESTABLISHED状态,此时双方已建立起了连接

问:为什么不能是两次握手?
答: 第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接
第一次握手能确认客户端发送能力正常,服务器接收能力正常
第二次握手能确认客户端的收发能力正常,服务器收发能力正常,但是服务器并不知道客户端接收能力是否正常
比如一种情况:客户端发出第一个连接请求报文段并没有丢失,而是在网路结点长时间滞留了,以致于延误到连接释放以后的某个时间段才到达服务器,这个时候报文段早已失效,但是服务器收到失效连接请求报文后,误以为是客户端又发出的一次新的连接请求。于是就向客户端发出确认报文,如果不进行第三次握手,建立了一个失效连接,服务器的资源就浪费了;如果进行第三次握手,服务器得不到客户端发来的确认消息视为连接失败。

2.四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次挥手。这由TCP的半关闭造成。半关闭是TCP提供了连接的一段在结束它的发送后还能接收来自另一端数据的能力。

刚开始双方都处于ESTABLISHED状态,假如是客户端先发起关闭请求。四次挥手的过程如下:

在这里插入图片描述

(1)第一次挥手

客户端给服务器发连接释放报文,指定一个序列号,并停止再发送数据,主动关闭TCP连接。此时客户端处于FIN_WAIT1状态,等待服务器确认
连接释放报文中,FIN=1,序号seq=u(等于前面已传送过的数据的最后一个字节的序号+1)

(2)第二次挥手

服务端收到连接释放报文后,发送确认报文,指定一个序列号,此时服务器处于CLOSE_WAIT状态,TCP处于半关闭状态,客户端到服务端的连接释放,客户端收到服务端的确认后,进入FIN_WAIT2状态,等待服务器发出的连接释放报文
确认报文中,ACK=1,序列号seq=v,确认号ack=u+1

(3)第三次挥手

服务器将最后的数据发送完后,向客户端发送连接释放报文,指定一个序列号,此时服务器处于LAST_ACK状态,等待客户端的确认
连接释放报文中,FIN=1,ACK=1,序号seq=w,确认号ack=u+1

(4)第四次挥手

客户端收到连接释放报文后,向服务器发送一个确认报文,此时客户端处于TIME_WAIT状态,需要确保服务器收到确认报文(时间等待计时器设置的时间2MSL(MSL:最长报文段寿命))后才进入CLOSED状态,服务器收到确认报文后处于CLOSED状态,连接关闭
确认报文中,ACK=1,序号seq=u+1(发送连接释放报文时消耗一个序号),确认号ack=w+1

为什么TIME_WAIT状态必须等待2MSL的时间呢?
答:(1)保证客户端发送的最后一个确定报文能够到达服务器
这个确定报文有可能丢失,使得处于LAST_ACK状态的服务器收不到客户端对已发送的连接释放报文的确认,
服务器超时重传连接释放报文,而客户端能在2MSL(超时 + 1MSL 传输)时间内收到这个重传的连接释放报文,
接着客户端重传以确认,重新启动2MSL计时器,最后客户端和服务器都进入CLOSED状态,
若客户端在TIME_WAIT状态不等待一段时间,而是发送完确认报文后立即释放连接,则无法收到服务器重传的连接释放报文,所以不会再发送确认报文,服务器无法正常进入到CLOSED状态
(2)防止已失效的连接请求报文出现在本连接中
客户端在发送完最后一个确认报文后,再经过2MSL就可以使本连接持续的时间内产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值