TCP三次握手、四次挥手
1 三次握手
建立TCP连接时,需要客户端和服务端共发送3个包。步骤为:
- 客户端向服务器发送SYN=1的连接请求标志和初始序号seq=x;
- 服务器向客户端发送确认标志ACK=1、请求标志SYN=1,客户端的确认序号ack=x+1以及自己的序号seq=y;
- 客户端发送ACK确认标志,服务器的确认序号ack=y+1,自己的序号seq=x+1;
第一步:客户端调用connect发送连接请求到服务器,服务器知道:客户端的发送正常,服务器的接收正常;
第二步:服务器向客户端发送表示已经接收, 客户端知道:客户端的发送、接收正常,服务器的发送、接收正常;
第三步:客户端发送给服务器 服务器知道:客户端的发送、接收正常,服务器的发送、接收正常
TCP是全双工传输,在发送的同时也可以接收,通过三次握手,客户端和服务器都知道双方的发送和接收能力正常。
2 四次挥手
- 客户端发送用于释放连接的结束标志FIN=1,自己的序列号seq=u,告诉服务器再不会通过send发送数据;
- 服务器收到客户端的请求后,发出确认标志ACK=1、客户端确认号ack=u+1、自己的序列号seq=v给客户端,表示自己已收到,关闭接收功能;
- 服务器的recv解堵塞,调用close来关闭自己的发送功能,发送结束标志FIN=1、确认标志ACK=1、确认序列号seq=u+1和自己的序列号seq=w给客户端;
- 客户端收到后,发送确认ACK=1、ack=w+1、自己的seq=u+1给服务器,进入时间等待,经过两倍的数据包最长寿命后,客户端关闭,服务器收到确认后,进入关闭状态。
第一次挥手,客户端告诉服务器他不会再向服务器发送数据;第二次挥手,服务器告诉客户端自己知道了并关闭自己的接收功能;到此,客户端关闭了发送功能,服务器关闭了接收功能,服务器不会再傻傻等待来自客户端的消息(数据),从而解堵塞去关闭自己的发送功能,第三次挥手就是服务器告诉客户端自己要关闭发送功能了;客户端接收到后,在第四次挥手中,向服务器表示自己已经收到,并且进入等待状态,等待时间为2*MSL,这是因为万一由于网络等传输问题,服务器在超时后没有收到,会向客户端请求再发,这样客户端资源还在,有时间做出回应。