TCP/IP协议是构成Internet基础的最核心协议,该协议由网络层的IP协议和传输层的TCP协议共同组成。简单来说,TCP协议负责监控传输过程中的问题,一旦发现问题,会立即发送信号请求重传,确保所有数据都能安全无误地送达目的地。而IP协议则为连接到Internet的每一台设备分配一个独特的地址。
TCP报文首部:
TCP(传输控制协议)报文首部是TCP协议的核心部分,包含了控制数据传输的关键信息。TCP报文首部的长度通常为20字节 (无选项时),但如果有选项字段,最大可扩展到60字节。以下是TCP报文首部的详细格式:
TCP报文首部格式
TCP报文首部由以下字段组成,按顺序排列:
字段名称 | 长度(比特) | 描述 |
---|---|---|
源端口号 | 16 | 发送方的端口号,用于标识发送应用程序。 |
目的端口号 | 16 | 接收方的端口号,用于标识接收应用程序。 |
序列号(Seq) | 32 | 当前报文段数据的第一个字节的序列号,用于数据排序和重组。 |
确认号(Ack) | 32 | 期望收到的下一个字节的序列号,用于确认已收到的数据。 |
数据偏移 | 4 | TCP首部的长度(以4字节为单位),用于确定数据部分的起始位置。 |
保留字段 | 6 | 保留供未来使用,必须设置为0。 |
控制位(Flags) | 6 | 用于控制TCP连接和传输的标志位,包括URG、ACK、PSH、RST、SYN、FIN。 |
窗口大小 | 16 | 接收方的接收窗口大小,用于流量控制。 |
校验和 | 16 | 用于校验TCP报文段(包括首部和数据)的完整性。 |
紧急指针 | 16 | 当URG标志位为1时有效,指示紧急数据的结束位置。 |
选项(可选) | 0-320 | 可选字段,用于扩展TCP功能(如最大段大小MSS、窗口缩放因子等)。 |
填充 | 可变 | 确保TCP首部长度是4字节的倍数。 |
控制位(Flags)详解
控制位是TCP报文首部中的重要部分,用于控制连接和传输行为。每个标志位占1比特,具体含义如下:
标志位 | 名称 | 描述 |
---|---|---|
URG | 紧急指针有效 | 当URG=1时,表示紧急数据存在,紧急指针字段有效。 |
ACK | 确认号有效 | 当ACK=1时,表示确认号字段有效,用于确认已收到的数据。 |
PSH | 推送功能 | 当PSH=1时,要求接收方尽快将数据交给应用程序,而不是缓存。 |
RST | 重置连接 | 当RST=1时,表示连接出现严重错误,需要强制断开连接。 |
SYN | 同步序列号 | 当SYN=1时,表示请求建立连接,用于三次握手。 |
FIN | 结束连接 | 当FIN=1时,表示发送方没有数据要发送了,用于四次挥手断开连接。 |
选项字段(可选)
选项字段用于扩展TCP功能,常见的选项包括:
-
最大段大小(MSS):协商TCP报文段的最大长度。
-
窗口缩放因子:用于扩大窗口大小的范围。
-
时间戳:用于计算往返时间(RTT)和防止序列号回绕。
TCP报文首部示例
以下是一个TCP报文首部的示例(无选项字段):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口号 | 目的端口号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号(Seq) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号(Ack) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 | 保留 | URG | ACK | PSH | RST | SYN | FIN | 窗口大小 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和 | 紧急指针 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP协议的三次握手和四次挥手:
TCP(传输控制协议)通过三次握手 建立连接,通过四次挥手断开连接,确保数据传输的可靠性。以下是详细解释:
三次握手(建立连接)
三次握手用于客户端和服务器之间建立TCP连接,确保双方都能正常收发数据。
-
第一次握手(SYN):
-
客户端向服务器发送一个SYN(同步)报文,并随机生成一个初始序列号(Seq = x)。
-
客户端进入
SYN_SENT
状态。 -
目的:客户端请求建立连接。
-
-
第二次握手(SYN + ACK):
-
服务器收到SYN报文后,向客户端发送一个SYN + ACK报文:
-
确认客户端的SYN(ACK = x + 1)。
-
同时发送自己的SYN报文,随机生成一个初始序列号(Seq = y)。
-
-
服务器进入
SYN_RECEIVED
状态。 -
目的:服务器确认客户端的请求,并发送自己的连接请求。
-
-
第三次握手(ACK):
-
客户端收到服务器的SYN + ACK报文后,向服务器发送一个ACK(确认)报文(ACK = y + 1)。
-
客户端进入
ESTABLISHED
状态。 -
服务器收到ACK报文后,也进入
ESTABLISHED
状态。 -
目的:客户端确认服务器的连接请求。
-
总结:三次握手确保双方都能正常收发数据,并同步初始序列号。
四次挥手(断开连接)
四次挥手用于客户端和服务器之间断开TCP连接,确保数据传输完整。
-
第一次挥手(FIN):
-
客户端(或服务器)发送一个FIN(结束)报文(Seq = u),表示自己没有数据要发送了。
-
发送方进入
FIN_WAIT_1
状态。 -
目的:请求关闭连接。
-
-
第二次挥手(ACK):
-
接收方收到FIN报文后,发送一个ACK报文(ACK = u + 1),确认收到关闭请求。
-
接收方进入
CLOSE_WAIT
状态。 -
发送方收到ACK后,进入
FIN_WAIT_2
状态。 -
目的:接收方确认关闭请求,但可能还有数据要发送。
-
-
第三次挥手(FIN):
-
接收方完成数据发送后,发送一个FIN报文(Seq = v),表示自己也没有数据要发送了。
-
接收方进入
LAST_ACK
状态。 -
目的:接收方请求关闭连接。
-
-
第四次挥手(ACK):
-
发送方收到FIN报文后,发送一个ACK报文(ACK = v + 1),确认收到关闭请求。
-
发送方进入
TIME_WAIT
状态,等待一段时间(2MSL)后关闭连接。 -
接收方收到ACK后,立即关闭连接。
-
目的:发送方确认接收方的关闭请求。
-
总结:四次挥手确保双方都能安全关闭连接,避免数据丢失。
为什么需要三次握手和四次挥手?
-
三次握手:确保双方都能正常收发数据,避免因网络延迟导致的无效连接。
-
四次挥手:确保双方都完成数据传输后再关闭连接,避免数据丢失。
示意图
三次握手
客户端 -> SYN -> 服务器
客户端 <- SYN+ACK <- 服务器
客户端 -> ACK -> 服务器
四次挥手
客户端 -> FIN -> 服务器
客户端 <- ACK <- 服务器
客户端 <- FIN <- 服务器
客户端 -> ACK -> 服务器

** 注:seq** :"sequance"序列号;ack :"acknowledge"确认号;SYN :"synchronize"请求同步标志;;ACK :"acknowledge"确认标志"; FIN:"Finally"结束标志。