第一次握手:Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号,这时候Client进入syn_sent状态,表示客户端等待服务器的回复(此时客户端等待服务器的确认)
第二次握手:Server接收到连接请求后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到,seq = y 表示Server 自己的初始序号。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认(此时服务器已经收到客户端的连接请求,等待客户端的确认)。
第三次握手:Client收到确认报文后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效,Client自己的序号seq= x + 1,Server一旦收到Client的确认之后,TCP连接的三次握手就完成了,就可以发起http请求了。
-
SYN = 1 表明这是一条连接请求
-
ACK = 1 表明这是一个确认报文,确认号ack有效
-
ack = x + 1这是确认号,表明期望收到对方下一个报文段的第一个字节序号是x+1,也表示x为止的所有数据都已经收到
-
seq = y 指的是本报文段数据的第一个字节的序号
为什么需要3次握手
2个计算机通信是靠协议(目前流行的TCP/IP协议)来实现,如果2个计算机使用的协议不一样,那是不能进行通信的,所以这个3次握手就相当于试探一下对方是否遵循TCP/IP协议(通俗来讲就是看一下双方的语言是否互通),协商完成后就可以进行通信了