2021-07-27 详解TCP连接建立和释放的过程(三报文握手和四次挥手)

TCP建立过程(三次握手)定义:三次握手,又称三报文握手,是指TCP连接建立的过程,由于在一次握手中发送了三次TCP报文段,因此叫做三报文握手。在socket编程中,这一过程由客户端执行connect来触发。连接过程:客户机A运行的是TCP客户程序,服务器B运行的是TCP服务器程序,A主动打开连接,而B被动打开连接;B的TCP服务程序创建传输控制块TCB,准备接受客户进程的连接请求,此时服务器进入Listen状态;A的TCP客户进程首先创建传输控制模块TCB,在打算建立TCP连接时,向B发出连接请求报文段,此报文的首部同步位SYN=1,同时选择一个随机的初始序号x令seq=x。(TCP规定,SYN=1的报文段不能携带数据,但要消耗一个序号),此时A进入了SYN-SENT(同步已发送)状态;B收到A的连接请求报文段后,通过SYN=1获悉A需要建立TCP连接,因此需要给A发送确认。此确认报文段将SYN和ACK都置为1,确认号ack为x+1,同时为自己选择一个随机的初始序号y,令seq=y,此SYN报文段不能携带数据且消耗一个序号,至此,B进入SYN-RCVD(同步收到)状态;A的TCP进程收到B的确认后,检查ack是否为x+1、ACK是否为1,通过验证则还需要再发送一次确认报文段,报文段的ACK置为1,确认号ack=y+1,序号加1成为seq=x+1,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号,至此A进入ESTABLISHED(已建立连接)状态;B收到A的确认报文段后,也进入ESTABLISHED(已建立连接)状态。报文段	SYN(同步位)?	ACK(确认位)、ack(确认号)?	seq(序号)	携带数据、消耗序号?A->B SYN	1		x	不能携带数据B->A SYN	1	1,x+1	y	不能携带数据A->B ACK		1,y+1	x+1	可以携带数据,但不携带就不消耗序号seq显然,B发送给A的报文段携带信息较多,实际上这个报文段可以分成两个部分发送,第一个部分是确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),这样TCP建立连接过程就成为了四报文握手。为什么需要在B发送给A确认报文段后,A再次发送确认报文段?这是为了防止B的连接资源被白白的浪费,具体的产生情形是这样的:A向B发送一个连接请求报文段,但是由于某种原因,此报文段在某个网络节点滞留;由于A长时间没有收到B的确认报文,因此A重传连接请求报文段,此时完成一个连接过程,在服务完成后,连接释放;假设此时之前A发送的第一个连接请求报文段被发送到了B,由于之前的连接已经结束了,此时B会认为这是A发送的一个新的连接请求报文段,于是向A发送确认报文段,连接建立,danshiA认为这是一个无效的确认,因此不予理会,这时B的连接资源会一直被占用;若采用三次握手,则不会产生上述的情况。TCP连接释放过程(四次挥手)连接释放过程在连接即将释放之前,A和B都处于ESTABLISHED状态,A的应用进程首先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接;连接释放报文段首部的终止控制位FIN置1,序号seq=u(u不是随机生成的,u为前面已经传送过的数据的最后一个字节的序号加1),A进入FIN-WAIT-1(终止等待1)状态,等待B的确认;(FIN报文段即使不携带数据,也需要消耗一个序号);B收到连接释放报文后发出确认报文段ACK=1,确认号ack=u+1,同时序号seq=v(v为B发送数据报文最后一个字节的序号加1),然后B进入CLOSE-WAIT(关闭等待)状态,这时TCP服务器进程通知高层的应用程序,A到B方向的连接就释放了;注意,这时说的是A->B方向的连接释放,而B->A方向的连接没释放,也就是说,B发送geiA数据A仍要接收,这个状态会持续一段时间。这时,我们说TCP连接进入了半关闭状态。(是TCP连接进入了半关闭状态,而不是A或B)A收到B的报文段,进入FIN-WAIT2(终止等待)状态。若B的高层应用程序没有数据需要发送给A了,应用程序通知TCP释放连接,这时B发出一个FIN报文段,同时需要重复发送上次已经发送过的ack=u+1,这时B进入了LAST-ACK(最后确认)状态;A收到B的报文段后,再发送一个确认报文段,进入TIME-WAIT(时间等待)状态;B收到A发送的确认报文段,就进入了CLOSED状态;A在经过了时间等待计时器设置的2MSL的时间后,就进入了CLOSED状态;MSL:Maximum Segment Lifetime,最长报文段寿命,1 MSL≈2min;为什么A需要等待2MSL才能关闭连接?一是为了防止B一直处于LAST-ACK状态,如果A发送完ACK报文段后就释放连接,那么如果B没有收到A发送的ACK段会超时重传FIN段,但是这时A无法收到了,B就僵死在了LAST-ACK,而等待2MSL后A没有收到B发送的重传FIN段,说明B已经CLOSED,这时A就可以CLOSED了;二是为了防止三次握手提到的“已经失效的连接请求报文段”出现,2MSL可以保证所有的段都消失在网络中。可以这样说,四次握手中:第一次握手是A告知B我要断开连接,这时A就直接断开了;第二次握手是B告知A收到了其连接释放报文段,但B没有打算断开连接,因此去报文段中不含有FIN;第三次握手是B的高层应用程序没有数据发送给A了,因此需要断开连接,其报文段含有FIN=1;第四次握手是A表明收到了B的连接断开报文段,至此,连接就可以释放了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值