> 文档中心 > 图解TCP协议的三次握手和四次挥手

图解TCP协议的三次握手和四次挥手

图解TCP协议的三次握手和四次挥手

  • 前言
  • TCP基本概念
  • TCP 报文段的首部格式
  • TCP 的连接建立(三次握手)
  • TCP 的连接释放(四次挥手)
    • 为什么要四次挥手
  • 参考文献

前言

本文是阐述了个人对TCP协议的三次握手和四次挥手的理解,由于水平有限,难免出现错漏,敬请批评改正。

TCP基本概念

  • TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。
  • 主要特点
    • TCP 是面向连接的运输层协议。
    • 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的**(一对一)**。
    • TCP 提供可靠交付的服务
    • TCP 提供全双工通信
    • TCP 连接是一条虚连接而不是一条真正的物理连接。
    • 面向字节
      • TCP 中的“流”(stream) :流入流出进程字节序列。
      • “面向字节流”:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
        在这里插入图片描述
        在这里插入图片描述

TCP 报文段的首部格式

在这里插入图片描述

  • 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

  • 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号seq=301,最后一个字节的序号seq=400

  • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 若确认号ack=N,则表明:到序号N-1为止的所有数据都已正确收到。

  • 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。

  • 保留字段——占 6 位,保留为今后使用,但目前应置为 0。

  • 紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

  • 确认 ACK —— 只有当 ACK =1 时确认号字段才有效。当 ACK =0 时,确认号无效。

  • 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

  • 复位 RST (ReSeT) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

  • 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。

  • 终止 FIN (FINish) —— 用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

  • 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。

  • 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

  • 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

  • 选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”

TCP 的连接建立(三次握手)

  • TCP 建立连接的过程叫做握手。
  • 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手,即三次握手
    在这里插入图片描述
    如上图所示,虽然在我们正常的网聊中,觉得这些是废话,但是,不可否认的是,这样就确保了,接下来,两个人的聊天,互相都能及时收到以及及时反馈,相当于建立起了一个连接,提供可靠交付的服务。
  • 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误
  • 如果不三次握手,可能会出现一些情况。例如,
    在这里插入图片描述

在这里插入图片描述

  • B的 TCP 服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。
  • A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
  • B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
  • B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1,自己选择的序号 seq = y。
  • A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。
  • A 的 TCP 通知上层应用进程,连接已经建立。
  • B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。

TCP 的连接释放(四次挥手)

  • TCP 连接释放过程比较复杂。
  • 数据传输结束后,通信的双方都可释放连接。
  • TCP 连接释放过程是四次挥手,也有人叫四报文握手或四次握手。
    在这里插入图片描述

在这里插入图片描述

  • 数据传输结束后,通信的双方都可释放连接。
  • 现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。
  • A 把连接释放报文段首部的FIN = 1,其序号seq = u,等待 B 的确认。
  • B 发出确认,确认号 ack = u+1,而这个报文段自己的序号 seq = v。
  • TCP 服务器进程通知高层应用进程。
  • 从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。
  • 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
  • A 收到连接释放报文段后,必须发出确认。
  • 在确认报文段中ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1。

为什么要四次挥手

服务器B收到客户端A的 FIN 报文时,先回一个 ACK 应答报文,而服务端B可能还有数据需要处理和发送(服务端B的 ACK 和 FIN 一般都会分开发送,故比三次握手导致多了一次),等服务端B不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
事实上,是可以三次挥手的,即把ACK和FIN合并到一起发送,但一般不这么做。

参考文献

[1] 谢希仁. 计算机网络. 7版. 北京:电子工业出版社,2017