Java Socket Streams是否安全?

时间:2016-03-17 16:09:52

标签: java sockets

我正在使用java SocketsServerSockets来连接多个设备。 Socket的{​​{1}}发送的部分数据是否有任何风险,只是没有到达对方的OutputStream

3 个答案:

答案 0 :(得分:3)

没有任何保证。如果网络出现故障,您的数据将永远无法到达。除非网络出现故障,否则如果您使用的是TCP并且以线程安全的方式使用套接字流并且确定已刷新套接字的OutputStream中的数据,那么可以保证您的数据会显示出来。另一方面,UDP没有这样的保证。

答案 1 :(得分:1)

传输控制协议(TCP)在IP之上运行,并在发送方和接收方之间提供面向连接的服务。 TCP提供有保证的传送,并确保按顺序传送数据包。底层网络IP非常不可靠,不能为TCP提供任何保证。为了在发送方和接收方之间提供可靠性,TCP使用各种机制,例如序列号,确认,3路握手和定时器。

通过这样做,发送方和接收方可以验证数据是否正确传送。他们还可以确定数据是否被丢弃,可能是因为传输损失。

发送方和接收方都在连接建立阶段交换初始序列号(ISN)。在成功初始握手之后,发送方和接收方都知道它们必须用于通信的序列号。由于TCP允许延迟段,因此它必须接受不按顺序但在某些范围内的段,称为接收器窗口大小。在初始握手期间也交换接收器窗口大小。 TCP将丢弃计算边界内没有序列号的所有段。

序号 TCP序列号是32位计数器。为了区分同一发送器和接收器之间的不同连接,重要的是每次打开连接时序列号不从0开始或任何其他固定数字。因此,重要的是从发送方到接收方的数据的第一个字节使用随机序列号。当前实现每秒将序列号递增有限量。

三方握手 TCP使用3次握手来建立成功的连接。当主机A想要打开与主机B的连接时,A向B发送初始段。该初始段具有B需要用于向A发送数据的初始序列号(ISN)。该初始段由SYN标识。 TCP标头中的位设置为1。如果SYN位置1,则标头中的32位序列号被解释为ISN。在所有其他情况下(当未设置SYN位时),32位序列号标识该段中包含的第一个数据字节的序列号。 B从A接收SYN时,必须用另一个SYN响应,同时确认A发送的SYN。这在状态机图中用SYN + ACK表示。

<强>计时器

计时器与TCP国家密切相关。

连接建立计时器 该计时器与打开连接相关联。在初始连接设置期间发送SYN时启动它。在大多数TCP实现中,此计时器的值设置为75秒。如果发生超时,则中止连接。

FIN_WAIT 计时器
当从FIN_WAIT_1状态转换到FIN_WAIT_2状态时,将启动FIN_WAIT_2计时器。此计时器的值为10分钟。在FIN_WAIT_2状态中,预期设置了FIN位的TCP段。如果收到设置了FIN位的数据包,则取消定时器。在计时器到期时,它将以75秒的值重新启动。如果在此期间内没有FIN位的数据包到达,则连接被丢弃。

TIME_WAIT 计时器
当连接进入TIME-WAIT状态时,启动时间等待计时器。这是为了允许传输中的所有段从网络中删除。计时器的值通常设置为2分钟。在计时器到期时,连接终止。

KEEP_ALIVE计时器 如果没有要发送的数据,TCP通常不会通过连接发送任何内容。当连接断开时,无法区分这种沉默。可以设置保持活动计时器,允许TCP定期检查连接的另一端是否仍处于活动状态。此计时器的默认值为2小时。定时器到期后,探测器被发送到远程端。如果遥控器没有响应探测器,则会断开连接。

有关详细信息refer to this link

答案 2 :(得分:0)

我假设您在询问常规插座;例如TCP / IP流。

一般来说,TCP会检测丢失和损坏的数据包并导致它们被重新传输。它还将处理无序传递的数据包。假设这些机制起作用,则可以从相应的输入流中读取写入输出流的每个字节。但是,它并不总是有效:

  1. 如果网络出现长时间中断,则存在连接的一端可能超时另一端并在收到所有数据之前中断连接的风险。

  2. TCP使用16位数据包级校验和来防止数据在实践中被破坏。校验和不会检测到随机数据包损坏的可能性很小。最终结果是错误的数据到达。

  3. 第三方可能会干扰已建立的TCP / IP连接(例如,通过注入带有欺骗性源地址的数据包)。这可能会过早地破坏连接,或者更糟。

  4. 如果您询问DatagramSockets,那么(例如)任何UDP / IP数据报都可能丢失。无法保证将收到任何已发送的数据。