本文重点:
- 理解传输层的作用,深入理解 TCP 的各项特性和机制
- 对整个 TCP/IP 协议有系统的理解
- 对 TCP/IP 协议体系下的其他重要协议和技术有一定的了解
- 本文的知识点是网络编程的理论基础
- 是一个服务器开发程序员的重要基本功
- 是整个网络知识中重点 和难点 ,也是各大公司笔试面试的核心考点
文章目录
- 引言
- 一、应用层
- 二、传输层
-
- [2.1 端口号](#2.1 端口号)
-
- 端口号范围划分
-
- [认识知名端口号(Well-Known Ports)](#认识知名端口号(Well-Known Ports))
- [2.2 UDP 协议(User Datagram Protocol,用户数据报协议)](#2.2 UDP 协议(User Datagram Protocol,用户数据报协议))
-
- [UDP 数据报格式](#UDP 数据报格式)
- [UDP 协议特点](#UDP 协议特点)
- [基于 UDP 协议的应用层协议](#基于 UDP 协议的应用层协议)
- [2.3 TCP 协议(Transmission Control Protocol,传输控制协议)](#2.3 TCP 协议(Transmission Control Protocol,传输控制协议))
-
- [TCP 协议格式](#TCP 协议格式)
- [TCP 协议特点](#TCP 协议特点)
引言
TCP/IP 协议栈是互联网通信的基石,它定义了一套分层协作的通信规则,确保数据能够在复杂的网络环境中可靠、高效地传输。
协议栈的分层体系
TCP/IP 协议栈通常简化为四层模型,自下而上 分别为数据链路层 、网络层 、传输层 和应用层。
每一层都负责不同的通信任务,并依靠下层的服务完成自身工作。
| 层次 | 核心职责 | 关键协议 |
|---|---|---|
| 应用层 | 满足用户具体业务需求 | HTTP、DNS、FTP、SMTP 等 |
| 传输层 | 负责数据从发送端到接收端的端到端传输 | TCP(可靠)、UDP(不可靠) |
| 网络层 | 在复杂网络中选择路径并管理地址 | IP、ICMP、ARP |
| 数据链路层 | 在同一链路节点间传递数据帧 | 以太网、PPP |
一、应用层
应用层直接面向开发者和最终应用,提供满足业务需求的通信接口。
常见协议如:
- HTTP/HTTPS
- SSH
- Telnet
- FTP
- SMTP
这些应用层协议构成了日常网络应用的入口。
应用层协议之下,传输层(如TCP/UDP 协议)负责可靠性与传输控制,应用层只需实现自己的业务语义。
DNS 等服务在应用层实现域名解析等功能,底层通常通过UDP/ TCP进行请求和响应。
在网络编程中,应用层协议API(如Java、Python、C/C++ 的 socket 接口)用于实现业务逻辑;理解下层协议对设计高效、鲁棒的网络程序至关重要。
二、传输层
传输层的任务是:保证数据能够从发送端传输到接收端 。传输层也是网络编程的核心,提供两种传输方式:可靠的 TCP 和高效的 UDP。
2.1 端口号
端口号(Port)标识了一个主机上进行通信的不同的应用程序(不同应用程序的端口号都各不相同)。
在 TCP/IP 协议中,用 "源IP"、"源端口号"、"目的IP"、"目的端口号" 以及 "协议号" 这样的 五元组 来标识一个通信(可以通过 netstat -n 来查看)。
端口号范围划分
0~1023:知名端口号(Well-Known Ports)- 分配给广泛使用的服务,如 HTTP(80)、HTTPS(443) 等这些广为使用的应用层协议。
- 这些端口通常需要管理员权限才能绑定,并且他们的端口号都是固定的、公认的。
1024~49151:注册端口号(Registered Ports)- 供用户或应用程序注册使用,不是操作系统自动动态分配的。
- 许多数据库(如 MySQL 3306)、应用服务器(如 Tomcat 8080)会使用这个范围内的端口。
49152~65535:动态/私有端口号(Dynamic/Private Ports)- 通常由操作系统动态分配给客户端程序作为源端口,用于发起连接,也称为临时端口。
认识知名端口号(Well-Known Ports)
有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下这些固定的端口号:
- SSH 服务器:22
- FTP 服务器:21
- Telnet 服务器:23
- HTTP 服务器:80
- HTTPS 服务器:443
我们自己写一个程序时,如果要使用端口号,应该避免这些知名端口号。
一个进程是否可以绑定多个端口号?
- 可以。
一个端口号是否可以被多个进程绑定?
- 不可以(除非设置 SO_REUSEADDR 特殊情况,通常不允许)。
2.2 UDP 协议(User Datagram Protocol,用户数据报协议)
UDP 就像寄信------ 写好的信就是数据包,当贴上邮票、放入邮筒中之后,你不知道它是否能成功送到目的地。
UDP 数据报格式

| 偏移量 (位) | 字段名称 | 长度 | 作用说明 |
|---|---|---|---|
| 0-15 | 16位源端口号 | 2字节 | 发送方进程端口号。如果是客户端,通常由操作系统动态分配(1024-65535);如果是服务端,则是知名端口(如DNS的53)。 |
| 16-31 | 16位目的端口号 | 2字节 | 接收方进程端口号。用于在目标主机上找到对应的应用程序。 |
| 32-47 | 16位UDP长度 | 2字节 | 整个UDP数据报(首部 + 数据)的总长度,单位是字节。最小值为8(只有首部,无数据),最大值为65535(即64KB)。 |
| 48-63 | 16位校验和 | 2字节 | 用于检测数据在传输过程中是否损坏。如果校验和出错,接收端会直接丢弃该数据报。 |
- 16 位 UDP 长度表示整个数据报(UDP 首部 + UDP 数据)的最大长度。
- 如果校验和出错,就会直接丢弃。
UDP 协议特点
- 无连接:知道对端的 IP 和端口号,可以直接进行传输,不需要建立连接
- 不可靠:没有确认机制,没有重传机制;如果因为网络故障导致该段无法发送到对方,UDP 协议层也不会给应用层返回任何错误信息
- 面向数据报:不能够灵活地控制读写数据的次数和数量。应用层交给 UDP 多长的报文,UDP 会照样发送,既不合并也不拆分
- 长度限制:最大长度是 16 位(即 64KB),如果 UDP 的总长度超过 64KB,应用层必须手动分包、多次发送,接收端必须手动组包
- 常见场景:DNS 查询、实时音视频(RTP)、游戏数据(容忍丢包,追求低延迟)
基于 UDP 协议的应用层协议
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
2.3 TCP 协议(Transmission Control Protocol,传输控制协议)
TCP 协议是互联网最复杂的协议,它通过一系列精巧的机制,在不可靠的 IP 网络上提供了可靠的字节流传输。
TCP 协议格式

- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去
- 32位序号/32位确认序号:
- 4位 TCP 报头长度:表示该 TCP 首部有多少个32位bit(即有多少个4字节),TCP 首部最大长度是 60(15 * 4)
- 6位标志位 :
URG:紧急指针是否有效ACK:确认号是否有效PSH:提示接收端应用程序立刻从 TCP 缓冲区把数据读走RST:对方要求重新建立连接,称为复位报文段SYN:请求建立连接,称为同步报文段FIN:通知对方本端要关闭了,称为结束报文段
- 16位窗口大小:
- 16位校验和:发送端填充,CRC校验;接收端校验不通过,则认为数据有问题。此处的校验和不光包含 TCP 首部,也包含数据部分
- 16位紧急指针:表示哪部分数据是紧急数据
- 40字节头部选项:
TCP 协议特点
文章到这里就告一段落了,若有错误请尽管指出~
完