MHuiG

「看庭前花开花落,望天上云卷云舒」

传输层协议

# 传输层协议

## 什么是端到端

端到端是网络连接。网络要通信，必须建立连接，不管多远，中间有多少设备，都必须在源和目的之间建立连接.

端到端是逻辑连接，这条路可能经过了很复杂的物理线路，但两端的设备不管，只认为两端有连接.

## TCP 端口号

端口号：用于区分不同的网络服务.

端口号范围: `0-65535`.

知名端口号: `0-1023`, 即众所周知的端口号.

注册端口号: `1024-49151`, 公司和其他用户向 `ICANN` 机构登记的端口号.

动态端口号 (私有端口号): `49152-65535`, 普通用户或随机生成时使用的端口号.

基于 TCP 工作的应用层协议和端口:

`FTP` (文件传输协议): `20,21`

`SSH` (安全加密远程登陆协议) : `22`

`Telnet` (远程登陆协议): `23`

`SMTP` (简单邮件传输协议): `25`

`DNS` (域名解析系统): `53` 基于 TCP/UDP

`HTTP` (超文本传输协议): `80`

`HTTPS` (加密超文本传输协议): `443`

`RDP` (远程桌面): `3389`

每一种端口对应一种网络服务或网络应用.

## TCP

RFC 793

TCP 是一种面向连接的传输层协议，可提供可靠的传输服务.

TCP 提供重传机制.

## TCP 报文头

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          Source Port          |       Destination Port        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Sequence Number                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Acknowledgment Number                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Data |           |U|A|P|R|S|F|                               |
    | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
    |       |           |G|K|H|T|N|N|                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |           Checksum            |         Urgent Pointer        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Options                    |    Padding    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                             data                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                            TCP Header Format

          Note that one tick mark represents one bit position.

`S.port`: 源端口，`16bit`, 表示发送者的端口号，发送者是普通用户时，随机生成端口号。提供服务端应用时，端口号根据服务来决定.

`D.port`: 目的端口，`16bit`, 表示接收方的端口号.

`Sequence number`: 序列号，`32bit`, 用于标识 TCP 数据段的顺序. TCP 连接建立或数据传输时会将第一个 TCP 报文随机编上一个序号，保证报文传输的有序性。序列号随机生成但有序增长，单位为 `1` 字节.

`ACK number`: 确认序列号，`32bit`, 用于 TCP 的确认机制。用于标识接收端确认收到的数据段，确认序列号为 `成功收到的数据的序列号+1`, 只在 `ACK` 位置位时有效.

`Header length`: 头长度，`4bit`, 用于标识 TCP 头部长度。每个单位 `4` 字节.

`Reserved`: 保留字段，`6bit`, 全部为 `0`.

`URG`: 紧急指针有效标识，`1bit`, 此标志位可以通知此报文段中有紧急数据需要处理.

`ACK`: 确认位，`1bit`, 用于 TCP 的确认功能开启.

`PSH`: 催促标记位，`1bit`, 表示接收方应该尽快处理这个报文段，交给应用层.

`RST`: 重新建立标识，`1bit`, 当 `RST=1` 时，表示 TCP 连接出现严重错误，必须释放连接，然后重新建立连接.

`SYN`: 同步序列标识，`1bit`, 表示希望与对端建立连接并数据同步，用于发起一个 TCP 连接.

`FIN`: 结束位，`1bit`, 用于 TCP 连接的关闭功能，用于释放 TCP 连接.

`Window`: 窗口大小，`16bit`, 用于标识 TCP 单次传递数据的大小控制。一般用于 TCP 流量控制。窗口大小的数值代表接收端期望接收的字节数，最大位 `65535` 字节.

`Checksum`: 校验和，`16bit`, 用于校验整个 TCP 报文的完整性.

`Urgent Pointer`: 紧急指针，`16bit`, 可以实现 TCP 的紧急指针功能，只有 `URG` 为 `1` 时有效，标识在本数据段中紧急数据的字节数.

## TCP 建立连接 三次握手

    PC                                     Server
    ==> seq=a    SYN=1  ========================>
    <== seq=b    SYN=1  ACK=1  ack number=a+1 <==
    ==> seq=a+1         ACK=1  ack number=b+1 ==>

PC 主动发送 TCP 报文，本地随机生成一个序列号 a, SYN 置位，表示想要建立连接.

Server 收到请求消息后，本地随机生成序列号 b, 将 ACK 位置位，确认号为对方发送请求的序列号 + 1, SYN 置位.

PC 将序列号有序加 1, ACK 置位，确认号为对方发来的序列号 + 1.

## TCP 传输过程 重传机制

TCP 可以根据接收方的处理能力来调整自己的窗口大小，来接收分批次的传输数据，此时对端设备不需要每次都给与确认，只需要确认收到报文后的最后一个序列号.

如果在传输过程中，数据因为某些原因丢失，那么接收方将对上一个收到的报文进行确认，来告知对端设备，后续报文没有收到，此时对端设备会重传数据.

下一条序列号 = 上一条序列号 + 数据载荷长度.

## TCP 滑动窗口机制 流量控制

当发送者根据自己的窗口大小来发送数据，接受者会根据自己的窗口大小来接收，窗口大小为最优的传输速率.

如果此时发送端的窗口大小大于接收端的窗口大小就会导致数据丢失.

接收端在确认时，会将收到的最后一个数据段进行确认，并将自己的窗口大小告诉发送端，发送端收到此报文后会调整自己的窗口大小，并重传.

## TCP 关闭连接 四次挥手

    PC                                   Server
    ==> seq=a   FIN=1 ACK=1 ack number=b    ==>
    <== seq=b         ACK=1 ack number=a+1  <==
    <== seq=b   FIN=1 ACK=1 ack number=a+1  <==
    ==> seq=a+1       ACK=1 ack number=b+1  ==>

PC Server

Seq=a ack number=b FIN=1 ACK=1==> (发起关闭连接)

<== seq=b ack number=a+1 ACK=1 (确认并将确认位置位，ack number 为对方的序列号 + 1)

<== seq=b ack number=a+1 FIN=1 ACK=1 (因为 TCP 双向关闭连接，所以双向关闭)

Seq=a+1 ACK ack number=b+1 (PC 序列号自加，确认位置位，ack number 为对方的序列号 + 1)

## TCP 特点

- 1. 运行于传输层
- 2. 为网络提供可靠的接入
- 3. 是一种面向连接的协议
- 4. 是一种全双工的，会建立双向通道的协议
- 5. 具备错误检查能力
- 6. 数据段序列化
- 7. 具备接收确认机制
- 8. 具备数据重传机制

## UDP

RFC 768

UDP: 用户数据包协议.

提供不可靠的传输服务，具有 TCP 没有的优势.

UDP 无连接，时间上不需要建立连接所需要的时延；空间上，TCP 需要在端系统中维护连接状态，UDP 不需要.

特点:

- 运行于传输层
- 是一种无面向连接的协议
- 提供有限的错误检查能力
- 采用尽力而为的传输方式
- 不具备数据重传功能

一些时延敏感的流量，如语音视频等，通常使用 UDP 作为传输层协议.

## UDP 端口号

范围: `0-65535`

知名端口号: `0-1023`

注册端口号: `1024-49151`

动态端口号: `49152-65535`

基于 UDP 的应用层协议

`DNS`: 域名解析协议 `53`

`DHCP`: 动态主机配置协议 `67 68`

`TFTP`: 轻量级文件传输协议 `69`

`SNMP`: 简单网络管理协议 `161`

`RIP`: 路由信息协议 `520` 一个距离矢量路由协议

`BFD`: 双向转发检测 `3784`

## UDP 报文头

    0      7 8     15 16    23 24    31
    +--------+--------+--------+--------+
    |     Source      |   Destination   |
    |      Port       |      Port       |
    +--------+--------+--------+--------+
    |                 |                 |
    |     Length      |    Checksum     |
    +--------+--------+--------+--------+
    |
    |          data octets ...
    +---------------- ...

          User Datagram Header Format

S.port: 源端口.

D.port: 目的端口.

Length: UDP 报文总长度.

Checksum: 校验和，校验 UDP 报文完整性.

ARP协议

ARP 协议 ARP 协议 ARPARP: 地址解析协议，用于已知一台设备 IP 地址时，获取对方的硬件地址信息，从而进行数据链路层的封装. ARP 协议本身没有一个独立的协议号. 网...

DHCP

DHCP DHCP DHCPDHCP: 动态主机配置协议，可以在网络为终端设备配置上网参数 (IP 地址，掩码，网关，DNS 等等), 可以减少管理员的工作量. 应用层协议. DHCP ...

推荐阅读
以太网帧结构 IP编址 网络参考模型 OSPF基础 IPv6 数据转发过程

留言区

Notes
数据通信网络
Are You A Robot?