目录
- 一、回顾一下TCP包头
- 二、连接的建立——“三次握手”
- 三、连接的建立——“四次挥手”
- 保活计时器
一、回顾一下TCP包头
源端口号(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 连接建立错误。
-
B 的 TCP 服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。
-
A 的 TCP 向 B 主动发出连接请求报文段,其包头中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
注意:TCP规定,SYN 报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。 -
B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1,自己选择的序号 seq = y。
这个报文段也不能携带数据,但同样要消耗掉一个序号。 -
A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。
A 的 TCP 通知上层应用进程,连接已经建立。
TCP 标准规定:ACK 报文段可以携带数据。
但如果不携带数据,则不消耗序号。下一个数据报文段的序号仍是 seq = x + 1。 -
B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。双方可以开始数据传送。
三、连接的建立——“四次挥手”
TCP 连接释放过程比较复杂。
数据传输结束后,通信的双方都可释放连接。
TCP 连接释放过程是四报文握手。
-
A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。
A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。
TCP规定:FIN 报文段即使不携带数据,也消耗掉一个序号。 -
B 发出确认,ACK=1,确认号 ack = u+1,这个报文段的序号 seq = v。
TCP 服务器进程通知高层应用进程。
从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭 (half-close) 状态。B 若发送数据,A 仍要接收。 -
若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
FIN=1,ACK=1,确认号 ack = u+1。 -
A 收到连接释放报文段后,必须发出确认。
ACK=1,确认号 ack=w+1,自己的序号 seq = u + 1
保活计时器
-
用来防止在 TCP 连接出现长时期空闲。
-
通常设置为 2 小时 。
-
若服务器过了 2 小时还没有收到客户的信息,它就发送探测报文段。
-
若发送了 10 个探测报文段(每一个相隔 75 秒)还没有响应,就假定客户出了故障,因而就终止该连接。