05-传输层

概览

  • 分割上层数据为 segment

  • 建立端到端连接传输 segment

  • 可靠传输:确保数据完整性

  • 流量控制:防止服务端发送速度过快

端口

  • TCP/UDP 使用端口来区分不同的应用程序

  • 16位无符号整数

  • 低于255的端口号保留

Socket

  • 形式:(IP, Port)

  • 每个连接由两个 socket 组成 (IP_src, Port_src) <=> (IP_dest, Port_dest)

  • Socket 点对点,全双工

TCP Transmission Control Protocol

  • 需要解决的问题

    • 可靠传输

    • 流量控制

      • 滑动窗口:客户端告知窗口大小,服务端发送数据不超过窗口大小

      • 拥塞控制:逐步增加发送速度,直到出现丢包,然后减速

    • 连接管理:建立/释放连接

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  (Variable Length)             |    Padding    |
 +-----------------------------------------------+---------------+
 |                    Data     (Variable Length)                 |
 +---------------------------------------------------------------+
  • 源端口、目的端口:16位

  • 序号 seq :32位

    • 单位:字节

    • 报文中的序号为该报文的第一个字节的序号

    • 若序号超过2^32,则从0开始

  • 确认号 ack:32位

    • 值为下一个期望接收的序号

    • 目的:减少数据的通讯量

  • 偏移:4位

    • 指示报头长度

    • 单位:4 Bytes

    • 计算方法:4 Bytes * 值

    • 因此最大报头长度为60 Bytes

  • 保留字段:6位

  • 标志位:6位

    • URG:紧急指针(优先传送)

    • ACK:确认号有效

    • PSH:客户端应该尽快将数据交给应用层

    • RST:重置连接

    • SYN:同步序号,表明是连接请求/连接接受报文

    • FIN:释放连接

  • 窗口大小 win:16位

    • 单位:字节

    • 表示服务端被允许发送的数据量

    • 流量控制

  • 校验和:16位

  • 紧急指针:16位

    • 仅在 URG 标志位为 1 时有效

    • 单位:字节

    • 紧急数据范围:[序号, 序号+紧急指针)

  • 选项:可选

    • 最大报文段长度 MSS

    • ……

  • 填充字段:使报头长度为 4 Bytes 的倍数

  • 报头最小:20 Bytes

  • 报头最大:60 Bytes

  • 数据最大取决于底层网络

建立连接 三次握手

次数
客户端状态
方向
服务端状态
报文
备注

1

CLOSED -> SYN_SENT

->

LISTEN->SYNC_RCVD

SYN=1, seq=x

SYN 为 1 ACK 为 0的包表示建立连接请求

2

SYN_SENT

<-

SYNC_RCVD

SYN=1, ACK=1, seq=y, ack=x+1

第二次握手若没有对应的端口监听,则返回 RST

3

ESTABLISHED

->

SYNC_RCVD -> ESTABLISHED

ACK=1, seq=x+1, ack=y+1

完成三次握手后,通知上层应用程序握手完成

可能发生的问题

  • Lost ACK:ACK没能到达客户端

  • Late ACK:ACK延迟到达

  • 无论哪种情况,客户端只有收到服务端重传的数据后才知道传输出错

  • 此时服务端会直接丢弃重复的数据,重新发送数据

  • 客户端收到 Late ACK 后,也会直接丢弃

Stop & Wait protocol 停止等待协议

  • 若第一次握手后,客户端没有收到回复,则会等待一段时间后重发 SYN

  • 在发送数据时保留备份

  • 重传时间:2 * RTT (往返时间)

  • 缺点:效率低下

Contiguous ARQ 连续 ARQ 协议

  • 客户端无需请求重传,服务端自动重传

  • 基本流程

    1. 服务端维持发送窗口

    2. 收到确认后发送窗口向前滑动,指针前移

  • 可发送的数据量:发送窗口大小 - 已发送未确认的数据量

释放连接 四次挥手

次数
客户端状态
方向
服务端状态
报文
备注

1

ESTABLISHED -> FIN_WAIT_1

->

ESTABLISHED

FIN=1, seq=u

表明客户端不再传输数据 同时告知上层

2

FIN_WAIT_1

<-

CLOSE_WAIT

ACK=1, seq=v, ack=u+1

确认收到释放连接请求

3

FIN_WAIT_2

<-

LAST_ACK

FIN=1, ACK=1, seq=w, ack=v+1

通知对方释放连接

4

TIME_WAIT

->

LAST_ACK -> CLOSED

ACK=1, seq=v+1, ack=w+1

等待 2MSL 后 客户端状态变为 CLOSED

  • 前2次:关闭客户端到服务端的传输

  • 在第2次握手后,服务端继续向客户端发送剩余数据

  • 后2次:关闭服务端到客户端的传输

  • 等待 2MSL

    • 保证服务端发送的最后一个 ACK 能够到达客户端

    • 确保能及时收到丢包重发的 FIN 包

    • 等待2MSL后若无重发的包则代表对方已经收到最后的ACK,连接可释放

TCP 计时器

  • 重传计时器:若收不到 ACK,重传数据

  • 坚持计时器:若win为 0,发送方启动坚持计时器,定期发送窗口探测报文,检查接收方是否重新打开窗口

  • 保持计时器:定期发送探测报文确认对方是否在线

  • 时间等待计时器:在挥手时等待 2MSL

seq ack

  • 握手时,seq 为随机数

  • 传输时,seq 为数据的第一个字节的序号

  • 挥手时,seq 为最后一个数据的下一个字节的序号

  • ack 始终是上次传输的数据的下一个字节的序号,握手挥手时直接加 1

UDP User Datagram Protocol

  • 无连接

    • 没有握手挥手

    • 每个报文独立

  • 报文小

  • 无可靠传输

  • 无流量控制:很快发送数据

  • 使用场景:对速率敏感,对准确率不敏感(例如SNMP即使在拥堵情况下也要能传数据)

报文格式

 0              15 16             31
 +-----------------+-----------------+
 |   Source Port   |Destination Port |
 +-----------------+-----------------+
 |     Length      |    Checksum     |
 +-----------------+-----------------+
 |          data octets ...          |
 +-----------------------------------+

TCP vs UDP

特性
TCP
UDP

连接

面向连接

无连接

可靠性

可靠

不可靠

流量控制

检查 segment

重发错误内容

使用ACK确认

多播/广播

不支持

支持

  • 底层为 TCP 的协议:HTTP、FTP、SMTP

  • 底层为 UDP 的协议:RIP、DHCP、TFTP、SNMP

DNS同时使用 TCP 和 UDP

NAT & PAT

特点

  • 在内网和公网间的路由器把在IP报文头中的网络地址按照NAT表转换为另一个网络地址

  • 允许使用私有地址的多个主机共享一个公网IP地址访问互联网

  • 优点:复用IP地址

  • 缺点:一对一映射,不支持端口复用

种类

  • 静态 NAT:一对一映射

  • 动态 NAT:动态一对一映射,先来先服务

  • PAT:端口地址转换,多对一映射,解决NAT的端口复用问题

NAT 地址种类

PAT端口复用的是 Inside Global Address 的端口

  • Inside Local Address:内网私有 IP 地址

  • Inside Global Address:内网设备对外展示的公共 IP 地址

  • Outside Global Address:外网目标设备的公网 IP 地址

最后更新于