三次握手:
第一次握手: 客户端发送 syn 包 (syn=x) 到服务器, 并进入 SYN_SEND 状态, 等待服务器确认;
第二次握手: 服务器收到 syn 包, 必须确认客户的 SYN(ack=x+1), 同时自己也发送一个 SYN 包(syn=y), 即 SYN+ACK 包, 此时服务器进入 SYN_RECV 状态;
第三次握手: 客户端收到服务器的 SYN+ACK 包, 向服务器发送确认包 ACK(ack=y+1), 此包发送完毕, 客户端和服务器进入 ESTABLISHED 状态, 完成三次握手.
握手过程中传送的包里不包含数据, 三次握手完毕后, 客户端与服务器才正式开始传送数据. 理想状态下, TCP 连接一旦建立, 在通信双方中的任何一方主动关闭连接之前, TCP 连接都将被一直保持下去.
四次挥手
与建立连接的 "三次握手" 类似, 断开一个 TCP 连接则需要 "四次握手".
第一次挥手: 主动关闭方发送一个 FIN, 用来关闭主动方到被动关闭方的数据传送, 也就是主动关闭方告诉被动关闭方: 我已经不 会再给你发数据了(当然, 在 fin 包之前发送出去的数据, 如果没有收到对应的 ack 确认报文, 主动关闭方依然会重发这些数据), 但是, 此时主动关闭方还可 以接受数据.
第二次挥手: 被动关闭方收到 FIN 包后, 发送一个 ACK 给对方, 确认序号为收到序号 + 1(与 SYN 相同, 一个 FIN 占用一个序号).
第三次挥手: 被动关闭方发送一个 FIN, 用来关闭被动关闭方到主动关闭方的数据传送, 也就是告诉主动关闭方, 我的数据也发送完了, 不会再给你发数据了.
第四次挥手: 主动关闭方收到 FIN 后, 发送一个 ACK 给被动关闭方, 确认序号为收到序号 + 1, 至此, 完成四次挥手.
来源: http://www.bubuko.com/infodetail-2992077.html