三次握手:(只能由客户端发起)
第一次:客户端向服务器发送syn包 请求建立链接 序号 seq = x
第二次:服务器接到客户端的请求,向客户端发送syn_ack包 告知客户端 允许建立链接 返回序号 ack = seq + 1 = x+1
第三次:客户端收到服务器端返回的syn_ack包 向服务器发送一个序列号 确认收到服务器的通知 序号:seq = x+1 返回ack = sql + 1
客户端开始向服务器发送数据
为什么需要三次握手:
是为了防止在第二次握手时 服务器向客户端发送syn_ack包的时候 数据发生丢失的现象 如果我们只握手两次的话 服务器无法得知客户端是否已经接收到允许建立链接的通知 在第二次握手后 如果发生数据丢失 客户端将无法收到服务器端的回信 在等待一定时间后,客户端会默认第一次链接失败 会再次发起链接。如果没有第三次握手的话 服务器也是无法确认客户端是否已经正常链接到服务器 所以第一次的链接请求依旧会被服务器保留 这样就可能造成服务器连接资源浪费 因此需要三次握手
四次挥手:
客户端数据传输/接收结束(挥手的动作 客户端和服务器端都可以发起,此仅以客户端为例)
第一次:客户端向服务器返送fin 告诉服务器这边已经发送或接受完数据 需要断开链接
第二次:服务器收到客户端发送的断开链接请求 向客户端返回一个syn+ack包 告诉客户端服务器同意断开链接
第三次:服务器向客户端发送fin 告诉客户端 服务器即将断开和客户端的链接
第四次:客户端在收到服务器的fin信息后 会向服务器发送一个ack包 告知服务器客户端同意断开链接
发送完成后 等待大约2MSL的时间 以便客户端或服务器可以正常接收最后一次的ack包的发送
断开链接的动作 由谁发起的 谁先断开
1MSL:指的是ack包的最大存活时间
为什么需要四次挥手:
断开链接的动作 是需要链接双方同意的,故在客户端发送一个FIN 告知服务器端客户端将要断开双方链接的时候,服务器会返回给客户端一个ack包 作为确认信息,同样在服务器端断开连接时 也需要重复上述动作