飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

认识 TCP 协议与传输层定位

TCP 是什么

想象你给朋友寄一封挂号信:邮局会记录每一封信的编号,确认对方签收后才算送达;如果信丢了,邮局会自动重寄;如果顺序乱了,邮局会帮你按编号排好。TCP(Transmission Control Protocol,传输控制协议)干的就是这件事——在不可靠的 IP 网络上,提供可靠的、面向连接的、基于字节流的传输服务。

与 IP 的"尽力而为"不同,TCP 承诺:

  • 可靠交付:数据不丢、不错、不乱序
  • 面向连接:通信前先"打电话"确认双方在线
  • 全双工:双方可以同时说话和听
  • 字节流:不保留消息边界,像水管一样连续流动

TCP 在协议栈中的位置

TCP 位于传输层(OSI 第四层),承上启下:

  • 向上:通过端口号区分不同应用进程(HTTP 走 80 端口,SSH 走 22 端口)
  • 向下:把数据交给 IP 层,由 IP 负责寻址和路由

关键概念:五元组唯一标识一条 TCP 连接

{源IP, 源端口, 目的IP, 目的端口, 协议类型=TCP}

例如你访问百度:{192.168.1.10:54321, 110.242.68.3:443, TCP},这条连接在全球互联网中是唯一的。

TCP vs UDP:两种哲学

特性TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠(确认+重传)不可靠(尽力而为)
顺序保证按序交付不保证
流量控制有(滑动窗口)无
拥塞控制有(cwnd/ssthresh)无
头部开销20~60 字节8 字节
传输效率较低(控制开销大)极高
适用场景文件传输、网页、邮件视频直播、DNS、游戏

生活例子:

  • TCP 像打电话:先拨号确认对方在,说一句等对方"嗯"一声确认,说乱了对方会提醒重说
  • UDP 像发短信:发出去就不管了,对方收没收到、顺序对不对都不保证,但速度快

TCP 的核心设计思想

TCP 的设计可以概括为一句话:"在不可靠的网络上构建可靠的传输"。它通过四大机制实现:

  1. 连接管理:三次握手建立连接,四次挥手释放连接,维护连接状态机
  2. 可靠传输:序列号 + 累积确认 + 超时重传 + 快速重传
  3. 流量控制:滑动窗口,防止发送方淹没接收方
  4. 拥塞控制:慢启动 + 拥塞避免 + 快重传 + 快恢复,防止淹没网络

端口号:传输层的服务访问点

端口号是 16 位无符号整数(0~65535),分为三类:

范围名称说明
0~1023熟知端口(Well-Known)IANA 统一分配,如 80(HTTP)、443(HTTPS)、22(SSH)
1024~49151注册端口(Registered)需向 IANA 注册,如 3306(MySQL)、8080(代理)
49152~65535动态/私有端口(Dynamic)客户端临时使用,如浏览器访问网页时的源端口

生活例子:IP 地址是"小区地址",端口号是"门牌号"。快递送到小区(IP)后,还需要门牌号(端口)才能找到具体住户(应用进程)。

本篇小结

  • TCP 提供可靠、面向连接、全双工的字节流服务
  • 五元组 {源IP, 源端口, 目的IP, 目的端口, TCP} 唯一标识连接
  • TCP 四大机制:连接管理、可靠传输、流量控制、拥塞控制
  • UDP 无连接、不可靠、低开销,适合实时场景
  • 熟知端口 0~1023(80/443/22),动态端口 49152~65535

动手实践

  1. 查看本机 TCP 连接:

    # Linux
    ss -tunlp
    netstat -tn
    
    # Windows
    netstat -an | findstr TCP
    
  2. 观察浏览器访问网页时的五元组:

    # 找到浏览器进程对应的连接
    ss -tp | grep chrome
    
  3. 思考:为什么 DNS 查询(通常很小)使用 UDP 而不是 TCP?什么情况下 DNS 会切换到 TCP?

下一页
TCP 报文段首部解析