TCP协议
TCP简介
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,是Internet协议族的核心协议之一。
TCP特点
- 面向连接:通信前需要建立连接
- 可靠传输:通过序列号、确认应答、重传机制等保证可靠性
- 字节流:将应用数据视为字节流,无消息边界
- 流量控制:通过滑动窗口机制控制发送速率
- 拥塞控制:根据网络状况调整发送速率
- 全双工:支持双向通信
TCP头部结构
TCP头部包含以下字段:
| 字段 | 长度(位) | 描述 |
|---|---|---|
| 源端口 | 16 | 发送方端口号 |
| 目的端口 | 16 | 接收方端口号 |
| 序列号 | 32 | 发送数据的第一个字节的序号 |
| 确认号 | 32 | 期望收到的下一个字节的序号 |
| 数据偏移 | 4 | TCP头部长度(以4字节为单位) |
| 保留 | 6 | 保留字段 |
| 标志位 | 6 | SYN、ACK、FIN、RST、PSH、URG |
| 窗口大小 | 16 | 接收窗口大小 |
| 校验和 | 16 | 头部和数据的校验和 |
| 紧急指针 | 16 | 紧急数据的偏移量 |
| 选项 | 可变 | 可选字段 |
TCP三次握手
TCP三次握手是建立连接的过程,确保双方都了解对方的发送和接收能力。
三次握手过程
第一次握手(SYN=1, seq=x):
- 客户端发送SYN包(同步序列编号)
- 进入SYN_SENT状态
第二次握手(SYN=1, ACK=1, seq=y, ack=x+1):
- 服务器收到SYN包,发送SYN+ACK包
- 进入SYN_RECV状态
第三次握手(ACK=1, seq=x+1, ack=y+1):
- 客户端收到SYN+ACK包,发送ACK包
- 进入ESTABLISHED状态
- 服务器收到ACK包,进入ESTABLISHED状态
为什么需要三次握手?
- 防止过期连接:避免过期的连接请求报文突然到达服务器,导致错误
- 同步序列号:确保双方的序列号同步
- 确认接收能力:确保双方都有接收对方数据的能力
TCP四次挥手
TCP四次挥手是关闭连接的过程,确保双方都完成了数据传输。
四次挥手过程
第一次挥手(FIN=1, seq=u):
- 客户端发送FIN包,请求关闭连接
- 进入FIN_WAIT_1状态
第二次挥手(ACK=1, seq=v, ack=u+1):
- 服务器收到FIN包,发送ACK包
- 进入CLOSE_WAIT状态
第三次挥手(FIN=1, ACK=1, seq=w, ack=u+1):
- 服务器发送FIN包,请求关闭连接
- 进入LAST_ACK状态
第四次挥手(ACK=1, seq=u+1, ack=w+1):
- 客户端收到FIN包,发送ACK包
- 进入TIME_WAIT状态(等待2MSL)
- 服务器收到ACK包,进入CLOSED状态
- 客户端等待2MSL后,进入CLOSED状态
为什么需要四次挥手?
- 全双工通信:TCP是全双工通信,需要双向关闭
- 确保数据传输完成:服务器可能还有数据需要发送
- TIME_WAIT状态:等待网络中可能的延迟报文过期
TCP状态机
客户端状态
- CLOSED:初始状态
- SYN_SENT:发送SYN后等待ACK
- ESTABLISHED:连接已建立
- FIN_WAIT_1:发送FIN后等待ACK
- FIN_WAIT_2:收到ACK后等待FIN
- TIME_WAIT:等待2MSL后关闭
服务器状态
- CLOSED:初始状态
- LISTEN:监听连接请求
- SYN_RECV:收到SYN后等待ACK
- ESTABLISHED:连接已建立
- CLOSE_WAIT:收到FIN后等待应用关闭
- LAST_ACK:发送FIN后等待ACK
TCP流量控制
滑动窗口
TCP使用滑动窗口机制进行流量控制,通过窗口大小调整发送速率,避免接收方缓冲区溢出。
- 发送窗口:发送方可以发送的字节范围
- 接收窗口:接收方可以接收的字节范围
- 窗口大小:通过ACK报文的窗口字段通知对方
流量控制过程
- 接收方在ACK报文中设置窗口大小
- 发送方根据窗口大小调整发送速率
- 当接收方缓冲区满时,窗口大小设置为0
- 当接收方缓冲区有空间时,发送窗口更新报文
TCP拥塞控制
拥塞控制算法
- 慢启动:初始窗口较小,指数增长
- 拥塞避免:窗口线性增长
- 快重传:收到重复ACK后立即重传
- 快恢复:拥塞后窗口减半,线性增长
BBR拥塞控制
- 基于带宽和延迟的拥塞控制算法
- 提高了网络吞吐量
- 减少了延迟
- 适用于高速网络
TCP与UDP的区别
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 传输单位 | 字节流 | 报文 |
| 首部开销 | 20-60字节 | 8字节 |
| 速度 | 较慢 | 较快 |
| 拥塞控制 | 有 | 无 |
| 流量控制 | 有 | 无 |
| 适用场景 | Web浏览、文件传输 | 视频通话、实时游戏 |
TCP应用场景
- Web浏览:需要可靠传输
- 电子邮件:需要可靠传输
- 文件传输:需要可靠传输
- 远程登录:需要可靠传输
UDP应用场景
- 视频通话:实时性要求高,允许少量丢包
- 实时游戏:实时性要求高,允许少量丢包
- DNS查询:数据量小,实时性要求高
- SNMP:网络管理,数据量小
面试常见问题
1. TCP三次握手的过程?
- 客户端发送SYN包(SYN=1, seq=x)
- 服务器发送SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1)
- 客户端发送ACK包(ACK=1, seq=x+1, ack=y+1)
2. TCP四次挥手的过程?
- 客户端发送FIN包(FIN=1, seq=u)
- 服务器发送ACK包(ACK=1, seq=v, ack=u+1)
- 服务器发送FIN包(FIN=1, ACK=1, seq=w, ack=u+1)
- 客户端发送ACK包(ACK=1, seq=u+1, ack=w+1)
3. 为什么需要三次握手?
- 防止过期连接
- 同步序列号
- 确认接收能力
4. 为什么需要四次挥手?
- 全双工通信需要双向关闭
- 确保数据传输完成
- TIME_WAIT状态等待延迟报文过期
5. TCP和UDP的区别?
- TCP:面向连接,可靠,字节流,有拥塞控制,速度较慢
- UDP:无连接,不可靠,报文,无拥塞控制,速度较快
6. 什么是滑动窗口?
滑动窗口是TCP的流量控制机制,通过窗口大小调整发送速率,避免接收方缓冲区溢出。
7. 什么是拥塞控制?
拥塞控制是TCP的机制,根据网络状况调整发送速率,避免网络拥塞。
8. 什么是TIME_WAIT状态?
TIME_WAIT是TCP关闭连接时的状态,等待2MSL后关闭,用于等待网络中可能的延迟报文过期。
9. 什么是慢启动?
慢启动是TCP的拥塞控制算法,初始窗口较小,指数增长,避免网络拥塞。
10. 什么是快重传?
快重传是TCP的机制,收到重复ACK后立即重传,不需要等待超时。
通过理解TCP协议的各种特性和机制,可以更好地理解网络通信的原理。