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