
##三次握手 服务器通过socket、bind和listen完成了被动套接字的准备工作,然后调用 accept,就会阻塞在那里,等待客户端的连接来临。 客户端通过调用 socket 和 connect之后,也会阻塞,接下来的事情是由操作系统 完成的,更具体点,是操作系统内核网络协议栈在工作。
##三次握手的具体过程
- 客户端的协议向服务器端发送了 SYN包,并告诉服务器端当前发送序列号 j,客户端进入 SYN_SENT 状态。
- 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示 对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号 为 k,服务器端进入 SYNC_RCVD 状态;
- 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回, 表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对 服务器端的 SYN 包进行应答,应答数据为 k+1;
- 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回, 这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。