tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:
-
客户端向服务器发送一个SYN J
-
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
-
客户端再想服务器发一个确认ACK K+1
只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
listen()维护两个队列,一个是未完成三次握手的,一个是已完成三次握手的,accept()是从已完成三次握手的队列中取出一个,并返回.
|
总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回
阅读(1081) | 评论(0) | 转发(0) |