TCP¶
TCP¶
状态机¶
TCP 各种状态的标记¶
- LISTEN: 监听状态,服务器正在等待建立连接。
- SYN_SENT: 发送了一个连接请求,等待对方的确认。
- SYN_RECEIVED: 接收到连接请求,正在等待回应。
- ESTABLISHED: 连接已经建立,双方可以传输数据。
- FIN_WAIT_1: 主动关闭连接,发送了关闭请求,等待对方关闭确认。
- FIN_WAIT_2: 接收到关闭请求,正在等待对方的关闭确认。
- CLOSE_WAIT: 等待对方关闭连接。
- LAST_ACK: 最后一个关闭确认,等待最后一次确认连接已关闭。
- TIME_WAIT: 等待足够的时间,保证对方接收到连接关闭的确认。
- CLOSED: 连接已经关闭或未建立。
TCP 正常连接建立和终止所对应的状态
| 三次握手: | 发送的消息 | 消息的功能 |
|---|---|---|
| 第一阶段 | 客户端发送SYN | 建立连接请求,携带初始序列号 |
| 第二阶段 | 服务器发送SYN+ACK | 确认客户端请求,同时建立自己的连接请求 |
| 第三阶段 | 客户端发送ACK | 确认服务器的连接请求,完成连接的建立 |
| 四次挥手: | 发送的消息 | 消息的功能 |
|---|---|---|
| 第一阶段 | 客户端发送FIN | 请求断开连接 |
| 第二阶段 | 服务器发送ACK | 确认客户端的断开请求 |
| 第三阶段 | 服务器发送FIN | 请求断开连接 |
| 第四阶段 | 客户端发送ACK | 确认服务器的断开请求,完成连接的断开 |
- 序列号:在建立连接时由内核生成的随机数作为其初始值,通过 SYN 报文传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
- 确认号:指下一次「期望」收到的数据的序列号,发送端收到接收方发来的 ACK 确认报文以后,就可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
- 控制位:用来标识 TCP 报文是什么类型的报文,比如是 SYN 报文、数据报文、ACK 报文,FIN 报文等。
TCP头部中所有常见标志¶
| 标志 (Flag) | 作用 (Description) |
|---|---|
| URG | 表示紧急指针字段有效。当设置此标志时,紧急数据存在,并且紧急指针字段指定了紧急数据的结束位置。紧急数据优先于其他数据传输。 |
| ACK | 表示确认字段有效。当设置此标志时,确认号字段包含有效的确认序列号。用于确认已接收到的数据,确认号字段指定了下一个期望接收的数据序列号。 |
| PSH | 表示接收方应立即将接收到的数据推送给应用层,而不等待TCP缓冲区满或其他数据。用于提高数据传输的效率和实时性。 |
| RST | 用于重置连接。当设置此标志时,表示TCP连接存在问题或错误,需要立即终止连接并重置。 |
| SYN | 用于建立连接。当设置此标志时,表示这是一个连接请求或连接响应,并且序列号字段包含了初始序列号。 |
| FIN | 用于释放连接。当设置此标志时,表示发送方已完成数据传输,并希望释放连接。 |
| RES | 保留位,未使用。 |
| ACC | 表示TCP连接的接受状态。当设置此标志时,表示连接请求已被接受。此标志在TCP三次握手过程中使用。 |
| CON | 表示TCP连接已建立。当设置此标志时,表示连接已成功建立并进入连接状态。 |
| ECN | 显式拥塞通知。当设置此标志时,表示TCP连接支持ECN(显式拥塞通知)功能,并且接收方已收到拥塞通知。 |
三次挥手(延迟确认机制)¶
当被动关闭方(上图的服务端)在 TCP 挥手过程中,「没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。
当发送没有携带数据的 ACK,它的网络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报文。
为了解决 ACK 传输效率低问题,所以就衍生出了 TCP 延迟确认。 TCP 延迟确认的策略:
- 当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方
- 当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送
- 如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK