数据要完成传输,必须要建立连接。由于建立TCP连接的过程需要来回3次,所以,将这个过程形象的叫做三次握手。
结合上面的图来看更清楚。
先说三次握手吧,连接是后续数据传输的基础。就像我们打电话一样,必须保证我和对方都拿着电话在听,才能保证我们两个说的话对方能够接收到。
三次握手大概就是这个意思:
张三想跟李四聊聊天,于是张三拨通了李四的手机号,李四听到铃声响起,按了接听按钮。张三:Hi,李四,是你吗?唠两块钱的呀!
李四:Hi,张三,是我,可以唠。
张三:好,我确定是你了,接下来我要开始和你唠了。
看上去多少有点儿死板,但程序上确实就是这样的。
1、第一次握手
首先客户端发起连接请求,向服务器发送 TCP段,段中包含了目标端口和本机端口,设置 SYN 标志位为1,序号为 x,也就是初始序号 ISN,如果是第一个连接,很有可能就是 0。当然,此时服务器对应的端口要处于监听状态。此时,客户端进入 SYNC_SENT 状态,等待服务器的确认。
2、第二次握手
服务端收到客户端发来的 SYN 段,对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1),这就是确认序号。同时,服务端还要发送 SYN 请求信息,将SYN位置为1,Sequence Number为 y(服务端的TCP段序号)。服务器端将上述所有信息放到一个TCP段(即SYN+ACK段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。
3、第三次握手
客户端接收到服务端发来的 SYN+ACK 段后,发送一个 ACK 给服务端,将 Acknowledgment Number 设置为 y+1。此时客户端进入 ESTABLISHED(已连接)状态,服务端接收到此 TCP段,也将进入 ESTABLISHED 状态,也就标志着三次握手结束,连接成功建立。
三次握手完成之后,连接就建立了,之后就可以愉快的传输数据了。