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