Willson Chen

Stay Hungry, Stay Foolish.

OSI – 传输层

网络原理

传输层

传输层定位

  • 为应用进程间提供端到端的逻辑通信,区别于网络层是主机间的逻辑通信。
  • 对报文进行差错检测。
  • 提供面向连接的 TCP 和无连接的 UDP。
  • TCP 是可靠传输,UDP 是不可靠传输。

端口

  • 用于标识进程,统一不同系统的进程标识符。
  • 端口号16位,范围:0~65535
  • 0~1023 系统保留端口,用户进程不能使用。
  • 端口分类:
    • 公认端口:0~1023,如 http 80,https 443,ssh 22 等
    • 注册端口:1024~49151,需在机构登记防止冲突。
    • 动态端口:49152~65535

UDP

  • UDP 是用户数据报协议。
  • 提供无连接的不可靠传输服务。
  • 仅在 IP数据报服务基础上增加端口和差错校验功能。
  • 优点:
    • 效率高,无需连接,首部开销小。
    • 支持广播。
    • 发送端无阻塞。
  • 应用场景:视频流传输、游戏通信等。
  • UDP 数据报头部
    • 共 8 字节,包含源端口,目的端口,长度,校验和各 2 字节。
    • 计算校验和时会增加伪首部,包含源和目的 IP 地址等。
  • 仅添加首部交由下层处理,不处理拆分合并。
  • 如果 UDP 数据报长度超过 MTU
    • 网络层IPv4,会进行拆分与合并,如果合并失败则丢弃。
    • 网络层IPv6 不支持分片,直接丢弃。
  • 数据长度一般控制在 512 内,因为互联网标准 MTU 为 576,减去 IP头部(20 到 60)和 UDP 头部综合权衡得到。

TCP

  • TCP 是传输控制协议
  • 特点:
    • 提供面向连接的可靠的双向字节流传输服务
    • 只能点对点,不支持广播
  • Socket:
    • TCP 连接的两端点抽象概念为 Socket(套接字/插口)
    • Socket = IP + 端口号

可靠传输原理

  • 停止等待协议:
    • 发送方每发送一个分组就停止发送,等待对方确认。
    • 发送方每收到一个确认就发送下一个分组。
    • 存在确认丢失和迟到,需要支持超时重传和丢弃重复。
    • 缺点是信道利用率低。
  • 滑动窗口协议:
    • 发送方维持一个发送窗口,流水线发送。
    • 如果发送窗口已满,则停止发送。
    • 接收方采用累积确认。
    • 可以提高信道利用率。
    • 可以实现流量控制。
  • TCP 可靠通信原理:
    • 连接两端都有一个发送窗口和一个接收窗口。
    • 窗口大小在建立连接时协商确定。
    • 对字节的序号进行确认,确认后发送窗口才向前滑动。

拥塞控制原理

  • 拥塞控制的方法是动态控制拥塞控制窗口大小。
  • 判断拥塞的依据是没有按时到达的确认报文。
  • 拥塞窗口控制算法:
    • 慢开始:开始传输时采用指数级增大窗口。
    • 拥塞避免:慢开始结束后进入拥塞避免阶段,采用线性增大窗口。
    • 慢开始和拥塞避免之间通过一个门限变量控制。
    • 快速重传:只要一连收到三个重复确认就立即重传,而不必继续等待重传计时器到期。
    • 快速重传可以避免丢包时误判拥塞,降低传输效率。
    • 快速恢复:在快速重传后,不执行慢开始,而是将门限减半,然后进入拥塞避免阶段。

TCP报文段头部

  • 固定长度 20 字节,最大 60 字节。
  • 源端口目的端口号各 16 位。
  • 序号32位,表示本报文段第一个字节的序号。
  • 确认号32位,表示期望收到对方下一个报文段的数据的第一个字节的序号。
  • 数据偏移4位,单位为4字节,表示首部长度。
  • 保留字段占6位。
  • 标志位6位:
    • URG,表明紧急指针字段有效,有高优先级的数据。
    • ACK,表明确认号字段有效。
    • PSH,表明接收方应该立即将数据推送给应用层。
    • RST,表明发送方出现严重差错,必须重新建立连接。
    • SYN,表明这是一个连接请求或连接接受报文。
    • FIN,表明发送方已经完成,要求释放连接。
  • 窗口大小16位,表示接收窗口大小。
  • 校验和16位,类似 UDP 会增加伪首部进行计算。
  • 紧急指针16位,少用。

选项字段(长度可变):

  • MSS
    • 最大报文段长度,告诉对方报文段的数据最大长度。
    • 如果超过 MTU 网络层需要进行分片。
    • 如果一方不接受另一方的 MSS,则定为默认值 536,
    • 互联网MTU(576) – IP头(20) – TCP头(20)。

image

TCP 连接目的

  • 确认对方存在
  • 协商参数,如 MSS,窗口大小等。

三次握手建立连接

  • SYN,seq=x
  • SYN,ACK,seq=y,ack=x+1
  • ACK,seq=x+1,ack=y+1
  • 三次握手可以避免超时重传时建立错误的历史连接。
  • 异常情况:
    • 第一次握手丢失,客户端重传。
    • 第二次握手丢失,客户端和服务端都重传。
    • 第三次握手丢失,服务端超时重传,客户端已建立连接如果发送数据没有得到确认也会重传。
    • 采用指数退避计算重传周期,linux默认从1s开始重传5次。

四次挥手释放连接

  • FIN,seq=u
  • ACK,seq=v,ack=u+1
  • FIN,ACK,seq=w,ack=u+1
  • ACK,seq=u+1,ack=w+1
  • 四次挥手的原因是:另一端可能还有数据没有传完。

重传机制

  • 超时重传,每个报文段都设置计时器。
  • 超时时间 RTO 标准算法
    • RTO = srtt + 4*rttvar
    • rttvar = (1-h)rttvar + h(|M-srtt|)
    • srtt = (1-g)srtt + gM
    • M:往返时延RTT测量值
    • 建立连接时没有RTT 测量值,初始RTO为1s
  • 快速重传,三次相同 ACK 则重传。

连接不存在IP时的处理方式

  • 局域网内,发送 ARP 获取 MAC 地址,然后才发送握手请求。
  • 局域网外,直接发送握手请求,路由转发到外部。

连接不存在的端口时的处理方式

  • 主机响应 RST,发送端关闭连接。
  • 防火墙限制则直接丢弃,发送端超时重试直至失败。