TCP的三次握手和四次挥手

三次握手:
 第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为 seq = X;

    第二次握手:服务器收到客户端发过来报文,由 SYN = X 知道客户端要求建立联机。向客户端发送一个包含SYN和ACK的TCP报文,
其中服务器向客户端发送连接请求包,标志位SYN(同步序号)置为 Y=1;
将确认序号(ACK)设置为客户的序列号加1,即 X+1 ,

    第三次握手:客户端收到服务器发来的包后检查确认序号(ACK)是否正确,即第一次发送的序号加1(X+1);
若正确,服务器再次发送确认序号(ACK) = Y+1;
服务器收到确认序号值 ACK=2 则连接建立成功,可以传送数据了。


四次挥手:
    第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN 置为 X 和ACK置为 Y;

    第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即 X+1 ;

    第三次挥手:服务器关闭与客户端的连接,发送一个FIN,标志位FIN和ACK置为1,序号为 Y;

    第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认,确认序号为收到的序号加1,即Y+1,服务器收到ACK为Y+1后关闭。

为什么是三次握手:


 三次握手可以简单看做是客户发送请求,服务器对客户的请求进行确认,客户对服务器的确认再进行确认。

    如果采用两次握手,假设下面这种情况,客户向服务器发送请求,服务器没有对客户的请求进行确认(因为网络的延迟他可能没有收到这个请求)。
客户收不到这个确认于是过一段时间他在向服务器发起连接请求并顺利完成数据传输,
但是过了一段时间这个请求到达了服务器而服务器误以为这是一个新的连接请求,于是对这个请求进行确认并发送确认给客户,
但是客户没有发起过连接请求因此它不会理会服务器的确认,服务器以为这个连接已经建立好了于是一直等待客户发送数据,这样就会造成服务器的资源浪费。
如果采用三次握手上述情况客户不会向服务器的确认进行确认,这样服务器收不到确认它就知道客户没有要发起请求的连接,于是不会再等待。


三次握手主要是为了防止已失效的连接请求报文突然到达服务器,造成服务器的等待和资源的浪费。


为什么是四次挥手:


     在三次握手的过程中,SYN和ACK是一起发送的,但是在四次挥手的时候FIN和ACK却不是一起发送的而是分开发送的,为什么呢?

那是因为TCP连接是全双工的,也就是说接收到FIN只是说没有数据再发过来,但是还是可以发送数据的,也就是接受到一个FIN只是关闭了一个方向的数据传输,
另一个方向还可以继续发送数据。在四次挥手的时候也是这样前两次挥手只是确认关闭了一个方向的数据,加上后面两次挥手才真正的关闭了整个全双工连接。
    当socket在ESTABISHED状态时,他想主动关闭连接于是向对方发送FIN请求,发送完FIN请求后它处于FIN_WAIT_1状态,当对方确认ACK报文后则处于FIN_WAIT_2状态。
FIN_WAIT_2表示半连接,也就是有一方要求关闭连接,另一方收到请求但是告诉她我还有一些数据要发送稍后会关闭。TIME_WAIT状态表示收到对方的FIN并发送出ACK。
如果三次挥手可能在关闭后还有一个方向没有关闭。


2MSL:
2MSL即两倍的MSL,TCP的客户端在第四次挥手后并没有直接close关闭,而是进入TIME_WAIT状态,也称为2MSL等待状态,

为什么要有2MSL等待状态?

当TCP的一端发起主动关闭,在发出最后一个ACK包后,

即第3次挥手完成后发送了第四次挥手的ACK包后就进入了TIME_WAIT状态,

必须在此状态上停留两倍的MSL时间,

等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,

那么对方在超时后将重发第三次挥手的FIN包,

主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

RFC 793 中 MSL规定为2分钟,两倍的MSL即为4分钟, 但是实际应用中一般为30秒,1分钟或2分钟不等。

TCP的十种状态:
1.服务器的LISTEN状态(服务器调用listen方法)
2.客户端的SYN_SENT状态(客户端调用connect方法,客户端发送完第一次握手后的状态)
3.服务器的SYN_RCVD状态(服务器调用accept方法,服务器发送完第二次握手后的状态)
4.三次握手完成,客户端和服务器都进入ESTABLISHED状态(客户端发送完第三次握手后的状态,以及服务器接收完第三次握手后状态)
5.客户端的FIN_WAIT_1状态(客户端发送完第一次挥手后的状态)
6.服务器的CLOSE_WAIT状态(服务器接收到第一次挥手,并发送完第二次挥手后的状态)
7.客户端的FIN_WAIT_2状态(客户端接收到第二次挥手后的状态)
8.服务器的LAST_ACK状态(服务器发送完第三次挥手后的状态)
9.客户端的TIME_WAIT状态(客户端收到第三次挥手并发送第四次挥手后的状态)
10.客户端和服务器的CLOSED状态(服务器收到第四次挥手后关闭状态,客户端2MSL过后关闭状态)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值