《计算机网络:自顶向下方法》笔记(3):运输层

运输层

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。运输层分组成为报文段(segment)。

TCP 为应用程序提供了几种附加服务。可靠数据传输(reliable data transfer),拥塞控制(congesion control)。

多路复用与多路分解

接收运输层报文段中并交付到正确的套接字的工作称为多路分解(demultiplexing)。

将各个套接字的数据封装并传递到网络层成为多路复用(multiplexing)。

UDP

UDP 是无连接的,他在 IP 层上只增加了多路复用与多路分解(即端口号 port);和差错检测(即校验和 checksum)。

UDP 适合应用的特征:无需连接建立,无连接状态,希望保文尽量精简,不希望过分延迟,且能容忍一些数据丢失。

UDP 校验公式是:每16位为一组相加,溢出回卷,最后结果的反码即是校验和。接收方同样计算出结果与反码相加结果应为 16 位全 1。

UDP 提供差错检测是因为底层链路不一定每一条链路都提供了差错检测,以及内存复制也可能出现差错。

—————— 20190615 ————————

TCP

TCP 是面向连接的(connection-oriented),提供的是全双工服务(full-duplex service),点对点(point-to-point)

TCP 报文包含:32 bits 序号(sequence number,seq),32 bits 确认号(acknowledgment number,ack),16 bits 接收窗口(receive windows),4 bits 首部长度(header length,以 32 bits 为单位),可选变长选项(options),6 bits 标记位(flag)。若 options 为空,则 TCP 头部长度为 20 字节。

累计确认:TCP 只会确认流中第一个丢失字节为止的字节。如 TCP 接收到 0~535 和 900~1000 的报文段,则 TCP 仍在等待 536 的报文段,A 给 B 的下一个报文段的 ack 将包含 536。

报文段的序号就是该报文段数据字段首字节的序号。

seq 即自己的当前报文的首字节序号,ack 即期望的对方的 seq。

TCP 超时时间基于 RTT 的一种计算方法可以是:

// 估算 RTT
EstimatedRTT = 0.875 EstimatedRTT + 0.125 Sample RTT。
// 偏差 RTT
DevRTT = 0.75 DevRTT + 0.25 |SampleRTT - EstimatedRTT|
// TCP 超时时间
TimeoutInterval = EstimatedRTT + 4 DevRTT

而没收到 RTT 时 TimeoutInterval 建议值为 1 秒,超时翻倍。

当接收端发现数据流出现空间隔(可能是中间报文超市或重新排序造成的),此时可以立即发送一个冗余 ACK(duplicate ACK)。如果发送方收到 3 个冗余 ACK,它把这个当作一种指示,即这个被确认 3 次的保文已经丢失。此时 TCP 就执行快速重传(fast restransmit)。

发送方发送 1, 2…N 的报文到接收方,且除 n(n<N)之外的所有报文都接收成功。此时 TCP n 报文超时,TCP 只会重传 n 这个报文段。GBN 风格的重传机制则会重传 n, n+1 … N 的报文段。

对 TCP 提出的一种修改意见是所谓的选择确认(selective actknowledgment)。它允许 TCP 接收方有选择地确认失序报文段,而不是累计地确认最后一个正确接收的有序报文段。此时 TCP 就更像 SR 协议。

TCP 通过让发送方维护一个发送窗口(receive window)来实现流量控制服务(flow-control service),接收方会在回复报文里携带 rwnd 变量,表示当前接收窗口(receive window)的剩余空间。

当接收方缓存空间已满,但接收方没有数据要返回的时候,是不会发送报文给发送方的。此时发送方无法得知 rwnd 变量的情况。TCP 规范要求:接收方接收窗口为 0 时,发送方持续发送 1 字节报文段,直到被接收方确认,返回非 0 rwnd。

握手过程中 SYN = 1,完成握手后 SYN = 0。三次握手的第三阶段已经可以携带数据给 server 了。

  • 第一阶段:SYN = 1,seq = 随机数 client_isn

  • 第二阶段(返回):SYN = 1,seq = 随机数 server_isn,ack = client_isn + 1

  • 第三阶段:SYN = 0,seq = client_isn + 1,ack = server_isn + 1

断开过程需要 4 次握手,因为发起方收到回复时,被动方可能还有数据要继续发。被动方发完后会发送属于它的断开,此时发起方收到后,再次回复,此时双方才真正断开。

TCP 丢包事件定义为:超时或收到接收方 3 个冗余 ACK

TCP 使用确认(ACK)来触发增大它的拥塞窗口长度,确认的快就增大得快

慢启动:在 TCP 慢启动状态下,cwnd 初始值是 1 个 MSS。 MSS 是初始窗口大小的参考值,是控制拥塞的字段。如果 MSS 初始值为 500 字节,RTT 200ms,则速率大约为 20kbps(1s 发 2500 bytes,即 20k bits)。当报文段被确认后, cwnd 会翻倍,即 2 个 MSS,4 个 MSS 地增长。报文段出现丢失的时候,进入拥塞避免(丢包)或快速恢复(3 个 冗余 ACK)状态。

拥塞避免:cwnd 降低为原来的一半。每次确认增加 1 个 MSS,丢包时状态切换和慢启动一致。

快速恢复:cwnd 降低为原来的一半 + 3 个 MSS。每次确认增加 1 个 MSS,丢包时状态切换和慢启动一致。

某些协议如 DCCP,SCTP 和 TFRC 明确地提供了超过 TCP 和 UDP 的强化能力,但多年来已经郑敏 TCP 和 UDP 是“足够好”的,未来“更好”的协议是否会取代 TCP 和 UDP,这将取决于技术,社会和商业考虑的复杂组合。

版权所有,转载请注明出处:
https://sickworm.com/?p=1722

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据