1. SO_LINGER/ SO_REUSEADDR
TCP正常的关闭过程如下(四次握手过程):
(FIN_WAIT_1) A ---FIN---> B(CLOSE_WAIT)
(FIN_WAIT_2) A <--ACK-- B(CLOSE_WAIT)
(TIME_WAIT)A <--FIN---- B(LAST_ACK)
(TIME_WAIT)A ---ACK-> B(CLOSED)
Ø A端首先发送一个FIN请求给B端,要求关闭,发送后A段的TCP状态变更为FIN_WAIT_1,接收到FIN请求后B端的TCP状态变更为CLOSE_WAIT
Ø B接收到ACK请求后,B回一个ACK给A端,确认接收到的FIN请求,接收到ACK请求后,A端的TCP状态变更为为FIN_WAIT_2。
Ø B端再发送一个FIN请求给A端,与连接过程的3次握手过程不一样,这个FIN请求之所以并不是与上一个请求一起发送,之所以如此处理,是因为TCP是双通道的,允许在发送ACK请求后,并不马上发FIN请求,即只关闭A到B端的数据流,仍然允许B端到A端的数据流。这个ACK请求发送之后,B端的TCP状态变更为LAST_ACK,A端的状态变更为TIME_WAIT。
Ø A端接收到B端的FIN请求后,再回B端一个ACK信息,对上一个FIN请求进行确认,到此时B端状态变更为CLOSED,Socket可以关闭。
除了如上正常的关闭(优雅关闭)之外,TCP还提供了另外一种非优雅的关闭方式RST(Reset)
(CLOSED) A ---RST--> B (CLOSED)
Ø A端发送RST状态之后,TCP进入CLOSED状态,B端接收到RST后,也即可进入CLOSED状态。
在第一种关闭方式上(优雅关闭),非常遗憾,A端在最后发送一个ACK请求后,并不能马上将该Socket回收,因为A并不能确定B一定能够接收到这个ACK请求,因此A端必须对这个Socket维持TIME_WAIT状态2MSL(MSL=Max Segment Lifetime,取决于操作系统和TCP实现,该值为30秒、60秒或2分钟)。如果A端是客户端,这并不会成为问题,但如果A端是服务端,那就很危险了,如果连接的Socket非常多,而又维持如此多的TIME_WAIT状态的话,那么有可能会将Socket耗尽(报Too Many Open File)。
服务端为了解决这个问题,可选择的方式有三种:
Ø 保证由客户端主动发起关闭(即做为B端)
Ø 关闭的时候使用RST的方式
Ø 对处于TIME_WAIT状态的TCP允许重用
一般我们当然最好是选择第一种方式,实在没有办法的时候,我们可以使用SO_LINGER选择第二种方式,使用SO_REUSEADDR选择第三种方式
public void setSoLinger(boolean on, int linger) throws SocketException
public void setReuseAddress(boolean on) throws SocketException
第一个on表示是否使用SO_LINGER选项,linger(以秒为单位)表示在发RST之前会等待多久,因为一旦发送RST,还在缓冲区中还没有发送出去的数据就会直接丢弃
2.TCP_NODELAY
对于交互型的应用(譬如telnet),经常存在的情况是客户端和服务端之间需要频繁地进行一些小数据交换,譬如telnet可能每敲一个键盘都需要将数据发送到服务端。为了避免这种情况会产生大量小数据包,提出了Nagle算法。Nagle算法要求每次在发送端最后只有一个未被确认的包,因此上一个包发送出去还没有接收到响应之前,要求发送的包回先放在缓冲区,接收到响应之后,会将缓冲区中的包合并成一个包发送出去(可以看到,响应回地越快,发送出去的数据也会越快)。
需要注意的是,由Nagle算法要求只能有一个未被确认的包,因此窗口参数会失效,在大数据量传送的情况下会使网络吞吐量下降,因此对于大数据量的交互,应该关闭Nagle算法,Nagle算法比较适合小数据量频繁交换的情景。我们可以使用TCP_NODELAY关闭Nagle算法。
public void setTcpNoDelay(boolean on) throws SocketException
3.SO_KEEPALIVE
在一个TCP连接建立之后,我们会很奇怪地发现,默认情况下,如果一端异常退出(譬如网络中断后一端退出,使地关闭请求另一端无法接收到),TCP的另一端并不能获得这种情况,仍然会保持一个半关闭的连接,对于服务端,大量半关闭的连接将会是非常致命的。SO_KEEPALIVE提供了一种手段让TCP的一端(通常服务提供者端)可以检测到这种情况。如果我们设置了SO_KEEPALIVE,TCP在距离上一次TCP包交互2个小时(取决于操作系统和TCP实现,规范建议不低于2小时)后,会发送一个探测包给另一端,如果接收不到响应,则在75秒后重新发送,连续10次仍然没有响应,则认为对方已经关闭,系统会将该连接关闭。一般情况下,如果对方已经关闭,则对方的TCP层会回RST响应回来,这种情况下,同样会将连接关闭。
public void setKeepAlive(boolean on) throws SocketException
分享到:
相关推荐
### Java CP/IP Socket编程 #### 第1章:简介 计算机网络的发展使得个人电脑不仅可以作为办公工具,还能成为娱乐中心和沟通平台。随着越来越多的人通过互联网进行互动,掌握网络编程技术变得尤为重要。本章旨在为...
《1.1TCP/IP详解卷1:协议 原书第2版》是网络通信领域的一本经典著作,深入解析了TCP/IP协议族的核心概念和技术。这本书对于理解互联网的工作原理至关重要,尤其对于Java开发者来说,熟悉TCP/IP协议有助于构建更高效...
Socket TCP网络调试助手是一款强大的工具,它主要用于帮助开发者在TCP/IP网络环境中进行通信协议的调试和测试。在软件开发过程中,尤其是涉及到网络编程时,理解并掌握TCP/IP协议至关重要。这款工具提供了直观的界面...
它主要包括以下几个部分: 1. **请求行**: 包含方法(如GET)、URL和HTTP版本。 2. **请求头**: 包含客户端的一些信息,如User-Agent、Accept-Language等。 3. **响应状态码**: 表示请求的结果,如200 OK、404 Not ...
在这个"Socket编程客户端"中,我们将会探讨以下几个关键知识点: 1. **Socket基础概念**:Socket在计算机网络中是一种接口,它允许应用程序通过网络进行通信。在TCP/IP协议栈中,Socket提供了应用层与传输层的交互...
在Java网络编程中,我们主要涉及以下几个关键知识点: 1. **套接字(Sockets)编程**:Java的`java.net.Socket`和`ServerSocket`类是进行客户端-服务器通信的基础。源码中可能会包含如何创建和使用套接字,以及处理...
根据提供的文件信息,我们可以深入探讨有关“IP数据包监控”的几个关键知识点,这些知识点主要集中在对IP数据包的理解、监控工具和技术的选择上。 ### 一、IP数据包的基础概念 在计算机网络中,IP(Internet ...
它是一个基于请求与响应模型的、无状态的、应用层协议,通常运行在TCP/IP协议之上。Java语言在开发过程中,HTTP协议的应用非常普遍,无论是客户端还是服务端,都能看到它的身影。 HTTP协议的核心概念包括以下几个...
通信过程主要包括以下几个步骤: 1. **客户端**: - 创建Socket对象,指定服务器IP地址和端口号。 - 获取输出流,向服务器发送数据。 - 获取输入流,接收服务器返回的数据。 2. **服务器端**: - 创建...
Java的Socket编程接口提供了基础的TCP/IP通信功能,开发者可以使用这些接口实现玩家之间的实时交互。此外,NIO(非阻塞I/O)和Netty框架可以进一步优化网络性能,减少延迟,提高游戏体验。 4. **用户界面(UI)**:...
FTP下载和解析涉及到的主要知识点包括以下几个方面: 1. FTP基本概念: FTP是Internet上的标准服务之一,它通过TCP/IP协议进行通信。FTP客户端和服务器之间建立连接,进行文件操作。主要有两种工作模式:主动模式...
Java网络编程主要涵盖以下几个关键知识点: 1. **套接字(Socket)编程**:Java中的`java.net.Socket`和`ServerSocket`类是实现客户端-服务器模型的基础。Socket类代表网络上的一个端点,而ServerSocket则用于监听...
这通常涉及以下几个方面: - **权限管理**:合理设置文件和目录的权限,避免敏感信息泄露。 - **资源限制**:对每个进程或线程的资源使用进行限制,防止服务器资源被恶意消耗。 - **异常处理**:良好的异常处理机制...
在使用HttpClient时,我们通常会遇到以下几个关键步骤: 1. 创建HttpClient实例:通过`HttpClientBuilder`或`HttpAsyncClientBuilder`来配置HttpClient的行为,如设置连接管理器、请求处理器等。 2. 配置请求:使用`...
1. 数据传输:TCP/IP协议栈是基础,通过建立稳定的Socket连接,实现数据的安全传输。 2. 实时性:心跳机制确保连接有效性,定时推送或轮询策略获取最新数据,确保监控的实时性。 3. 数据解析:JSON或XML等格式用于...
Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
在Java中实现局域网通信,我们需要以下几个步骤: 1. **服务器端**:创建一个ServerSocket实例,指定一个端口号,开始监听。例如: ```java ServerSocket serverSocket = new ServerSocket(12345); ``` 2. **...
根据提供的文件信息,本文将详细解析“JAVA源码JAVA3D的网络三维技术的设计与实现”这一主题,包括JAVA3D的基本概念、网络三维技术的关键技术点、设计思路及其实现方法等内容。 ### JAVA3D简介 JAVA3D是基于Java...
JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...