TCP三次握手和四次挥手,及TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...

本文详细解析TCP协议的三次握手和四次挥手过程,包括各种状态如CLOSE-WAIT、TIME-WAIT、LISTENING等,并介绍了TCP连接在不同状态下的角色和作用。着重阐述了TIME_WAIT状态的重要性,确保连接的可靠关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP三次握手和四次挥手状态图:

三次握手:

第一次
第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。

 

四次挥手:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 F

### 关于TCP三次握手四次挥手的解析 #### 一、TCP三次握手的过程 TCP协议通过三次握手来建立可靠连接。以下是其具体过程: 1. **第一次握手**:客户端向服务器发送一个 SYN 数据包,表示希望与服务器建立连接,并随机生成初始序列号 X (SYN=1, seq=X),随后进入 SYN_SENT 状态[^1]。 2. **第二次握手**:服务器接收到客户端的数据包后,如果同意建立连接,则会返回一个 SYN ACK 数据包给客户端,其中 SYN 表示服务器也想与客户端建立连接并随机生成自己的初始序列号 Y (SYN=1, seq=Y),而 ACK 则是对客户端之前发出的 SYN 请求进行确认 (ACK=1, ack=X+1)[^2]。此时服务器处于 SYN_RCVD 状态。 3. **第三次握手**:当客户端收到来自服务器的响应后,它再回复一个 ACK 数据包给服务器作为最终确认 (SYN=0, ACK=1, seq=X+1, ack=Y+1)。一旦这个数据包到达服务器端,双方都进入了 ESTABLISHED 状态,意味着连接正式建立完成[^3]。 #### 二、TCP四次挥手的过程 为了终止一条已经存在的TCP连接,通常采用的是所谓的“四次挥手”。下面是详细的步骤描述: 1. **第一步**:主动关闭方(通常是客户端)先发起结束请求,发送带有FIN标志位设置为1以及当前序列号X的一个段到被动关闭方(一般是服务器),然后自己进入到 FIN_WAIT_1 状态[^4]。 2. **第二步**:被动关闭方接收到上述消息以后回应一个包含有对前面提到的那个FIN标记进行了应答(acknowledgment number 设置成了X+1) 并且保持自身原有的序列号不变(SYN=0, ACK=1, seq=W, ack=X+1) 的ACK段回到主动关闭方那里去;与此同时改变自身的状态成为CLOSED_WAIT 。这时前者则转变为FIN_WAIT_2 状态等待进一步的通知来自后者关于是否准备好完全切断这条线路的信息了。 3. **第三步**:只有等到所有的未决事务都被妥善解决之后——比如缓冲区内还有待传输或者接收的数据等等情况发生时才会继续下一步动作,在这个时候由原来的被动关闭者也就是现在的实际执行者再次送出另一个新的具有相同特征但是增加了额外参数fin_flag等于true再加上更新后的序列数值Z(W+length_of_data_sent_since_last_acknowledgement)+1这样一个完整的tcp segment对象传递回去告知对方现在可以安全地彻底分离彼此之间的联系关系啦!于是乎它的角色也随之转换成为了LAST_ACK模式下运作着的状态机器实例化版本形式存在于此期间之中直至最后阶段的到来为止。 4. **第四步**:最后一步就是当最初的提议者终于捕捉到了那个标志着整个流程即将圆满落幕的关键信号源—即最后一个携带fin标识符值设定了TRUE属性并且附带相应调整过的序列编号z+1的新鲜出炉的作品成果物送达之时起便立即切换至TIME-WAIT这种特殊类型的等候区间内停留固定时间长度两倍最大分组生存周期(Two Maximum Segment Lifetime ,简称2MSL )以便确保网络环境中可能残留下来的重复副本均已被有效清除干净后再从容不迫地步入终点线处实现真正的闭合操作从而顺利完成全部预定目标使命任务清单列表项目条目逐一勾选核销完毕无误之后方才安心退出舞台谢幕退场休息去了。 ```python def tcp_handshake(): """ Simulates the three-way handshake process of a TCP connection. Returns: str: A message indicating successful establishment of the connection. """ client_seq = random.randint(0, pow(2, 32)) server_seq = random.randint(0, pow(2, 32)) # Client sends SYN to Server syn_packet_client_to_server = {'SYN': True, 'SEQ': client_seq} # Server receives and responds with SYN-ACK syn_ack_packet_server_to_client = { 'SYN': True, 'ACK': True, 'SEQ': server_seq, 'ACK_NUM': client_seq + 1 } # Client acknowledges receipt from Server's response ack_packet_client_to_server = { 'ACK': True, 'SEQ': client_seq + 1, 'ACK_NUM': server_seq + 1 } return "Connection established successfully." def tcp_waveoff(): """ Simulates the four-way wave-off process when closing a TCP connection. Returns: str: A message indicating both sides have closed their connections properly after waiting periods are over. """ client_state = ['ACTIVE', 'FIN_WAIT_1', 'FIN_WAIT_2', 'TIME_WAIT'] server_state = ['LISTENING', 'CLOSE_WAIT', 'LAST_ACK'] # Assume initial states here... current_client_status_index = 0 current_server_status_index = 0 while not ((current_client_status_index >= len(client_state)-1) & \ (current_server_status_index >= len(server_state))): if current_client_status_index == 0: send_fin() current_client_status_index +=1 elif current_client_status_index==1 : receive_ack_for_previous_fin() current_client_status_index+=1 elif current_client_status_index==len(client_state)-1: wait_two_msl_period_before_closing_fully() else: pass # Other intermediate steps handled similarly... if current_server_status_index<len(server_state): handle_next_step_based_on_current_role_and_state(current_server_status_index) return "Both ends fully disconnected." ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值