Skip to content

TCP协议

TCP简介

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,是Internet协议族的核心协议之一。

TCP特点

  • 面向连接:通信前需要建立连接
  • 可靠传输:通过序列号、确认应答、重传机制等保证可靠性
  • 字节流:将应用数据视为字节流,无消息边界
  • 流量控制:通过滑动窗口机制控制发送速率
  • 拥塞控制:根据网络状况调整发送速率
  • 全双工:支持双向通信

TCP头部结构

TCP头部包含以下字段:

字段长度(位)描述
源端口16发送方端口号
目的端口16接收方端口号
序列号32发送数据的第一个字节的序号
确认号32期望收到的下一个字节的序号
数据偏移4TCP头部长度(以4字节为单位)
保留6保留字段
标志位6SYN、ACK、FIN、RST、PSH、URG
窗口大小16接收窗口大小
校验和16头部和数据的校验和
紧急指针16紧急数据的偏移量
选项可变可选字段

TCP三次握手

TCP三次握手是建立连接的过程,确保双方都了解对方的发送和接收能力。

三次握手过程

  1. 第一次握手(SYN=1, seq=x)

    • 客户端发送SYN包(同步序列编号)
    • 进入SYN_SENT状态
  2. 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

    • 服务器收到SYN包,发送SYN+ACK包
    • 进入SYN_RECV状态
  3. 第三次握手(ACK=1, seq=x+1, ack=y+1)

    • 客户端收到SYN+ACK包,发送ACK包
    • 进入ESTABLISHED状态
    • 服务器收到ACK包,进入ESTABLISHED状态

为什么需要三次握手?

  • 防止过期连接:避免过期的连接请求报文突然到达服务器,导致错误
  • 同步序列号:确保双方的序列号同步
  • 确认接收能力:确保双方都有接收对方数据的能力

TCP四次挥手

TCP四次挥手是关闭连接的过程,确保双方都完成了数据传输。

四次挥手过程

  1. 第一次挥手(FIN=1, seq=u)

    • 客户端发送FIN包,请求关闭连接
    • 进入FIN_WAIT_1状态
  2. 第二次挥手(ACK=1, seq=v, ack=u+1)

    • 服务器收到FIN包,发送ACK包
    • 进入CLOSE_WAIT状态
  3. 第三次挥手(FIN=1, ACK=1, seq=w, ack=u+1)

    • 服务器发送FIN包,请求关闭连接
    • 进入LAST_ACK状态
  4. 第四次挥手(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报文的窗口字段通知对方

流量控制过程

  1. 接收方在ACK报文中设置窗口大小
  2. 发送方根据窗口大小调整发送速率
  3. 当接收方缓冲区满时,窗口大小设置为0
  4. 当接收方缓冲区有空间时,发送窗口更新报文

TCP拥塞控制

拥塞控制算法

  1. 慢启动:初始窗口较小,指数增长
  2. 拥塞避免:窗口线性增长
  3. 快重传:收到重复ACK后立即重传
  4. 快恢复:拥塞后窗口减半,线性增长

BBR拥塞控制

  • 基于带宽和延迟的拥塞控制算法
  • 提高了网络吞吐量
  • 减少了延迟
  • 适用于高速网络

TCP与UDP的区别

特性TCPUDP
连接面向连接无连接
可靠性可靠不可靠
传输单位字节流报文
首部开销20-60字节8字节
速度较慢较快
拥塞控制
流量控制
适用场景Web浏览、文件传输视频通话、实时游戏

TCP应用场景

  • Web浏览:需要可靠传输
  • 电子邮件:需要可靠传输
  • 文件传输:需要可靠传输
  • 远程登录:需要可靠传输

UDP应用场景

  • 视频通话:实时性要求高,允许少量丢包
  • 实时游戏:实时性要求高,允许少量丢包
  • DNS查询:数据量小,实时性要求高
  • SNMP:网络管理,数据量小

面试常见问题

1. TCP三次握手的过程?

  1. 客户端发送SYN包(SYN=1, seq=x)
  2. 服务器发送SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1)
  3. 客户端发送ACK包(ACK=1, seq=x+1, ack=y+1)

2. TCP四次挥手的过程?

  1. 客户端发送FIN包(FIN=1, seq=u)
  2. 服务器发送ACK包(ACK=1, seq=v, ack=u+1)
  3. 服务器发送FIN包(FIN=1, ACK=1, seq=w, ack=u+1)
  4. 客户端发送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协议的各种特性和机制,可以更好地理解网络通信的原理。

好好学习,天天向上