TCP三次握手
假定A是客户程序,B是服务器程序。一开始两端都处于CLOSED(关闭状态的),此时如果A向B发送请求,A会主动打开连接,B是被动打开连接。
第一次握手:A向B发出连接请求报文段,此时报文段的首部中同部位SYN=1,初始序列号seq=x;此时TCP客户进程进入SYN-SEND(同步位已发送状态)
第二次握手:B向A发送确认,此时报文段中包含对A报文段中的消息确认并发送自己的数据,此时报文段中应把SYN=1,ACK=1,确认号ack=x+1,告诉A客户机下次发送消息从x+1开始,并选择自己的序列号seq=y;此时TCP服务器进程进入SNY-RCVD(同步收到)状态
第三次握手:A客户进程在收到B服务器进程的确认消息之后,还要向B服务器进程发出确认消息。此时报文段中的确认标志位ACK=1;确认号ack=y+1;自己的序列号seq=x+1;此时TCP连接已经建立,A进入ESTABLISHED(已建立)状态
当B收到A的确认后,也进入ESTABLISHED状态
TCP四次挥手
在数据传送完之后,通信的双方都可以释放连接。首先假设A的应用进程向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
第一次挥手:A把连接释放报文段首部的终止控制位FIN=1,其序号seq=u
第二次挥手:B收到连接释放报文后立即发出确认,确认号ack=u+1,确认标志ACK=1,选择自己的序列号seq=v,因为此时虽然A已经释放了连接,但是B仍然可以向A发送数据。
第三次挥手:此时B已经没有要向A发送的数据了,就可以向A发送释放连接的请求,此时报文段首部的终止控制位FIN=1,确认标志ACK=1,假设B的序号seq= w。并且B还必须重复上次一发送过的确认号ack=u+1
第四次挥手:A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK=1,自己的序号seq=u+1,确认号ack=w+1。
注意四次挥手后,TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,A才可以进入CLOSED状态
|