三次握手


刚开始客户端处于closed状态,服务端处于listen状态。然后
- 第一次握手:客户端发给服务端一个SYN报文,并指明客户端的初始化序列号ISN(c)。此时客户端处于SYN_Send状态。
- 第二次握手:服务器收到客户端的SYN报文后,以自己的SYN报文作为应答,指定了自己的初始化序列号ISN(s),同时把客户端的ISN+1作为ACK的值,表示已经收到了客户端的SYN报文,此时服务器处于SYN_RCVD状态。
- 第三次握手:客户端收到SYN报文后,发送一个ACK报文,把服务器的ISN+1作为ACK的值,表示已经收到了服务端的SYN报文,此时客户端处于established状态。
- 服务器收到ACK报文后,也处于established状态,此时,双方建立连接。
简化总结为:
- 客户端–发送带有SYN标志的数据包–一次握手–服务端
- 服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端
- 客户端–发送带有ACK标志的数据包–三次握手–服务端
为什么要三次握手
三次握手最主要的目的是确认双方的发送与接收是否正常。
第一次握手:Client什么都不能确认;Server确认了:对方发送正常,自己接收正常
第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:对方发送正常,自己接收正常
第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手能确认双方收发功能都正常,缺一不可
第二次握手为什么要把SYN再传回去
TCP是可靠连接,双方都要确保发送的信息是可靠的、准确无误的。
服务器传回客户端所发送的ACK是证明服务器收到的确实是客户端发送的信号,这表明从客户端到服务端的通信是正常的。