TCP的三次握手和四次挥手

一、TCP三次握手

(一)背景

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。三次握手是TCP协议用来建立可靠连接的过程。它确保了通信双方在建立连接时能够正确地发送和接收数据。

(二)三次握手的过程

  1. 第一次握手(SYN)

    • 发起方:客户端
    • 动作:客户端向服务器发送一个TCP报文段,这个报文段的标志位中的SYN(同步序列编号)被置为1。同时,客户端会随机选择一个初始序列号(ISN,Initial Sequence Number),这个序列号会随着数据的传输而递增,用于保证数据传输的可靠性。例如,客户端选择的初始序列号为X。
    • 目的:客户端通过这个报文段告诉服务器,它想要建立一个连接,并且通过初始序列号来标识这个连接。
    • 状态变化:客户端从CLOSED(关闭状态)变为SYN - SENT(同步已发送状态)。
  2. 第二次握手(SYN - ACK)

    • 发起方:服务器
    • 动作:服务器收到客户端的SYN报文段后,会确认客户端的请求。它会发送一个TCP报文段作为响应。这个报文段有两个标志位被置为1,SYN和ACK(确认)。服务器会将客户端的初始序列号X加1(X + 1)作为确认号(acknowledgment number),表示它已经收到了客户端的序列号X。同时,服务器也会随机选择自己的初始序列号Y。
    • 目的:服务器通过这个报文段告诉客户端,它已经收到了客户端的连接请求,并且同意建立连接。同时,服务器也向客户端发送自己的初始序列号,以便客户端能够确认服务器的连接请求。
    • 状态变化:服务器从CLOSED变为SYN - RCVD(同步已接收状态)。
  3. 第三次握手(ACK)

    • 发起方:客户端
    • 动作:客户端收到服务器的SYN - ACK报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。客户端会将服务器的初始序列号Y加1(Y + 1)作为确认号,表示它已经收到了服务器的序列号Y。此时,连接建立完成,客户端和服务器可以开始传输数据。
    • 目的:客户端通过这个报文段确认了服务器的连接请求,使得连接建立过程完成。
    • 状态变化:客户端从SYN - SENT变为ESTABLISHED(已建立状态),服务器从SYN - RCVD也变为ESTABLISHED。

(三)三次握手的作用

  • 防止失效的连接请求报文段突然又传送到了服务端,因而产生错误:如果没有三次握手,当一个旧的连接请求报文段突然又传送到了服务端,服务端可能会误以为是一个新的连接请求,从而建立一个无效的连接。而通过三次握手,服务端可以通过客户端的确认来判断这个连接请求是否有效。
  • 确保通信双方的发送和接收能力正常:在三次握手的过程中,客户端和服务器都发送和接收了报文段,这可以确保双方的网络连接是正常的,能够正常地发送和接收数据。

二、TCP四次挥手

(一)背景

当TCP连接完成数据传输任务后,需要释放连接。四次挥手就是TCP协议用来释放连接的过程。它能够保证数据传输的完整性,并且确保通信双方都能够正确地关闭连接。

(二)四次挥手的过程

  1. 第一次挥手(FIN)

    • 发起方:通常是客户端(也可以是服务器,取决于谁先完成数据传输)
    • 动作:客户端在数据传输完成后,会向服务器发送一个TCP报文段,这个报文段的标志位中的FIN(结束)被置为1。同时,客户端会发送一个序列号(假设为Z)。这表示客户端已经完成了数据的发送,不再发送数据了。
    • 目的:客户端通知服务器,它已经完成了自己的数据发送任务,希望关闭连接。
    • 状态变化:客户端从ESTABLISHED变为FIN - WAIT - 1(终止等待1状态)。
  2. 第二次挥手(ACK)

    • 发起方:服务器
    • 动作:服务器收到客户端的FIN报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。服务器会将客户端的序列号Z加1(Z + 1)作为确认号,表示它已经收到了客户端的结束请求。
    • 目的:服务器通过这个报文段确认客户端的结束请求,告诉客户端它已经收到了关闭连接的请求。
    • 状态变化:服务器从ESTABLISHED变为CLOSE - WAIT(关闭等待状态),此时服务器仍然可以向客户端发送数据。
  3. 第三次挥手(FIN)

    • 发起方:服务器
    • 动作:当服务器也完成了数据的发送后,它会向客户端发送一个TCP报文段,这个报文段的FIN标志位被置为1。同时,服务器也会发送一个序列号(假设为W)。
    • 目的:服务器通知客户端,它也完成了数据的发送,希望关闭连接。
    • 状态变化:服务器从CLOSE - WAIT变为LAST - ACK(最后确认状态)。
  4. 第四次挥手(ACK)

    • 发起方:客户端
    • 动作:客户端收到服务器的FIN报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。客户端会将服务器的序列号W加1(W + 1)作为确认号。然后客户端进入TIME - WAIT(时间等待状态),等待2MSL(最大报文段生存时间)后,如果没有收到任何报文段,客户端就关闭连接。
    • 目的:客户端通过这个报文段确认服务器的结束请求。客户端等待2MSL是为了确保服务器能够收到客户端的确认报文段,防止网络延迟或丢包导致服务器没有收到确认报文段而一直等待。
    • 状态变化:客户端从FIN - WAIT - 1变为FIN - WAIT - 2(终止等待2状态),再变为TIME - WAIT(时间等待状态),最后关闭连接。服务器从LAST - ACK变为CLOSED(关闭状态)。

(三)四次挥手的作用

  • 确保数据传输的完整性:在四次挥手的过程中,通信双方都发送了结束请求和确认报文段,这可以确保在关闭连接之前,双方都已经完成了数据的发送和接收。
  • 防止连接被错误地关闭:通过多次的确认过程,可以避免由于网络延迟或丢包等原因导致连接被错误地关闭。
相关推荐
青瓦梦滋8 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
zhang133830890759 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻9 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
IpdataCloud11 小时前
批量查IP的API接口怎么选?免费API配额瓶颈与离线库本地批量方案实测
网络·网络协议·tcp/ip
ITyunwei098713 小时前
售后夜间值守怎么落地:从告警到交接的工单系统配置笔记
网络
Smoothcloud润云13 小时前
GPU远程纳管安全吗?最小权限、网络边界与日志审计实战
服务器·网络·人工智能·安全·gpu算力·gpu
ai大模型-探索者13 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
木子欢儿14 小时前
Debian 13 + vsftpd 搭建FTP服务
linux·服务器·前端·网络·debian
达~熊迪14 小时前
IP 分配前核查:把在线状态和使用登记一起看
服务器·网络·tcp/ip
西索斯coding15 小时前
Qwen3-Max 与 Qwen-Plus:60 个真实修复任务评测方案
大数据·网络·算法·ai