TCP三次握手和四次挥手

来源:互联网 发布:大数据数据库 编辑:程序博客网 时间:2024/06/03 22:46

TCP是面向来连接的协议,运输连接有三个阶段:建立连接(三次握手)、数据传送、释放连接(四次挥手);

一、TCP的连接建立

1.如图:

这里写图片描述

建立链接(三次握手)具体步骤:(假设A是客户,B是服务器)

  • A主动打开链接,B被动打开链接,此时两端的TCP处于CLOSED状态;
  • B的TCP服务进程先创建传输控制块TCB,准备接收客户的请求,B处于LISTEN状态;
  • A的客户进程首先创建传输控制块TCB,然后向B发送连接请求报文段,TCP首部SYN=1,初始序号seq=x,TCP规定SYN=1报文不携带数据,但消耗一个序号,A进入SYN-SENT状态;
  • B收到连接请求报文若同意链接,则向A发送确认报文,确认报文头部,SYN=1,ACK=1,seq=y(假设),ack=x+1,进入SYN-RECVD状态;
  • TCP客户A收到B的确认后,还要向B给出确认,确认报文段报头ACK=1,seq=x+1,ack = y+1;这时TCP连接已建立,A进入ESTAB-LISHED状态;

2.为什么需要三次握手,而不是两次(即为什么A最后还要发送一次确认)?

这是因为防止失效连接请求报文段突然传送到B,产生错误。

什么是“失效连接请求报文”?
A发出一个链接请求,但因为请求报文丢失没有收到确认,此时超时重传,A再次发送一次连接请求,当建立连接后,数据传送完毕,就释放连接,A共发送两次连接请求报文,第一次请求丢失,第二个到达,此时没有“失效连接请求”;假设A发送的第一个请求没有丢失,而是因为网络时延滞留了,以至于释放后连接请求后才到达B,此时这就是一个已失效的报文段。
B收到已失效的报文段,误认为是A再一次发送连接请求,于是向A发送确认连接请求,若不采用第三次握手,此时新的连接已经建立(连接是一方的事情),但A并没有发送连接请求,所以A不会理睬B发送来的报文,B认为连接已经建立,会一直等待A发送数据,导致资源浪费;
采用三次握手就不会造成上述情况发生,A不会向B发送确认,B收不到确认,就知道A没有要求建立连接;

二、TCP释放连接
1.如图:

这里写图片描述

释放连接(四次挥手)具体步骤:

  • A和B双方都可释放连接,上图是A先释放链接,A向B发送释放连接报文,停止发送数据,主动关闭TCP连接,报文段报头FIN=1,seq=u;此时A进入FIN-WAIT-1(结束等待1)状态,
  • B发送确认释放连接报文,进入CLOSED-WAIT(关闭等待)状态,此时从A到B这个方向的连接已经释放,TCP连接处于半关闭(关闭属于双方的事情)状态,即A没有数据要发送,但B要发送数据,A任需要接收(从B到A的连接还没有关闭);
  • A收到来自B的确认,进入FIN-WAIT-2状态,等待B发送连接释放报文,若B没有向A发送的数据,则应用进程通知TCP释放连接,B发出释放连接报文进入LAST-ACK状态,等待A的确认。
  • A在收到B得连接请求释放报文后,必须对次发出确认,然后A进入TIME-WAIT状态,现在TCP连接还没有释放掉,必须经过时间等待计数器设置时间2MSL后,A才进入到CLOSED状态,时间MSL叫做最长报文段寿命

2.为什么A在TIME-WAIT状态必须等待2MSL时间?

  • 保证A发送的最后一个ACK报问能够到达B。该报文可能丢失。若丢失,在CLOSE_WAIT状态的B会重传FIN+ACK报文,而A在2MSL的时间会收到B重传的报文,接着A重新发出确认,重新启动2MSL定时器,最后A和B都进入到CLOSED状态,如果A不设置计数器等待,则A在发送完ACK后立即释放连接,若ACK丢失,则A就发送收到重传,B无法进入CLOSED状态。
    第二、防止已失效的连接请求报文(在网络上因时延耽搁的链接请求)出现在本连接中。A在发送完确认报文ACK后,经过2MSL的时间,就可以使本链接持续的时间内产生的所报文段都从网络上消失,下一个新连接中不会出现旧的连接请求报文段。
原创粉丝点击