accept()方法和TCP/IP握手

5

我使用Java的ServerSocket类作为服务器应用程序。accept()方法是否参与TCP / IP握手过程?

从TCP / IP转储和netstat命令中可以看出,在调用accept方法之前,客户端已经建立了连接并返回了Socket对象。

这是Java的问题,还是我不理解accept()语义?

3个回答

7

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


1

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

然而,accept() 方法涉及其中,因为只有当某个进程使用相关 IP 地址和端口绑定了一个套接字并且有 accept() 调用时,TCP/IP 栈才会发送 SYN-ACK 消息。当三次握手完成后,accept() 方法调用将完成。

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


0

只有在客户端和服务器连接成功(握手等)后才能返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接