- 服务器初始化的一般过程:
- 调用
socket
函数获取创建的文件描述符 - 使用
bind
函数对IP和port进行绑定 - 调用
listen
函数监听socket
创建的文件描述符 - 调用
accept
函数对客户端进行连接
- 调用
客户端和服务器建立连接和断开连接的过程:
三次握手
过程:- 使用`socket`创建文件描述符 - 调用connect向服务器发起连接请求 - connect向服务器发送SYN段,并阻塞式等待服务器回应(第一次) - 服务器接收到客户段的SYN,会答应SYN+ACK段表示同意连接(第二次) - 客户端接收到服务器端发送的SYN+ACK段,同时回应一个ACK段(第三次)
四次挥手
过程:- 客户端如果请求关闭,调用`close`关闭文件描述符,同时客户端会向服务器发送FIN报文(第一次) - 服务器接收到客户端的FIN,会回应ACK报文,同时`read`返回0(第二次) - 服务器的`read`返回之后会调用`close`关闭文件描述符,同时向客户端发送FIN报文(第三次) - 客户端接收到服务器的FIN报文之后,回向服务器发送ACK报文(第四次)
- 为什么连接是三次握手而断开连接是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。