TCP的接受发生在三次握手的哪个阶段

这些天在网上看到这样一个题目,据听说是腾讯的面试题:

TCP三次握手的过程中,接受发生在三次握手的哪一个阶段?

答案是:接受过程发生在三次握手之后,三次握手完成后,客户端和服务器就建立了TCP连接并可以进行数据交互了这时可以调用接受函数获得此连接。

也许这个图描述的更加清晰。

图片

有的网友评论说这个题目太简单了,也有人说腾讯不会出这么简单的问题,但是就tcp接受而言你又知道多少呢?

我们今天就学习下TCP接受

POSIX程序员的Manua对TCP接受的说明

接受函数的原型是:

int accept(int socket,struct sockaddr * restrict address,socklen_t * restrict address_len);

功能描述的:

accept()函数将提取挂起连接队列上的第一个连接,使用与指定套接字相同的套接字类型协议和地址族创建新套接字,并为该套接字分配新的文件描述符。

意思就是:接受函数会从已经建立连接的队列中取出第一个连接,并创建一个新的插座,新的插座的类型和地址参数要和原来的那个指定的套接字的地址一一样,并且还要为这个新的套接字分配文件描述符。

POSIX程序员手册还说了这么两句话

接受的套接字本身不能接受更多连接。原始套接字保持打开状态,可以接受更多连接。

新建的这个插座自身是无法再接收连接了,但是最开始的那个插座仍然是处于开放状态,而且可以接收更多连接。

如果侦听队列没有连接请求且未在套接字的文件描述符上设置O_NONBLOCK,则accept()将阻塞,直到存在连接。如果listen()队列没有连接请求并且在套接字的文件描述符上设置了O_NONBLOCK,则accept()将失败并将errno设置为[EAGAIN]或[EWOULDBLOCK]。

意思就是:在连接的监听队列为空并且O_NONBLOCK没有置位的情况下,Accpet头是阻塞的如果监听队列为空,但是O_NONBLOCK置位的情况下,Accpet头会立即返回。

TCP接受总结

TCP接受是三次握手以后,接受正确返回以后TCP服务器可以和客户端的连接已建立并可以通信了

注意区分listen socket和accept socket。

socket分为两种,一种套接字正如接受的参数sockfd,它是listen socket,在调用listen函数之后,一个socket会从主动连接的套接字变为听套套接字;而接受返回是一个连接套接字,它代表着一个网络已经存在的点对点连接。以后的数据交互就是基于这个连接套接字,而之前的那个监听套接字可以继续工作,从而接接更多的连接。

接受默认会阻塞进程,直到有一个客户连接建立后返回



作者:XDgbh
链接:https://www.jianshu.com/p/4af8f4197e8c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/odolgtt/article/details/92085674