accept()方法和tcp / ip握手

时间:2010-01-19 22:35:20

标签: java sockets tcp handshaking

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

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

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

3 个答案:

答案 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)

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