TCP连接管理(三次握手,四次挥手)

目录

  • 一、回顾一下TCP包头
  • 二、连接的建立——“三次握手”
  • 三、连接的建立——“四次挥手”
    • 保活计时器

一、回顾一下TCP包头

TCP连接管理(三次握手,四次挥手)_第1张图片

源端口号(Source Port):16 位字段,表示发送方的端口号。

目的端口号(Destination Port):16 位字段,表示接收方的端口号。

序列号(Sequence Number):32 位字段,表示发送方发送的字节流的序列号。用于实现数据的可靠传输和顺序传递。

确认号(Acknowledgment Number):32 位字段,表示接收方期望接收的下一个字节的序列号。用于实现数据的可靠传输和确认。

数据偏移(Data Offset):4 位字段,表示 TCP 首部的长度,以 32 位的字为单位。最大值为 15,对应的首部长度为 60 字节。

保留(Reserved):6 位字段,保留供将来使用,目前置为 0。

U/A/P/R/S/F:各占 1 位的标志位。
U:紧急(Urgent)标志位,表示紧急指针字段是否有效。
A:确认(Acknowledgment)标志位,表示确认号字段是否有效。
P:推送(Push)标志位,表示接收方应该尽快将数据交给应用层。
R:复位(Reset)标志位,用于中断连接。
S:同步(Synchronize)标志位,用于建立连接 三次握手。
F:终止(Finish)标志位,用于释放连接 四次挥手。
窗口大小(Window Size):16 位字段,表示接收方的窗口大小,用于流量控制。

校验和(Checksum):16 位字段,用于校验 TCP 首部和数据的完整性。

紧急指针(Urgent Pointer):16 位字段,仅在紧急标志位为 1 时有效,表示紧急数据的边界。

TCP 报文段的首部长度为 20 字节(不包括选项字段)。首部长度可变取决于选项字段的存在与长度。

二、连接的建立——“三次握手”

TCP 建立连接的过程叫做握手。
采用三报文握手:在客户和服务器之间交换三个 TCP 报文段,以防止已失效的连接请求报文段突然又传送到了,因而产生 TCP 连接建立错误。

TCP连接管理(三次握手,四次挥手)_第2张图片

  1. B 的 TCP 服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。

  2. A 的 TCP 向 B 主动发出连接请求报文段,其包头中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
    注意:TCP规定,SYN 报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。

  3. B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
    B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1,自己选择的序号 seq = y。
    这个报文段也不能携带数据,但同样要消耗掉一个序号。

  4. A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。
    A 的 TCP 通知上层应用进程,连接已经建立。
    TCP 标准规定:ACK 报文段可以携带数据。
    但如果不携带数据,则不消耗序号。下一个数据报文段的序号仍是 seq = x + 1。

  5. B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。双方可以开始数据传送。

三、连接的建立——“四次挥手”

TCP 连接释放过程比较复杂。
数据传输结束后,通信的双方都可释放连接。
TCP 连接释放过程是四报文握手。

TCP连接管理(三次握手,四次挥手)_第3张图片

  1. A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。
    A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。
    TCP规定:FIN 报文段即使不携带数据,也消耗掉一个序号。

  2. B 发出确认,ACK=1,确认号 ack = u+1,这个报文段的序号 seq = v。
    TCP 服务器进程通知高层应用进程。
    从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭 (half-close) 状态。B 若发送数据,A 仍要接收。

  3. 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
    FIN=1,ACK=1,确认号 ack = u+1。

  4. A 收到连接释放报文段后,必须发出确认。
    ACK=1,确认号 ack=w+1,自己的序号 seq = u + 1

保活计时器

  1. 用来防止在 TCP 连接出现长时期空闲。

  2. 通常设置为 2 小时 。

  3. 若服务器过了 2 小时还没有收到客户的信息,它就发送探测报文段。

  4. 若发送了 10 个探测报文段(每一个相隔 75 秒)还没有响应,就假定客户出了故障,因而就终止该连接。

你可能感兴趣的:(tcp/ip,网络,网络协议)