TCP协议三次握手


在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.


实例:

IP 192.168.1.11敏感词37 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.11敏感词37: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.11敏感词37 > 192.168.1.123.7788: ack 1739326487,ack 1

第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

即:第三次发送的序列号是第二次发的确认号,第三次发送的确认号是第二次发送序列号+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) ``` #### 三次握手的总结 三次握手的本质是通过序列号同步和能力协商建立可靠的逻辑连接。它不仅确保了数据传输的可靠性,还有效避免了网络延迟和重复连接请求带来的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值