服务器开发常用知识


Java方面\n1 基础篇\n1.1 网络基础\n1.1.1 tcp三次握手\nTCP协议使用三次握手(Three-Way Handshake)来建立一个可靠的连接,这是为了确保双方都能同步并且确认连接的有效性。让我们详细解释为什么三次握手是必要的,以及如果只用两次握手可能会出现什么问题。\n\n#


## TCP三次握手的过程\n\n1. **第一次握手**:客户端发送一个SYN(同步)包到服务器端,告诉服务器端客户端希望建立连接。这个SYN包包含了客户端的初始序列号(ISN)。\n\nClient → Server : SYN (seq=x)\n2. **第二次握手**:服务器端收到客户端的SYN包后,回应一个SYN-ACK(同步-确认)包。这个包包含了服务器端的初始序列号(ISN),并确认了客户端的序列号(seq=x+1)。\n\nServer → Client : SYN-ACK (ack=x+1, seq=y)\n3. **第三次握手**:客户端收到服务器端的SYN-ACK包后,发送一个ACK(确认)包给服务器,确认服务器的序列号(seq=y+1)。\n\n Client → Server : ACK (ack=y+1)\n### 为什么需要三次握手\n\n1. **确认双方的接收能力**:\n   - 第一次握手:客户端向服务器发送SYN包,表明自己希望建立连接,并且客户端的序列号是x。\n   - 第二次握手:服务器收到SYN包后,回应SYN-ACK包,表明自己已经准备好接受连接,并且发送了自己的序列号y。同时服务器也确认了客户端的SYN包。\n   - 第三次握手:客户端收到SYN-ACK包后,发送ACK包给服务器,确认自己已经收到了服务器的SYN包。\n\n   三次握手确保了双方都能正确接收和确认对方的请求,同时也确保了双方都有序列号进行通信。\n\n2. **防止重复连接请求**:\n   - 如果只使用两次握手,服务器无法确定客户端是否收到了服务器的SYN-ACK包。也就是说,服务器无法确定客户端是否正确接收到它的确认响应,从而可能导致连接请求丢失或重发。\n   - 三次握手确保了每一方都能确认对方的接收能力和意图,避免了重复连接请求的问题。\n\n3. **同步双方序列号**:\n   - 在TCP连接中,序列号用于确保数据的正确顺序和完整性。三次握手通过交换序列号来确保双方的序列号在数据传输之前同步。这对于数据的正确接收和传输至关重要。\n\n### 如果只用两次握手会出现什么问题\n\n1. **客户端不确定服务器是否准备好**:\n   - 在两次握手的情况下,客户端在发送SYN包后,收到服务器的SYN-ACK包后,立即假设连接建立成功,但此时客户端无法确认服务器是否已经接收到了客户端的SYN包以及是否准备好接收数据。\n\n2. **丢失连接请求的问题**:\n   - 如果在第二次握手后,客户端的ACK包丢失,服务器将无法确认客户端的ACK包,导致服务器可能会重发SYN-ACK包,从而导致连接请求的重复或丢失。\n\n3. **状态不一致**:\n   - 由于没有第三次握手,客户端和服务器的状态可能不一致,导致后续的数据传输出现问题。\n\n### 总结\n\n三次握手是为了确保客户端和服务器都能正确地建立连接并同步序列号,保证双方能够可靠地进行数据传输。如果只用两次握手,可能会导致连接的不可靠、请求的重复或丢失,以及状态的不一致。因此,三次握手是TCP协议中建立可靠连接的关键步骤。\n\n1.1.2 tcp四次挥手\nTCP连接的四次挥手(Four-Way Handshake)用于优雅地终止一个连接。四次挥手确保了双方都能正确地关闭连接,确保所有的数据都被发送和接收完毕。下面详细解释四次挥手的过程及其原因。\n\n### 四次挥手的过程\n\n1. **第一次挥手**:客户端发送一个FIN(Finish)包到服务器,表示客户端没有数据发送了,准备关闭连接。此时客户端进入**FIN_WAIT_1**状态。\n\n Client → Server : FIN (seq=x)\n2. **第二次挥手**:服务器收到FIN包后,回应一个ACK(确认)包,确认客户端的FIN包,并进入**CLOSE_WAIT**状态。此时,服务器准备关闭连接,但可能还有数据需要发送。客户端进入**FIN_WAIT_2**状态。\n\n Server → Client : ACK (ack=x+1)\n3. **第三次挥手**:服务器发送一个FIN包到客户端,表示服务器也没有数据要发送,准备关闭连接。此时服务器进入**LAST_ACK**状态。\n\n Server → Client : FIN (seq=y)\n4. **第四次挥手**:客户端收到服务器的FIN包后,回应一个ACK包,确认服务器的FIN包。此时客户端进入**TIME_WAIT**状态,等待足够的时间以确保服务器收到确认后才真正关闭连接。服务器进入**CLOSED**状态。\n\n Client → Server : ACK (ack=y+1)\n   客户端在**TIME_WAIT**状态下会等待一段时间(通常是2倍的MSL,即最大报文段寿命),确保所有的数据包都能传输完毕,然后才进入**CLOSED**状态。\n\n### 为什么需要四次挥手\n\n1. **确保数据的完整性**:\n   - 四次挥手确保了所有的数据都能正确地传输完毕。客户端在发送FIN包后,服务器还有时间发送最后的数据。服务器发送FIN包前可能还有数据未发送,客户端通过ACK包确认服务器的FIN包后,服务器确保可以关闭连接。\n\n2. **双向关闭连接**:\n   - 每个方向的连接都需要独立关闭。客户端和服务器可以独立地发送和接收数据,所以每一方都需要单独发出关闭连接的信号。这就是为什么需要四次挥手而不是两次。\n\n3. **优雅关闭**:\n   - 通过四次挥手,连接的每一方都有机会完成剩余的数据传输和关闭操作。这种优雅的关闭方式避免了数据丢失或不一致的状态。\n\n4. **TIME_WAIT状态**:\n   - 客户端进入**TIME_WAIT**状态后,确保所有的延迟数据包能够被清除,并且避免旧的重复数据包干扰新连接。这个状态有助于防止出现重叠的连接问题。\n\n### 总结\n\n四次挥手是TCP协议中优雅关闭连接的关键过程。它通过四次交换控制包,确保了数据的完整传输,允许每一方独立地关闭连接,并且提供了时间等待状态以避免潜在的连接问题。如果只有两次挥手,可能会导致数据丢失、状态不一致或连接不完全关闭。因此,四次挥手是保证可靠和完整地终止TCP连接的重要步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值