1、Keep-Alive
如果一段时间内没有数据交换,通信的每个终端都可能会怀疑对方是否还处于活跃状态,TCP协议提供了一种Keep-Alive的机制,该机制在经过一段不活动时间后,将向另一个终端发送一个探测消息。如果另一个终端还处于活跃状态,它将回复一个确认消息。如果经过几次尝试后依然没有收到另一个终端的确认消息,则终止发送探测消息,关闭套接字,并在下一次尝试I/O操作时抛出一个异常。
应用程序只要在探测消息失败时才能察觉到keep-alive机制的工作。
默认关闭。
2、发送和接收缓存区大小
一旦创建了一个Socket或DatagramSocket实例,操作系统就必须为其分配缓存区一存放接收的和要发送的数据。
还可以在ServerSocket上指定接收缓冲区大小,不过,这实际上是为accept方法所创建的新Socket实例设置接收缓冲区大小。
当接收了一个新的Socket,它就可以立刻开始接收数据,因此,需要在accept方法完成连接之前设置好缓冲区的大小。
3、超时
很多I/O操作如果不能立即完成就会阻塞等待,读操作将阻塞等待直到至少有一个字节可读;接收操作将阻塞等待直到成功建立连接。
setSoTimeout如果为0,则表示该操作永不超时。
4、地址重用
在某些情况下,可能希望能够将多个套接字绑定到同一个套接字地址。对于UDP多播的情况,在同一个主机上可能有多个应用程序加入了相同的多播组。对于TCP,当一个连接关闭后,通信的一端或两端必须在time-wait状态上等待一端时间,以对传输途中丢失的数据包进行清理。不过通信终端可能无法等到time-wait结束,对于这两种情况,都需要能够与正在使用的地址进行绑定的能力,这就要求实现地址重用。
5、消除缓冲延迟
TCP协议将数据缓存起来直到足够多时一次发送,以避免发送过小的数据包浪费网络资源。虽然这个功能有利于网络,但应用程序可能对所造成的缓冲延迟不能容忍。
6、紧急数据
假设你已经向一个慢速接收者发送了很多数据,突然又又了它急需的其他数据,如果将这些数据发送到输出流,它们将追加在常规数据队列的后面,无法保证接收者能够立即接收。为了解决这个问题,TCP协议中包含了紧急(urgent)数据的概念,这类数据可以(理论上来说)跳到前面去。由于它们能够绕过常规数据流,这些数据称为频道外数据。
注意,Java中紧急数据几乎没什么用,因为紧急字节与常规字节按照传输的顺序混在一起。实际上,Java接收者并不能区分其是否在接收紧急数据。
7、关闭后停留
当调用套接字的close方法后,即使套接字的缓冲区中还有没有发送的数据,它也将立即返回。这样不发送完所有数据可能导致的问题是主机将在后面的某个时刻发生故障。其实可以选择让close方法停留或阻塞一段时间,直到所有数据都已经发送并确认,或发生了超时。
8、广播许可
一些操作系统要求显示对广播许可进行请求。
9、通信等级
有的网络对满足服务条件的数据包提供了增强的服务或额外的保险。一个数据包的通信等级(traffic class)由数据包在网络中传输时其内部的一个值来指定。
10、基于性能的协议选择
TCP协议并不是套接字唯一可选的协议。使用什么样的协议取决于应用程序的侧重点是什么。Java允许开发者根据不同性能特征对于应用程序的重要程序,为具体实现给出建议。通过setPerformancePreferences(int connectionTime, int latency, int bandwidth)方法进行设置。