Skip to main content

传输层

传输层服务

功能

向应用层提供通信服务,属于面向通信部分的最高层,也是用户功能中的最底层;为不同主机上的进程提供了逻辑通信,而网络层为主机之间提供逻辑通信,即使网络层协议不可靠(分组丢失、混乱或重复),传输层也能为应用程序提供可靠的服务。

功能如下:

  1. 端到端的逻辑通信,逻辑通信是指逻辑上是同层直接的传输;
  2. 复用和分用(网络层也有),发送方的不同进程可以使用同一个传输层协议,接收方剥去报文首部后可以将数据交付给正确的目的进程;
  3. 差错检验,而网络层只检查 IP 首部;
  4. 提供面向连接的 TCP 和无连接的 UDP,网络层要么提供虚电路,要么提供数据报;

寻址和端口

tip

端口能够让应用层的各种应用进程将数据通过端口交给传输层,以及让传输层知道端口与应用的对应;端口是传输层服务访问点(TSAP),类似于 IP 地址在网络层或 MAC 地址在数据链路层的作用,但端口标识应用进程,后两者标识主机。

端口号长 16bit,能够标识 65536 个不同的端口号,只具有本地意义,可以分为两类:

  1. 服务器端使用的端口号,一种是 熟知端口号010230\sim 1023,由 IANA(互联网地址指派机构)指派给 TCP/IP 的重要应用,另一类为 登记端口号1024491511024\sim 49151,必须在 IANA 登记,防止重复;
  2. 客户端使用的端口号,491526553549152\sim 65535,仅在客户进程运行时才动态选择,又称为 短暂/临时端口号,通信结束后就释放;

熟知端口号

FTPTELENTSMTPDNSFHTPHTTPSNMP
212325536980161

套接字,由 IP 地址和端口号组成,唯一标识一台主机上的一个应用进程。

UDP 协议

UDP 数据报

tip

仅在 IP 数据报服务上增加了两个最基本的服务:复用和分用,差错检测,由如下优点:

  1. 无须建立连接;
  2. 无连接状态,消耗更小;
  3. 分组首部开销小;
  4. 应用层能更好控制发送的数据和时间,UDP 没有拥塞控制;
  5. 支持一对一、一对多、多对一和多对多。

比较适合于一次传输较少数据的应用,如 DNS、SNMP 等,或者一些多媒体(IP 电话、实时视频会议、流媒体等)。

首部格式

长 8B,四个字段均分,分别为:

  1. 源端口,需要对方回信时才用,不需要时全为 0;
  2. 目的端口,终点交付报文时必须用到;
  3. 长度,UDP 数据报的长度(包括首部和数据),最小是 8,即仅有首部;
  4. 校验和,可选,不选全为 0;

校验

计算校验和时要向 UDP 数据报(包含真实的首部)前增加 12B 的伪首部,单纯用于计算校验和,伪首部有 4B 的源 IP 地址、目的 IP 地址、1B 的 0 和 17(标识使用 UDP 协议),以及 2B 的 UDP 长度。

若数据部分长度不是偶数字节,则填充 0,将数据报视为很多 16 位的字串,通过二进制反码求出这些 16 位字的和,将和写入校验和字段;接收方检验也是相同操作。

TCP 协议

特点

解决传输的可靠、有序、无丢失和不重复问题,主要特点有:

  1. 面向连接,是一条逻辑连接;
  2. 点对点、是一对一的;
  3. 提供可靠交付服务;
  4. 提供全双工通信,TCP 连接的两端都有发送和接收缓存;
  5. 面向字节流;

UDP 长度由发送报文决定,而 TCP 报文长度根据接收方 窗口值网络拥塞程度 控制;

TCP 报文段

首部前 20B 是固定的,有一些可选项,数据部分为 4B 的整数倍。首部包括:

  1. 2B 的源端口和目的端口;
  2. 4B 的序号;
  3. 4B 的确认号,期望对方下一个报文段的序号,若确认号为 N,则表示 N-1 及之前的报文都正确收到;
  4. 4 位的数据偏移,表示数据段距离报文段的起始处有多远;单位是 32 位 4B,因此 TCP 首部的最大长度为 60B;
  5. 6 位的保留,为今后使用,置零;
  6. 紧急位 URG,1 位,表示应该尽快传送;
  7. 确认位 ACK,1 位,连接建立后的所有 ACK 都是 1;
  8. 推送位 PSH(push),1 位,表示应该尽快交付给接受应用,而不是等缓存满了再上交;
  9. 复位位 RST(reset),表示连接出现严重差错,需要重新连接;
  10. 同步为 SYN,表示这是一个连接请求或连接接受报文;
  11. 终止位 FIN,释放连接;
  12. 窗口,2B,表示现在允许对方发送的数据量;单位字节;
  13. 校验和,2B,包括首部和数据两部分,计算时同样要加上 12B 的伪首部,只需要将协议字段的 17 改为 6,长度改为 TCP 长度,其余和 UDP 一致;
  14. 紧急指针,2B,指出紧急数据有多少字节,紧急数据在数据段的最前面,因此相当于指针;
  15. 选项,可变长度,最初只规定了一种选项,最大报文段长度(MSS),表示数据字段的最大长度;
  16. 填充,使整个首部的长度是 4B 的整数倍。
tip

一般 MSS 不能太小也不能太大,因为首部会占用一部分,太小了利用率低,太大了 IP 传输时会分片。

TCP 连接管理

分为三个阶段:

  1. 连接建立,要确保双方感知对方存在,允许双方协商参数,如最大窗口值等,能够对运输实体资源进行分配,如缓存大小等;
  2. 数据传送;
  3. 连接释放。

TCP 把连接作为最基本的抽象,其连接的断电不是主机、IP 地址也不是应用,而是 套接字,每条 TCP 线路被两个端点套接字确定;

连接的建立采用客户服务器模型,主动发起连接建立的是 客户

三次握手,服务器进程需要始终保持监听状态,等待用户连接请求

  1. 客户向服务器发送 连接请求 报文,其中同步位 SYN 置 1,同时选择一个初始序列号 x;TCP 规定,该协议不能携带数据,但要消耗掉一个序号;
  2. 若服务器同意连接,则发回确认,同时为该 TCP 连接分配缓存和变量;确认报文中 SYN 和 ACK 都为 1,确认号则是 x+1,同时为自己选择一个序号 y,同样不能携带数据以及需要消耗序号;
  3. 当客户受到确认时,还要向服务器发送确认,并且分配缓存和变量;ACK 为 1,确认号 y+1,需要 x+1,可以携带数据,如不携带数据则不消耗序号
caution

由于服务器端的资源在第二次握手分配资源,容易遭到 SYN 洪泛攻击。

三次握手可以防止失效的请求到达服务器,如第一次连接请求在某个结点长时间滞留,客户超时重发,建立连接后关闭,此时第一次的连接请求到达服务器,服务器将会一直等待。

若使用相同固定的序号建立连接,在频繁建立连接的双方中会出现问题。

四次挥手

  1. 客户向服务器发送 释放报文 段,FIN 为 1,序号为 u,等于前面已传送过的数据的最后一个字节序号加 1,即使不带数据,也消耗序号
  2. 服务器回复确认,ack 为 u+1,seq 为 v,等于前面已传送过的数据的最后一个字节序号加 1,此时处于半关闭状态,但服务器若要发送数据,客户仍要接收,因为服务器到客户的 TCP 连接还未关闭;
  3. 若服务器没有向客户机发送的数据,就通知 TCP 释放连接,FIN 为 1,序号为 w(因为中间可能服务器又发送了一些数据),确认号仍然是上次的 u+1;
  4. 客户还必须返回确认,ack 为 w+1,序号为 u+1 ,再等待 2MSL(最长报文段寿命)后才进入连接关闭状态。
tip

等待 2MSL 的原因是确保返回的确认报文段到达服务器,否则客户关闭而服务器一直不能关闭;

可靠传输

TCP 为每个传输的字节都编上序号,序号是数据段第一个字节的序号;发送方会缓存已发送但还未受到确认的数据,若传输出现问题,只需要让确认号为丢失的字节序号即可。

当超时未受到确认帧时,重传该报文;采用自适应算法,记录 RTT 往返时间(数据报和收到相应确认的时间差),并进行加权求平均 RTTsRTT_{s};RTO 超时重传时间应该稍微大于 RTTsRTT_{s}

当接受到比期望序号更大的数据段时,发送三个 冗余 ACK 表示 后一个 序号的字节丢失,会重传丢失的字节;属于选择重传,

流量控制

基于滑动窗口协议的流量控制机制,基本原理 ,并且允许在通信过程中调整窗口大小。

拥塞控制

发送窗口的上限取拥塞窗口和接收窗口中的较小者。

慢开始:先令拥塞窗口为 1,每受到一个确认则窗口加倍;

拥塞避免:当拥塞窗口达到一个门限值时,就开始线性增长,直到发生拥塞,此时门限值减小为出现拥塞时拥塞窗口的一半,并重新从慢开始增大窗口大小。

caution

慢开始增长的拥塞窗口也不能超过门限值。

快重传:当受到冗余 ACK 时,不必等待重传计时器超时,直接重传;

快恢复:当受到冗余 ACK 时将门限值设为当前拥塞窗口的一半,同时拥塞窗口也折半而不是从 1 开始,并开始线性增长。

caution

后面两种是接收到冗余 ACK 才会使用,因为虽然此时网络拥塞导致丢失数据,但是至少 3 个冗余 ACK 仍然被正确交付了,因此网络拥塞没有太严重,所以直接从门限开始。