【问题标题】:About listen(), accept() in network socket programming(3-way handshaking)关于网络套接字编程中的listen()、accept()(3路握手)
【发布时间】:2016-01-08 12:17:32
【问题描述】:

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

但是,我想知道的是,在tcp中,3路,三路握手发生在哪里。

listen() 是执行三向握手,还是accept()?

我的意思是做 syn(client) // syn/ack(server) // ack(clinet) 数据包。

【问题讨论】:

  • 两者都不是。 listen()accept() 不是 TCP(或任何其他支持的协议)的直接接口。当然 Danny_ds 是正确的,listen() 在执行任何握手之前返回(或必须能够这样做),但这并不意味着系统在建立连接之前等待 accept() 调用。

标签: c sockets networking


【解决方案1】:

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

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

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

【讨论】:

  • 如果没有构造三路握手(我的意思是客户端发送这样的RST),那么连接没有在积压队列中排队? Accept() 只有在队列中有完美的 3 次握手时才返回新的套接字?
  • 没错。如另一个答案中的图表所示,accept() 在 3 次握手完成之前不会返回。他对accept()触发第二步握手的唯一错误。
  • @Barmar 你确定 accept () 系统调用不会在服务器端触发 SYN + ACK 吗?这个网站说 accept() 负责发送 SYN + ACK ibm.com/developerworks/aix/library/au-tcpsystemcalls/#connect
  • @Zephyr 我确定我是对的。编写一个调用listen() 但从不调用accept() 的服务器,然后在客户端连接到端口时进行数据包捕获。我看不到该网站上的哪个位置说accept() 发送SYN/ACK
  • 它说:服务器在处理完SYN之后,使用tcp_output ()ip_output ()if_output ()序列发送一个SYN ACK数据包。与accept() 无关。
【解决方案2】:

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

当一个请求被发出时(假设我们使用 TCP,如果你使用 UDP,你将不会使用监听或接受它的非面向连接的协议,如 TCP)然后它进行 TCP 的 3 次握手,如果服务器当前正在处理一个请求然后请求被移动到队列中。队列有一个可以指定的大小,挂起请求的最大数量取决于操作系统,然后有另一个队列接受函数,从每次监听中获取一个请求,被调用并返回,然后返回新的套接字以用于此连接以及对listen()的请求的(地址、端口)。

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多