在网络套接字编程中,我知道listen()和accept()做什么。
但是,我想知道的是,在tcp,3-way,三方握手发生在哪里。
listen()执行3向握手,还是接受()?
我的意思是做syn(客户端)// syn / ack(服务器)// ack(clinet)数据包。
答案 0 :(得分:12)
应用程序调用{{1}}后,TCP堆栈将对任何传入连接执行3次握手。这些连接在内核中排队,listen()
然后从队列中检索下一个连接并返回它。
accept()
有一个backlog
参数,它指定了这个队列应该有多大(尽管我认为有些实现会忽略它,并使用堆栈中内置的限制)。当队列已满时,堆栈将不再执行传入连接的握手;客户端应该重试,当队列有空间时,它们的连接将会成功。
这样做是为了让客户端在正常情况下(当积压队列有空间时)尽快收到listen
,因此不必重新传输SYN/ACK
。
答案 1 :(得分:0)
listen()
,侦听到服务器的请求。
发出请求时(假设我们使用TCP,如果您使用UDP,则将不使用侦听或接受其非面向连接的协议(如TCP)),那么,如果服务器当前正在处理TCP,则它使TCP产生了三向握手。请求,然后将请求移到队列中。队列具有您可以指定的大小,未决请求的最大数量取决于操作系统,然后还有另一个接受函数的队列,每次侦听均取一个请求,调用并返回然后返回要在此连接中使用的新套接字以及对listen()
的请求的(地址,端口)。