网络层:提供主机之间的逻辑通信机制
传输层:提供应用进程之间的逻辑通信机制
Internet 传输层协议
可靠、按序的交付服务(TCP)
拥塞控制
流量控制
连接建立
不可靠的交付服务(UDP)
基于“尽力而为(Best-effort)”的网络层,没有做(可靠性方面的)扩展
两种服务均不保证
延迟
带宽
多路复用/分用
多路分用原理
主机接收到IP数据报(datagram)
每个数据报携带源IP地址、目的IP地址
每个数据报携带一个传输层的段(Segment)
每个段携带源端口号和目的端口号
主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导
向相应的Socket(TCP做更多处理)
UDP
UDP提供的功能
复用/分用
简单的错误校验
“Best effort”服务,UDP段可能
丢失
非按序到达
无连接
UDP发送方和接收方之间不需要握手
每个UDP段的处理独立于其他段
UDP为什么存在?
无需建立连接 ( 减少延迟)
实现简单 : 无需维护连接状态
头部开销少
没有拥塞控制: 应用可更好地控制发送时间和速率
常用于流媒体应用(容忍丢失、速率敏感),还用于DNS、SNMP。
在UDP上实现可靠数据传输?
在应用层增加可靠性机制
应用特定的错误恢复机制
UDP 校验和(checksum)
发送方
将段的内容视为16-bit 整数
校验和计算:计算所有整数的和,再与进位相加,再按位求反,得到校验和
接收方
计算所收到段的校验和
将其与校验和字段进行对比
• 不相等 : 检测出错误
• 相等 : 没有检测出错误 ( 但可能有错误 )
可靠数据传输原理
什么是可靠?不错、不丢、不乱。可靠数据传输(RDT)
下面将渐进地设计可靠数据传输层协议,从简到繁不断提出更完善的版本!
Rdt 1.0(可靠信道上的可靠数据传输)
Rdt 2.0(产生位错误的信道)
Rdt 2.1(应对ACK/NAK被破坏)
如果ACK/NAK坏掉,发送方就识别不了了,但也不能简单地重传,否则可能产生重复分组。如何解决重复分组问题 ?序列号(Sequence number),发送方给每个分组分配序列号0或1,交替发送0号和1号分组。
Rdt 2.2(相比Rdt 2.1去掉NAK)
给发送方发ACK的时候带上分组序号0或1。
Rdt 3.0(信道既可能发生错误 ,也可能丢失分组)
“校验和 + 序列号 + ACK + 重传”够用吗?
发送方等待“合理”时间(需要定时器),如果没收到ACK,重传。如果分组或ACK只是延迟而不是丢了,重传会产生重复,序列号机制能够处理,接收方需在ACK中显式告知所确认的分组。
Rdt 3.0能够正确工作,但性能很差。以上各个版本的设计都是发一个等一个,可以使用流水线滑动窗口机制改进(滑动窗口协议Go-Back-N 、Selective Repeat )。
TCP
点对点(一对一, 一个发送方,一个接收方)
可靠的、按序的字节流
流水线机制(TCP拥塞控制和流量控制机制,设置窗口尺寸)
发送方/接收方缓存
全双工(full-duplex)(同一连接中能够传输双向数据流)
面向连接
通信双方在发送数据之前必须建立连接。
连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
TCP连接包括:两台主机上的缓存、连接状态变量、socket等
流量控制机制(缓冲区大小限制)
TCP使用单一重传定时器,触发重传的事件(超时、收到重复ACK)
拥塞控制(使网络不那么拥塞,具有公平性)
TCP连接的建立和关闭