计算机网络之传输层
目标
理解
传输服务和协议
在应用进程中提供逻辑通信。
传输层协议运行在端系统。
- 发送端:将应用消息分成段 并传输到网络层。
- 接收端:将段组装成消息 传给应用层。
传输层和网络层的不同
- 传输层:在进程中进行逻辑通信。
- 网络层:在主机中进行逻辑通信。
传输层协议
- 可靠,顺序分发:TCP
- 数据分发和错误检测
- 阻塞控制
- 流控制
- 建立连接
- 不可靠,无顺序分发:UDP
- 只提供数据分发和错误检测
多路分解和多路复用
为什么要多路分解和多路复用
因为某层的一个协议对应直接上层的多个协议/多个实体,则需要多路分解和多路复用。
- 接受端进行多路分解:传输层依据头部信息将收到的segment交给正确的socket,即不同的进程。
- 发送端进行多路复用:从多个socket接受数据,为每块数据封装上头部信息,生成segment,交给网络层。
无连接的多路复用和多路分解(UDP)
一个UDP套接字是由一个二元组来全面标志的,该二元组包含一个目的IP地址和一个目的端口号。因此,如果两个UDP报文段有不同的源IP地址和/或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。
UDP不在乎发送方
面向连接的多路复用和多路分解(TCP)
TCP套接字和UDP套接字之间的一个细微差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识的。这样当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。
特别与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
TCP 在乎发送方
UDP: User Datagram Protocol
- 简单
- 可能导致丢失
- 不按顺序
- 无连接的
- 没有握手
- 每个报文段都单独处理
- 使用:
- 流媒体应用
- DNS
- SNMP
- RIP
- UDP可靠传输:
- 在应用层添加可靠性
- 错误恢复
UDP存在的意义
- 没有阻塞控制:可以根据需要快速分发。
- 没有连接建立:可以减少时延。
- 简单:没有连接状态。
- 更小的头部:TCP 20bytes;UDP 8bytes。
UDP checksum
检测“错误”。
发送方:
- 先带循环进位累加[最高位溢出右移最低位与最低位相加]。
- 累计结果再求补码。
接收方:
- 计算所有接受段的checksum
- 检查计算的校验和是否等于校验和字段值(1111111111111111)。如果不是则检测到错误,如果是则没有检测到错误。
可靠数据传输的基本原理
Rdt1.0
Rdt2.0:产生位错误的信道
- 底层信道可能翻转分组中的位(bit)
- 利用校验和检测位错误
- 如何从错误中恢复
- 确认机制ACK:接收方显式地告知发送方分组已确认接收。
- NAK:接收方显式地告知发送方分组有错误。
- 发送方收到NAK之后,重传分组
基于这种重传机制的rdt协议成为ARQ(Automatic Repeat reQuest)协议
Rdt2.0引入的新机制:
- 差错检测
- 接收方反馈控制消息:ACK / NAK
- 重传
停-等协议
缺陷:如果ACK/NAK消息发生错误/被破坏会怎么样?
- 为ACK/NAK添加校验和 X
- 发送方接收到被破坏的ACK/NAK时不知道接收方发生了什么,添加额外的控制消息 X
- 如果ACK/NAK坏掉,发送方重传。不能简单的重传,会产生重复分组。如何解决重复分组:
- 序列号(Sequence number):发送方给每个分组增加序列号。
- 接收方丢弃重复分组。
Rdt2.1:应对ACK/NAK破坏
发送方
接收方
Rdt2.2:无NAK消息协议
与rdt2.1功能相同,但是只使用ACK
如何实现?
- 接受方通过ACK告知最后一个被正确接受的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复ACK之后,采取与收到NAK消息同样的动作
- 重传当前分组
Rdt3.0
发送方FSM