TCP连接的各种状态

这里的3和4指的是请求的次数

以下内容转自http://blog.csdn.net/hguisu/article/details/38700899(这篇博客也解释了很多tcp攻击的原理)

不管三次握手,还是四次握手,这是保证信息来回两个链路可达(也就是信息能从A到B,也能从B到A)的最低要求。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。

为了保证服务端能接收到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手

为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

 

为什么TCP协议终止链接要四次?

因为TCP连接是双连接,因此每个方向都必须单独进行关闭,在关闭时,都要发一个Fin包给对方,对方也要发一个ACK包表示收到,所以就是(Fin+ACK)*2=4咯

第一次挥手:客户端发送FIN=M给服务器,表示客户端不会再发送数据了,并进入FIN_WAIT_1状态

第二次挥手:服务器接到FIN后,将ack置为M+1,回应客户端,并进入CLOSE_WAIT状态.客户端接到后进入FIN_WAIT_2状态

第三次挥手:服务器发送FIN=N给客户端,表示服务器也不再发送数据了,并进入LAST_ACK状态

第四次挥手:客户端接到FIN后,将ack置为N+1,回应服务器,并进入TIME_WAIT状态.服务器接受到后,进入CLOSED状态

链接关闭 断开链接时,收到对方发来的FIN报文,仅仅表示对方不再发送数据了,但还是可以接受数据的,如果服务器数据没有发送完,还是可以继续发送的,所以服务器先发送ACK回应客户端

当自己这边数据发送完了,或者不想发了,再发送FIN报文给客户端表示关闭链接,因此,关闭链接时ACK和FIN是分开发送的。

      建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的,如图:

 

 

 

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样):

一方面是可靠的实现TCP全双工连接的终止,也就是当最后的ACK丢失后,被动关闭端会重发FIN,因此主动关闭端需要维持状态信息,以允许它重新发送最终的ACK。

因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

TCP在2MSL(MSL为最大报文段生存时间) 等待期间,定义这个连接(4元组)不能再使用,任何迟到的报文都会丢弃。设想如果没有2MSL的限制,恰好新到的连接正好满足原先的4元组,这时候连接就可能接收到网络上的延迟报文就可能干扰最新建立的连接。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值