TCP的三次握手与四次挥手详解

##TCP连接状态

  • LISTEN:侦听来自客户端的TCP端口的连接请求
  • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  • SYN-RCVD:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
  • ESTABLISHED:代表一个打开的连接
  • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2:从远程TCP等待连接中断请求
  • CLOSE-WAIT:等待从本地用户发来的连接中断请求
  • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
  • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED:没有任何连接状态,连接结束

三次握手是客户端与服务器建立连接的过程,只有客户端可以主动发起
四次挥手是双方断开连接的过程,客户端或者服务器都可以主动发起
##三次握手

这里写图片描述

第一次握手:客户端主动请求建立连接,向服务器发送请求连接报文,进入SYN-SEND状态

第二次握手:服务器收到客户端的请求报文后后向客户端发送ACK报文,并开始分配资源,进入SYN-RCVD状态

第三次握手:客户端收到后回复ACK报文,此时客户端认为连接已建立,开始分配资源,进入ESTABLISHED状态,服务器收到ACK报文后也认为连接建立,进入ESTABLISHED这时就可以进行双工通信了

####为什么要进行三次握手,而不是一次,两次或四次?

  • 如果只有一次握手,客户端不能确定自己与服务器的但相连接是否成功,更不能确定服务器与自己的连接是否建立,因为客户端的请求报文可能丢失或者被接收,但是客户端不知道,服务器也不会作出回应
  • 如果只有两次握手,服务器不能确定是否连接成功,因为它的ACK报文可能丢失或者被接收到,但它自己不知情,客户端也不会对此作出回应
  • 如果是四次握手,在双方都确认建立连接的情况下,又进行了一次握手,浪费资源,因为是相当于又重复了一次第三次握手的过程

##四次挥手
这里写图片描述

假如是客户端主动断开连接
第一次挥手:客户端向服务器发送一个请求断开连接(FIN)报文,并进入FIN-WAIT-1状态,等待服务器的回复,意思是“我没有数据要发给你了”

第二次挥手:服务器收到客户端的FIN报文,并回复一个ACK报文,进入CLOSE-WAIT状态,但是服务器没有立即关闭连接,因为服务器此时可能还有数据未发送完,还可以进行单向的数据传送,直到数据发送完。意思是“我还有数据没发完呢,等我发完数据我再和你断开连接”,客户端在收到服务器的ACK报文后,进入FIN-WAIT-2状态,等待服务器断开连接。

第三次挥手:服务器数据已经全部发送完了,向客户端发送一个FIN报文,进入LAST-ACK状态,意思是“好了,我这边数据发送完了,可以准备断开连接了”

第四次挥手:客户端收到服务器的FIN报文后,回复一个ACK报文,并进入TIME-WAIT状态,服务器在收到ACK报文后,就把连接关闭了,如果没有收到客户端的ACK报文,服务器则会进行重传,这就是TIME-WAIT状态的意义所在,客户端在等待了2MSL后依然没有收到回复,则证明服务器正常关闭了,客户端也正常关闭连接

####为什么握手要三次,挥手要四次?
具体差别在第二次,握手阶段的第二次只是服务器要回应客户端的SYN报文,此时客户端正处于监听状态,所以可以直接发送SYN+ACK报文,其中ACK用来回复,SYN用来同步,但是挥手阶段的第二次服务器只能简单的回复ACK报文,因为很有可能服务器还有数据没有发送完,所以不可以进行同步发送FIN报文,只有等数据发送完了才可以。

####为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值