关于网络套接字编程中的listen(),accept()(3路握手)

时间:2016-01-08 12:17:33

标签: c sockets networking

在网络套接字编程中,我知道listen()和accept()做什么。

但是,我想知道的是,在tcp,3-way,三方握手发生在哪里。

listen()执行3向握手,还是接受()?

我的意思是做syn(客户端)// syn / ack(服务器)// ack(clinet)数据包。

2 个答案:

答案 0 :(得分:12)

应用程序调用{​​{1}}后,TCP堆栈将对任何传入连接执行3次握手。这些连接在内核中排队,listen()然后从队列中检索下一个连接并返回它。

accept()有一个backlog参数,它指定了这个队列应该有多大(尽管我认为有些实现会忽略它,并使用堆栈中内置的限制)。当队列已满时,堆栈将不再执行传入连接的握手;客户端应该重试,当队列有空间时,它们的连接将会成功。

这样做是为了让客户端在正常情况下(当积压队列有空间时)尽快收到listen,因此不必重新传输SYN/ACK

答案 1 :(得分:0)

listen(),侦听到服务器的请求。

发出请求时(假设我们使用TCP,如果您使用UDP,则将不使用侦听或接受其非面向连接的协议(如TCP)),那么,如果服务器当前正在处理TCP,则它使TCP产生了三向握手。请求,然后将请求移到队列中。队列具有您可以指定的大小,未决请求的最大数量取决于操作系统,然后还有另一个接受函数的队列,每次侦听均取一个请求,调用并返回然后返回要在此连接中使用的新套接字以及对listen()的请求的(地址,端口)。