运输层概述

  • 物理层, 数据链路层, 网络层共同解决了将主机通过异构网络互联起来所面临的问题, 实现了主机到主机的通信

  • 但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程

  • 如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务, 运输层协议又称为端到端协议

    image-20250119232748232

  • 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑, 所采用的路由选择协议等), 它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道

  • 根据应用需求的不同, 因特网的运输层为应用层提供了两种不同的运输协议, 即面向连接的TCP无连接的UDP

端口号

  • 运行在计算机上的进程使用进程标识符PID来标志

  • 不同操作系统又使用不同格式的进程标识符, 所以必须使用统一的方法对TCP/IP体系的应用进程进行标识

  • TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程

    • 端口号使用16bit表示, 取值范围0~65535
      • 熟知端口号: 0~1023, IANA把这些端口号指派给TCP/IP体系中最重要的一些应用协议, 例如: FTP使用21/20, HTTP使用80, DNS使用53
      • 登记端口号: 1024~49151, 为没有熟知端口号的应用程序使用, 使用这些端口号必须在IANA按照规定的手续登记, 以防止重复, 例如: Microsoft RDP微软远程桌面使用的端口是3389
      • 短暂端口号: 49152~65535, 留给客户进程选择暂时使用, 当服务器进程收到客户进程的报文时, 就知道了客户进程所使用的动态端口号, 通信结束后, 这个端口号可供其他客户进程以后使用
    • 端口号只具有本地意义, 即端口号只是为了标识本计算机应用层中的各进程, 在因特网中, 不同计算机中的相同端口号是没有联系的

复用与分用

image-20250119232757187

  • TCP/IP体系的应用层常用协议所使用的运输层熟知端口号

    image-20250119232802231

示例

  • 假设用户PC与DNS服务器, Web服务器通过交换机互联, Web服务器域名为www.porttest.com, DNS服务器中有www.porttest.com的IP地址, PC将要通过域名访问Web

  • PC发送DNS查询请求获取域名对应的IP地址

    image-20250119232810846

  • DNS服务器收到PC请求, 向PC发送DNS响应

    image-20250119232818396

  • PC收到响应后知道了所要访问域名对应的IP地址, 则向Web发送HTTP请求

    image-20250119232822985

  • Web服务器收到PC请求后, 向PC发送HTTP响应

    image-20250119232826952

  • PC收到响应后解析内容, 进行显示

    image-20250119232831488

UDP和TCP的对比

image-20250119232838231

image-20250119232844043

image-20250119232849651

image-20250119232854407

image-20250119232859822

image-20250119232904942

TCP

流量控制

  • 让发送方的发送速率不要太快, 要让接收方来得及接收

  • 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制

  • 示例

    image-20250119232911196

image-20250119232916190

image-20250119232921829

拥塞控制

  • 在某段时间, 若对网络中某一资源的需求超过了该资源所能提供的可用部分, 网络性能就要变坏, 这种情况就叫做拥塞

  • 出现拥塞而不进行控制, 整个网络的吞吐量将随输入负荷的增大而下降

    image-20250119232927164

  • 发送方维护一个叫做拥塞窗口cwnd的状态变量, 其值取决于网络的拥塞程度, 并且动态变化

    • 拥塞窗口cwnd的维护原则: 只要网络没有出现拥塞, 拥塞窗口就再增大一些, 但只要网络出现拥塞, 拥塞窗口就减少一些
    • 判断出现网络拥塞的依据: 没有按时收到应当到达的确认报文(即发送超时重传)
  • 发送方将拥塞窗口作为发送窗口swnd, 即swnd = cwnd

  • 维护一个慢开始门限ssthresh状态变量

    • 当cwnd < ssthresh时, 使用慢开始算法

    • 当cwnd > ssthresh时, 停止使用慢开始算法而改用拥塞避免算法

    • 当cwnd = ssthresh时, 既可使用慢开始算法, 也可使用拥塞避免算法

      image-20250119232931681

超时重传时间的选择

  • 超时重传时间RTO应略大于往返时间RTT

  • 不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO

  • 利用每次测量得到的RTT样本, 计算加权平均往返时间RTTs(又称为平滑的往返时间)

    • RTTs1 = RTTi
    • 新的RTTS = (1 - α) × 旧的RTTs + α × 新的RTT样本
    • 在上式中, 0 ≤ α < 1
      • 若α很接近于0, 则新RTT样本对RTTs的影响不大
      • 若α很接近于1, 则新RTT样本对RTTs的影响较大

可靠传输的实现

TCP可靠传输的实现

  • TCP基于以字节为单位的滑动窗口来实现可靠传输

  • 虽然发送方的发送窗口时根据接收方的接收窗口设置的, 但在同一时刻, 发送方的发送窗孔并不总是和接收方的接收窗口一样大

    • 网络传送窗口值需要经历一定的时间滞后, 并且这个时间还是不确定的
    • 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸
  • 对于不按序到达的数据应如何处理, TCP并无明确规定

    • 如果接收方把不按序到达的数据一律丢弃, 那么接收窗口的管理将会比较简单, 但这样做对网络资源的利用不利, 因为发送方会重复传送较多的数据
    • TCP通常对不按序到达的数据是先临时存放在接收窗口中, 等到字节流中所缺少的字节收到后, 再按序交付上层的应用进程
  • TCP要求接收方必须有累积确认和捎带确认机制, 这样可以减小传输开销, 接收方可以在合适的时候发送确认, 也可以在自己有数据要发送时把确认信息顺便捎带上

    • 接收方不应过分推迟发送确认, 否则会导致发送方不必要的超时重传, 反而浪费了网络资源
    • 捎带确认实际上并不经常发生, 因为大多数应用程序很少同时在两个方向上发送数据
  • TCP的通信是全双工通信, 通信中的每一方都在发送和接收报文段, 因此, 每一方都有自己的发送窗口和接收窗口

运输连接管理

TCP的连接建立

  • 解决的问题

    • 使TCP双方能够确知对方的存在
    • 使TCP双方能够协商一些参数(如最大窗口值, 是否使用窗口扩大选项和时间戳选项以及服务质量等)
    • 使TCP双方能够对运输实体资源(如缓存大小, 连接表中的项目等)进行分配
  • 三报文握手

    image-20250119232940637

    • SYN: 同步位

    • seq: 序号字段

    • ACK: 确认位

    • ack: 对序号字段的确认

    • SYN = 1 && ACK = 1: 表示为TCP连接请求确认报文段

    • TCP的标准规定, SYN = 1的报文段不能携带数据, 但要消耗掉一个序号: 如第一二次握手

    • TCP的标准规定, 普通的确认报文段如果不携带数据, 则不消耗序号: 如第三次握手, 下一次发送报文的seq字段仍为x + 1, 因为第三次握手不携带数据, 不消耗序号

    • 若只有二次握手, 则会有如下情形

      image-20250119232945690

TCP的连接释放

  • 四报文挥手

    image-20250119232950176

    • FIN: 终止位

    • MSL(Maximum Segment Lifetime): 最长报文段寿命

    • FIN = 1 && ACK = 1: 表示为TCP连接释放报文

    • TCP的标准规定, FIN = 1的报文段即使不携带数据, 也要消耗掉一个序号

    • 如果TCP客户进程不等待2MSL, 则会有如下情形

      image-20250119232955028

  • 若在数据传输过程中, TCP客户进程出现故障, TCP服务进程该如何发现?

    image-20250119232959232

    • TCP服务器进程每收到一次TCP客户进程的数据, 就重新设置并启动保活计时器(2小时定时)

    • 若保活计时器定时周期内未收到TCP客户进程发来的数据, 则当保活计时器到时后, TCP服务器进程就向TCP客户进程发送一个探测报文段, 以后则每隔75秒发送一次, 若一连发送10个探测报文段后仍无TCP客户进程的响应, TCP服务器进程就认为TCP客户进程所在主机出了故障, 接着就关闭这个连接

TCP报文段的首部格式

image-20250119233004912

  • TCP报文段由首部数据载荷两部分构成

  • TCP的全部功能都体现在它首部中各字段的作用

image-20250119233010375

  • 源端口

    • 占16bit, 写入源端口号, 用来标识发送该TCP报文段的应用进程
  • 目的端口

    • 占16bit, 写入目的端口号, 用来标识接收该TCP报文段的应用进程
  • 序号

    • 占32bit, 序号增加到最后一个后, 下一个序号就又回到0
    • 指出本TCP报文段数据载荷的第一个字节的序号
  • 确认号

    • 占32bit, 确认号增加到最后一个后, 下一个确认号就又回到0
    • 指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号, 同时也是对之前收到的所有数据的确认
    • 若确认号 = n, 则表明到序号n - 1为止的所有数据都已经正确接收, 期望接收序号为n的数据
  • 确认标志位ACK

    • 取值为1时确认号字段才有效; 取值为0时确认号字段无效
    • TCP规定, 在连接建立后所有传送的TCP报文段都必须把ACK置1
  • 数据偏移

    • 占4bit, 以4字节为单位
    • 用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远
    • 这个字段实际上是指出TCP报文段的首部长度
      • 首部固定长度为20字节, 因此数据偏移字段的最小值为(0101)2
      • 首部最大长度为60字节, 因此数据偏移字段的最大值为(1111)2
  • 保留

    • 占6bit, 保留为今后使用, 目前应置为0
  • 窗口

    • 占16bit, 以字节为单位
    • 指出发送本报文段的一方的接收窗口
    • 窗口值作为接收方让发送方设置其发送窗口的依据
    • 这是以接收方的接收能力来控制发送方的发送能力, 称为流量控制
    • 取值为接收窗口和拥塞窗口中较小者
  • 校验和

    • 占16bit, 检查范围包括TCP报文段的首部和数据载荷两部分
    • 在计算校验和时, 要在TCP报文段前面加上12字节的伪首部
  • 同步标志位SYN

    • 在TCP连接建立时用来同步序号
  • 终止标志位FIN

    • 用来释放TCP连接
  • 复位标志位RST

    • 用来复位TCP连接
    • 当RST = 1时, 表明TCP连接出现了异常, 必须释放连接, 然后再重新建立连接
    • RST置为1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接
  • 推送标志位PSH

    • 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程, 而不必等到接收缓存都填满后再向上交付
  • 紧急标志位URG

    • 取1时紧急指针字段有效, 否则无效
  • 紧急指针

    • 占16bit, 以字节位单位, 用来指明紧急数据的长度
    • 当发送方有紧急数据时, 可将紧急数据插队到发送缓存的最前面, 并立刻封装到一个TCP报文段中进行发送, 紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据, 紧急数据之后是普通数据
  • 选项

    • 最大报文段长度MSS选项: TCP报文段数据载荷部分的最大长度
    • 窗口扩大选项: 为了扩大窗口(提高吞吐率)
    • 时间戳选项
      • 用来计算往返时间RTT
      • 用于处理序号超范围的情况, 又称为防止序号绕回PAWS
    • 选择确认选项
  • 填充

    • 确保报文段首部能被4整除

NAT和PAT的应用

  • 网络地址转换技术NAT(Network Address Translation) 主要用于实现位于内部网络的主机访问外部网络的功能。当局域网内的主机需要访问外部网络时,通过NAT技术可以将其私网地址转为公网地址,并且多个私网用户可以共用一个公网地址,这样既可保证网络互通,又节省了公网地址

  • 举例

    image-20250119233020422

    • 客户端172.18.250.6和百度服务器202.108.22.5通信,172.18.250.6发送数据时,先转换为219.155.6.240:1723(任意>1024的随机端口),然后再利用这个身份发送数据给百度服务器,然后百度服务器回应数据并发送给219.155.6.240:1723,NAT网关检查自己的关联表,意识到这是自己地私网中172.18.250.6的数据包,然后把这个数据发送给客户端