传输层概述
传输层的核心协议是 TCP 和 UDP。
端口号
端口号使用整数表示,用来区分同一台主机上不同的应用程序。在网络编程中每个程序创建 socket 时都需要关联端口号。对于服务器来说,端口号由程序员手动指定;对于客户端来说,端口号由系统自动分配。
端口号由两个字节表示的无符号整数组成:
- 范围:0~65535。
并非所有数字都能使用:
- 0~1023 通常不使用,称为知名端口号,留给知名服务器。
- 80:HTTP 服务器预留端口。
- 443:HTTPS 服务器预留端口。
问题 1:一个进程是否可以绑定多个端口号? 答:完全可以。实际上不是进程绑定端口号,而是 socket 绑定端口。一个进程中可创建多个 socket,因此可同时关联多个端口号。开发服务器程序时,一般会提供至少两个端口:
- 业务端口:供用户客户端访问。
- 调试端口/管理端口:不对外公开,用于程序内部使用。
问题 2:一个端口号是否可以被多个进程绑定? 答:如果是同一种协议则不行,如果是不同协议是可以的。
UDP 协议
学习协议的重点在于其格式,通过格式可以推导特性。

整个 UDP 报头是 8 个字节,分成四个部分,每个部分占两个字节。
UDP 报头属性含义:
- 源端口、目的端口:表示数据是从哪个进程来,到哪个进程去。
- 长度:通过 2 个字节描述整个 UDP 数据报的长度(包括报头和载荷)。报头固定 8 个字节,所以整个长度减去 8 个字节的长度即为载荷长度。2 个字节最大表示 65535,即 64KB,因此一个 UDP 数据包最大也就是 64KB。
- 校验和:验证传输的数据是否出错。网络传输中电信号或光信号受外界干扰可能导致比特流错误。UDP 校验和起到发现错误的作用,即知道数据错误了,但不知道哪个位错误了。
方案对比:
- 发现错误:UDP 采用此方案。发送方计算校验和并随数据发送,接收方收到后再次计算并对比。若结果不同,则数据错误。
- 纠正错误:如海明码,知道数据错了也能定位具体位错误。
如果数据超过 64KB 怎么办?解决思路有两个:
- 手动实现拆包组包逻辑,但拆分组合复杂。
- 使用 TCP 代替 UDP。
计算校验和的方案有多种:
- CRC 循环冗余校验:简单快捷,但易出现碰撞。
- MD5/SHA 系列:定长、分散性强、不可逆,常用于加密领域。
UDP 主要应用于对效率要求高、丢包概率低的场景,如同机房内部机器通信。
TCP 协议
TCP 报文格式如下:



















