计算机通信与网络 - 3

UDP、TCP

传输层向上面的应用层提供通信服务,同时也是用户功能中的最底层。传输层负责进程到进程的传递。传输层需要两种不同的协议,即面向链接的 TCP 和无连接的 UDP。

端口号用于标识计算机应用层中的各进程,是一个 16 bit 的数字。在因特网中不同计算机的相同端口号是没有联系的。

IANA 是互联网号码分配机构,它统一管理和协调全球互联网的一些关键资源数据,如 IP 地址空间,顶级域名,或者端口号等。

对于端口号的分配,01023 端口由 IANA 统一分配,102449151 端口 IANA 不分配也不控制,可以在 IANA 注册以防止重复,49152~65535 端口不受控制也不受注册,可作为临时端口。

进程到进程的传递需要两个标识符,IP 地址和端口号,这两个结合在一起称为了套接字

UDP

用户数据报协议称为无连接不可靠的传输层协议。它除了提供进程到进程通信而不是主机到主机的通信外,就没有给 IP 服务添加任何东西。

USP 协议常用的端口有
|端口号|服务/协议|用途|
|53|DNS|域名解析|
|67 68|DHCP|自动为网络中的设备分配 IP 地址|
|69|TFTP|简单的文件传输|
|123|NTP|同步计算机和网络设备的时间|
|161 162|SNMP|网络设备的监控和管理|
|500|ISAKMP/IKE| IPsec VPN 协商的第一阶段|
|514|Syslog|系统日志传输|
|1194|OpenVPN|OpenVPN 服务默认使用的端口,也可能是 TCP|
|520|RIP|用于路由器间交换路由信息|

UDP 的结构

UDP数据报的“长度”是指其自身的总长度。计算校验和时,会临时组合一个包含IP信息的“伪首部”与UDP数据报一同运算,此举是为了进行端到端的正确性验证,但伪首部本身不参与传输。

TCP

TCP 是一个面向链接的协议。它在两个 TCP 之间建立一个虚拟的链接来发送数据。另外,TCP 在传输层使用流量控制和差错控制机制。

TCP 协议常见的端口有

端口号 服务/协议 用途
80 HTTP 网页浏览
443 HTTPS 加密网页浏览
21 FTP 文件传输
22 SSH 加密远程登录
23 Telnet 不加密远程登录
25 SMTP 发送电子邮件
587 SMTP Submission 邮件客户端向邮件服务器提交邮件以进行中继
110 POP3 从服务器下载邮件到本地客户端
143 IMAP 在服务器上管理邮件
3306 MySQL MySQL 服务
5432 PostgreSQL PostgreSQL 服务
1433 Microsoft SQL Server SQL Server 服务
6379 redis redis 服务
3389 RDP 远程桌面协议
111 RPC RPC 远程调用方法

TCP 的链接和建立都是采用客户端和服务器的方式。主动发起链接建立的进程都叫客户,被动等待链接建立的应用进程叫服务器

报文结构

TCP 报文结构

其中的控制字段分以下几种

  • URG 紧急指示符字段
  • ACK 确认字段
  • PSH 将数据推向前
  • RST 链接复位
  • SYN 在链接时对序列号进行同步
  • FIN 终止链接

建立链接

在发送任何应用数据前,TCP 必须先在客户端和服务器间建立可靠的链接。建立链接需要分三步

  1. SYN
    发送方向接收方发送特殊的报文,并随机生成一个初始序列号,说明“我想和你建立连接,我的初始号码是 X
  2. SYN-ACK
    接收方收到请求后,会回复一个报文。这个报文同时设置了 SYN 和 ACK 标志位。它确认了客户端的序列号 (ACK = X + 1),同时也告知己方的初始序列号,说明“我听到了,我同意链接,我的初始号码是 Y
  3. ACK
    发送方再发送一个确认报文,ACK 标志位设为1,确认号为 ACK = Y + 1,说明“收到你的确认了,我们可以开始了”

三次握手流程

数据传输和可靠性验证

TCP 会将应用层传来的数据流分割成大小合适的数据段

每个数据段都会被赋予一个唯一的序列号,接收方在成功收到后,会回复一个确认报文,包含它所期望收到的下一个序列号。发送方在发出一个数据段后会启动计时器,诸如此类。同时接收方通过滑动窗口机制来告诉发送方自己还能接收多少数据。

TCP 发送的双方都有一个缓冲区。操作系统内核为每个 TCP 内核都预留了一块内存区域,用于临时存放待发送或已接收的数据。这里的缓冲区可以实现重传机制,以及将无序的数据重新组装等功能。

缓冲区图示

断开链接

数据发送完毕后,需要进行断开操作。该操作分四步

  1. FIN 主动关闭方发送 FIN 标志位为 1 的报文,标识“我的数据发完了,想断开链接”
  2. ACK 被动关闭方收到 FIN 后,回复一个 ACK 进行确认,表示“我知道你要关闭了”。此时主动关闭方已不能发送数据,但被动关闭方可能还有数据要发送
  3. 被动关闭方也准备好关闭后,会发送自己的 FIN
  4. 主动关闭方收到 FIN 后,回复最终的 ACK 确认。最后双方链接完全关闭

流量控制

每一个 TCP 链接需要有以下两个状态变量

  • 接收端窗口 rwnd
    接收端根据其目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。接收端将此窗口值放在 TCP 报文首部中的窗口字段,传送给发送端
  • 拥塞窗口 cwnd
    发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。

发送端的发送窗口的上限值为 Min[rwnd, cwnd]

但是在一开始的时候,双方的窗口数据均未知,又怎么设置一个合适的数值呢?这需要慢开始算法

  1. 初始阶段
    TCP 链接刚建立或检测到超时(认为发生了网络拥塞)时,发送方会将窗口设置为一个很小的值(1个报文段的大小)
  2. 每一次成功后,就会将拥塞窗口增加一个 MSS。由于 TCP 采用累计确认的机制,在一个传输轮次中,拥塞窗口的实际增长是指数性的。
  3. 发送方还有个变量叫慢开始阈值。当拥塞窗口增长到慢开始阈值时,慢开始阶段结束,短发将进入拥塞避免阶段。在拥塞避免阶段,窗口的增长方式由指数增长变为线性增长。当发生超时这种严重的拥塞信号时,慢开始阈值将设置为当前拥塞窗口的一半。若窗口被重置为1,则重新开始慢开始过程。

慢开始示意图

快重传算法是指,当发送端连续收到三个或三个以上重复的ACK时,即可判定某个报文段已经丢失。此时,发送端会立即重传对方所要求的那个报文段,而无需等待重传计时器超时。这是一种基于反馈的主动修复机制,能够有效减少数据等待重传的时延。

快恢复算法与快重传协同工作。当发送端因收到三个重复ACK而触发快重传时,会随即执行快恢复:首先,将慢开始门限(ssthresh) 设置为当前拥塞窗口(cwnd) 值的一半。然后,与慢开始算法不同,它并不将 cwnd 重置为1,而是将 cwnd 设置为新的 ssthresh 值(有些实现会在此基础上加3,以补偿已离开网络的报文段)。在此之后,发送端直接进入拥塞避免阶段,开始线性地增大 cwnd。

TCP 的重传机制

由于 IP 数据报选择的路由变化很大,因而运输层的往返时延的方差也会很大。

记录每一个报文段发出的时间,以及收到响应的确认报文段时间。这两个时间之差就是报文段的往返时延,平均往返时延可以使用自适应算法 (RTT) 解决。

$$
\overline{\text{RTT}}=\alpha \times \text{RTT}_{旧}+(1-\alpha)\times 新的时延样本
$$

其中有 $0\leq \alpha \leq 1$,表示加权。选择的 $\alpha$ 越接近 0,则表示加权极端的平均往返时延受新的时延样本的影响较大。一般取 $\alpha = \frac{7}{8}$。

计时器的超时重传时间 (RTO) 应略大于上面得到的 RTT,即

$$
\text{RTO}=\beta \times \text{RTT}
$$

其中 $\beta >1$。若 $\beta$ 接近1,则表示发送端可及时重传丢失的报文段,效率提高,但可能会加重网络负担。一般设置为2。

利用 Karn 算法,报文段每重传一次,就将重传时间增大一些

$$
新的重传时间=\gamma \times 旧的重传时间
$$

在实时性、速度和速率优先的场景下,通常选择 UDP;在数据准确性和完整性比较重要时,通常选择 TCP

DNS

DNS (Domain Name System) 是将人类易于记忆的域名转换为计算机易于通信的 IP 地址。

域名空间

为了实现无二义性,分配给机器的名字必须从名字空间中仔细选择。该名字空间完全控制对名字和 IP 地址的绑定。为了获取层次结构的名字空间,设计了域名空间

域名空间是一个层次化的树状结构,就像一棵倒过来的树

  • 根域名:最顶端,用 . 表示
  • 顶级域名:根域名的下一级,表示 .com .org .cn
  • 二级域名:TLD 下,通常由自己注册
  • 子域名:自己创建

域名空间可以分为通用域、国家域和反向域三部分。

权威服务器上,域名通过不同类型的记录来定义其功能

  • A 记录:域名指向 IPv4 地址
  • AAAA 记录:域名指向 IPv6 地址
  • CNAME 记录:将一个域名指向另一个域名
  • MX 记录:邮件交换记录
  • TXT 记录:文本记录,用于验证域名所有权、发送方策略框架等
  • NS 记录:域名服务器记录

DNS 劫持是一种网络攻击,它通过修改 DNS 的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站。

应用层协议

教学大纲基本不涉及应用层,而且涉及到的都是千禧年代的产物,因此补充的内容特别多,放另几篇上了。

TELNET

用户使用 TELNET 就可以在其所在通道上通过 TCP 链接注册到远地的另一个主机上。然而目前更常用的是加密的 SSH。

SMTP 与 MIME

基于 TCP 协议的发送电子邮箱的协议。注意:SMTP 只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。

MIME 则是在继续目前的格式的基础上,增加了邮件主体的结构,并定义了传送非 ASCII 码的编码规则。

这里的定义老旧得被气笑了。MIME 更广泛的用法在以前的文章。它定义的 Content-Type 标准(即“媒体类型”)实在是太有用了,因此被直接采纳并应用于 WWW 或其他互联网协议中。

HTTP

HTTP (Hypertext Transfer Protocol) 超文本传输协议,基于 TCP 协议,用于传输超文本和多媒体内容的协议,主要用于 web 浏览器和服务器的设计中。

WebSocket

WebSocket 是一种基于 TCP 链接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。几乎所有主流较新版本的浏览器都支持该协议,用于弥补 HTTP 协议在持久通信能力上的不足。常用于视频弹幕、实时消息推送、多用户协同编辑。


计算机通信与网络 - 3
https://ivanclf.github.io/2025/11/15/networking-3/
作者
Ivan Chan
发布于
2025年11月15日
许可协议