我将 java ServerSocket 类用于服务器应用程序。accept() 方法是否参与 tcp/ip 握手?
正如我在 tcp/ip 转储和命令 netstat 中看到的,客户端在调用接受方法之前建立连接并返回 Socket 对象。
是 java 问题,还是我不理解 accept() 语义?
我将 java ServerSocket 类用于服务器应用程序。accept() 方法是否参与 tcp/ip 握手?
正如我在 tcp/ip 转储和命令 netstat 中看到的,客户端在调用接受方法之前建立连接并返回 Socket 对象。
是 java 问题,还是我不理解 accept() 语义?
通常在 Unix 中,如果你用 listen() 标记套接字,操作系统就会开始接受连接。当您调用accept() 函数时,操作系统只是简单地移交已经打开的连接。Listen 接受一个参数,该参数允许您指定操作系统允许的“未接受”打开连接数(即队列的大小)。
该accept
方法本身并不主动参与握手。消息的发送和接收是在 TCP/IP 协议栈中实现的,通常是在 OS 内核空间中。
但是,accept()
如果某个进程accept()
对与相关 IP 地址和端口绑定的套接字的调用处于活动状态,则 TCP/IP 堆栈将仅发送 SYN-ACK 消息。当三次握手完成后,accept()
方法调用就完成了。
如果没有进程及时调用accept()
,传入的 SYN 消息将被内核丢弃,远程客户端最终将超时连接尝试。(另一方面,如果 IP 地址/端口没有绑定,那么内核很可能会以 RST 响应,远程客户端会看到“连接被拒绝”。)
仅在客户端和服务器连接(握手等)后接受返回。