概述
TCP/IP 是网络使用中最基本的通信协议,它规定了互联网中进行通信的标准和方法。其中它包含TCP、UDP、SMTP、IP 等绝大多数协议,因为 TCP、IP 协议最具代表,因此才命名为 TCP/IP 协议。本篇博客我就来简单整理 TCP 协议相关知识
TCP
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本篇博客我打算分以下几个模块介绍 TCP 协议:
- TCP 协议的结构
- 三次握手与四次挥手
- TCP 协议如何保证可靠性
- TCP 协议如何保证性能
- TCP 常见问题
- 总结
TCP 协议的结构
TCP 的结构如下图所示:
其中数据经过传输层会被封装为这种格式:
简单来说,根据 OSI 7层协议,数据从顶层应用层到底层物理层,每一层都会添加部分标识,最终拼装成实际发送的数据。接受端接受到数据后,自底向上经过层层解析后,最终将数据输出给对应的上层应用。关于这块的详细内容后面我们出博客专门介绍,本篇主要聚焦到 TCP 协议内容上。
下面我们主要看 TCP 各结构模块的实际功能:
- 源端口、目的端口:记录数据从哪个端口发送到哪个端口(端口就可以对应到上层应用),各占两字节。
- 序号(seq):TCP 传输过程中,每个字节都包含对应的序号。这里记录 TCP 数据包第一个字节对应的序号,占四字节。
- 确认号(ack):是期望收到对方的下一个报文段数据的第一个字节的序号,占四字节。
- 数据偏移:记录具体传输数据起始首部到 TCP 报文段首部的距离,占4 bit。
- 保留:顾名思义,保留为以后使用,占6 bit。
- URG:标识该数据包是否包含紧急数据,如果该值为1,说明此数据为紧急数据,需要优先传输(提高优先级)。
- ACK:标识确认号是否有效,如果该值为1,说明确认号有效。
- PSH:标识数据是否需要快速处理,如果该值为1,提示消息接收端迅速将消息从缓冲区读走。
- RST:标识连接是否需要重新建立,如果该值为1,说明 TCP 连接出现异常,需要断开连接后重连。
- SYN:标识连接建立请求,如果该值为1,表示该数据包是一个连接请求或连接确定请求。
- FIN:标识连接断开请求,如果该值为1,表示发送方数据已发送完毕,提示服务端断开连接。
- 窗口:主要控制对方发送的数据量,通过该字段告诉另一端自己所能接收的数据上限。
- 校验和:校验 TCP报文头和数据是否正常。
- 紧急指针:标识哪部分数据属于紧急数据
- 选项:用于保存附加信息
- 填充:填充数据,确保数据报头的长度是四字节的整数倍。
三次握手与四次挥手
TCP 规定在客户端和服务端建立连接后进行数据交互,其中建立连接需要经过三次握手:
三次握手建立的连接,一方必须是主动打开,另一方被动打开。下面我们假设主动打开的一方是客户端,被动打开的一方为服务端:
-
开始三次握手前,客户端主动结束 CLOSE 状态。服务端被动打开,结束 CLOSE 状态,进入 LISTEN 状态
-
客户端向服务端发送报文段(SYN = 1,seq = X),随后客户端进入 SYN-SENT 状态
- SYN = 1:表示该数据包是建立连接请求
- seq = X:客户端发送消息的序号
-
服务端收到客户端的报文后,结束 LISTEN 状态并返回报文段(SYN = 1,ACK = 1,seq = Y,ack = X + 1)发送完毕后进入 SYN-RCVD 状态。
- SYN = 1:表示该数据包是建立连接请求
- ACK = 1:表示服务端返回消息的确认号有效
- seq = Y:服务端发送消息的序号
- ack = X + 1:表示服务端收到 seq = X 的报文段,并将它的值加一作为自己的确认号返回
-
客户端收到服务端回复的报文后确定从客户端到服务端的传