5

我将 java ServerSocket 类用于服务器应用程序。accept() 方法是否参与 tcp/ip 握手?

正如我在 tcp/ip 转储和命令 netstat 中看到的,客户端在调用接受方法之前建立连接并返回 Socket 对象。

是 java 问题,还是我不理解 accept() 语义?

4

3 回答 3

7

通常在 Unix 中,如果你用 listen() 标记套接字,操作系统就会开始接受连接。当您调用accept() 函数时,操作系统只是简单地移交已经打开的连接。Listen 接受一个参数,该参数允许您指定操作系统允许的“未接受”打开连接数(即队列的大小)。

于 2010-01-19T22:38:59.523 回答
1

accept方法本身并不主动参与握手。消息的发送和接收是在 TCP/IP 协议栈中实现的,通常是在 OS 内核空间中。

但是,accept()如果某个进程accept()对与相关 IP 地址和端口绑定的套接字的调用处于活动状态,则 TCP/IP 堆栈将仅发送 SYN-ACK 消息。当三次握手完成后,accept()方法调用就完成了。

如果没有进程及时调用accept(),传入的 SYN 消息将被内核丢弃,远程客户端最终将超时连接尝试。(另一方面,如果 IP 地址/端口没有绑定,那么内核很可能会以 RST 响应,远程客户端会看到“连接被拒绝”。)

于 2010-01-19T22:46:15.087 回答
0

仅在客户端和服务器连接(握手等)后接受返回。

于 2010-01-19T22:39:04.167 回答