TCP协议三次握手

1.首先服务端会会打开监听状态,从CLOSED状态转换为LISTEN状态(被动打开)。

2.第一次握手:客户端开始主动连接,发送报文段,从CLOSED状态转换为SYN-SENT状态(主动打开)。

        其中SYN(同步序列号)表示SYN标志位为1,表示这是一个同步报文。seq=ISN(c)(c表示客户端)表示32位序列号seq被设置为初始序列号(Initial Sequence Number,ISN)。

3.第二次握手:服务端确认客户端的连接请求,向客户端发送自己的同步报文,状态从LISTEN转换为SYN-RCVD状态。

        其中SYN和ACK(确认号)标志位都为1,表示这是一个同步报文且也是一个确认报文。seq=ISN(s)(s表示服务端),ack=ISN(c)+1表示服务端已经收到客户端的SYN报文。

4.第三次握手:客户端确认服务端的SYN报文后,完成连接建立,为了确认向服务端发送ACK报文。客户端状态变成ESTABLISHED,同时服务端也进入到ESTABLISHED状态。

        其中ACK标志位为1,seq=ISN(c)+1表示客户端已经收到了服务器的 SYN 报文,并且下一个要发送的字节的序列号是 ISN(c) + 1,ack=ISN(s)+1表示客户端已经收到了服务端的SYN报文,并且期望收到的下一个字节的序列号是ISN(s)+1。

### TCP协议三次握手过程详解 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。为了确保数据传输的可靠性,TCP在建立连接时采用了一种称为“三次握手”(Three-Way Handshake)的机制。该机制用于在客户端和服务器之间同步序列号并确认彼此的发送和接收能力,从而确保连接的可靠性。 #### 三次握手的详细过程 1. **第一次握手** 客户端发送一个SYN(同步)标志位为1的TCP段,表示请求建立连接。该段中包含客户端选择的初始序列号(Sequence Number = x)。此时,客户端进入SYN_SENT状态。 例如:`SYN = 1, Sequence Number = 2322326583` [^2]。 2. **第二次握手** 服务器收到SYN段后,会以自己的SYN段作为响应,并且设置ACK(确认)标志位为1,表示确认收到客户端的SYN请求。服务器会在该段中包含自己的初始序列号(Sequence Number = y),同时将确认号(Acknowledgment Number)设置为客户端的序列号加1(x + 1)。此时,服务器进入SYN_RCVD状态。 例如:`SYN = 1, Sequence Number = 3573692787; ACK = 1, Acknowledgment Number = 2322326583 + 1` [^2]。 3. **第三次握手** 客户端收到服务器的SYN-ACK响应后,会发送一个ACK段作为确认。该段中,客户端将确认号设置为服务器的序列号加1(y + 1),并清除SYN标志位。此时,客户端和服务器均进入ESTABLISHED状态,连接正式建立。 例如:`ACK = 1, Acknowledgment Number = 3573692787 + 1` [^2]。 通过这三次握手,客户端和服务器成功交换了初始序列号,并确认了彼此的发送和接收能力。 #### 三次握手的必要性 - **解决网络延迟导致的重复分组问题**:通过三次握手可以确保旧的连接请求在网络中失效,避免因历史连接造成的资源浪费。 - **确认双方的发送/接收能力正常**:三次握手能够验证客户端和服务器都能正常发送和接收数据。 - **协商初始序列号**:每次连接都会使用不同的初始序列号,以防止数据混淆。 - **避免死锁问题**:如果只使用两次握手,可能会导致服务器认为连接已经建立,而客户端尚未确认,从而形成类似死锁的问题 [^4]。 #### 三次握手的示例代码(伪代码) 以下是一个简单的TCP连接建立的伪代码示例,展示了客户端和服务器之间的握手过程: ```python # 客户端发送SYN send_SYN_to_server(): syn_packet = create_tcp_packet(syn=1, seq=x) send_packet(syn_packet) # 服务器响应SYN-ACK respond_SYN_ACK(): syn_ack_packet = create_tcp_packet(syn=1, ack=1, seq=y, ack_num=x+1) send_packet(syn_ack_packet) # 客户端发送ACK send_ACK_to_server(): ack_packet = create_tcp_packet(ack=1, ack_num=y+1) send_packet(ack_packet) ``` #### 三次握手的总结 三次握手的本质是通过序列号同步和能力协商建立可靠的逻辑连接。它不仅确保了数据传输的可靠性,还有效避免了网络延迟和重复连接请求带来的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值