3.1 概述和运输层服务
- 作用:为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。
- 在运输层的分组称为运输层报文段(segment),
3.1.1 运输层和网络层的关系
- 网络层提供了主机之间的逻辑通信。
- 运输层为不同主机上的进程提供了逻辑通信。
3.1.2 因特网运输层概述
- UDP(用户数据报协议):为应用程序提供了一种不可靠、无连接的服务。
- TCP(传输控制协议):为应用程序提供了一种可靠的、面向连接的服务。TCP还提供如下的附加服务:
- 可靠数据传输(relable data transfer):通过使用流量控制、序号、确认和定时器确保正确地、按序地将数据从发送进程交付给接收进程。
- 拥塞控制(congestion-control):TCP力求为每个通过一条拥塞网络链路的连接平等地共享网络链路带宽,通过调节TCP连接发送端发送进网络流量速率来实现。
- 将主机交付扩展到进程间交付被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)。
3.2 多路复用与多路分解
-
将运输层报文段中的数据交付到正确的套接字的工作称为多路分解(demultiplexing)。
-
在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息生成报文段,然后将报文段传递到网络的工作称为多路复用(multiplexing)。
-
为了实现上述功能,使用源端口号字段(source port number field)和目的端口字段(distination port number field)。
- 端口号是一个16比特的数,大小在0~65535之间。
- 0~1023的端口号称为周知端口号(well-known port number),保留个HTTP和FTP等协议使用。
1.无连接的多路复用与多路分解
一个UDP套接字是由一个二元组来标识,包括一个目的IP地址和目的端口号。
2.面向连接的多路复用与多路分解
TCP套接字是由一个四元组(源IP地址、源端口号、目的IP地址、目的端口号)来标识的。这是因为TCP要保存连接状态。
3.Web服务器和TCP
没内容
3.3 无连接运输:UDP
-
UDP(User Datagram Protocol) 只是做了运输协议能够做的最少工作。包括:
- 复用/分解功能
- 少量的差错检测
-
UDP相比TCP的优点:
- 使用UDP的应用也可以实现可靠数据传输,通过应用层来实现,比如在应用程序中增加确认与重传机制等。
- 速度更快。
- 无需建立连接。
- 不用进行拥塞控制。
- 分组首部开销小,UDP近由8个字节,而TCP由20个字节的首部开销。
-
流行的因特网应用及其运输层协议
应用 | 应用层协议 | 下面的运输层协议 |
---|---|---|
电子邮件 | SMTP | TCP |
远程终端访问 | Telnet | TCP |
Web | HTTP | TCP |
文件传输 | FTP | TCP |
远程文件服务器 | NFS | 通常UDP |
流式多媒体 | 通常专用 | UDP或TCP |
因特网电话 | 通常专用 | UDP或TCP |
网络管理 | SNMP | 通常UDP |
路由选择协议 | RIP | 通常UDP |
域名系统 | DNS | 通常UDP |
3.3.1 UDP报文段结构
3.3.2 UDP检验和
- UDP检验和,通过对UDP报文中的所有16比特字的和进行反码运算,注意在求和时,如果最高位有溢出要进行回卷(即将最高位溢出的结果加到最低位)。
- 在接收方,对所有数据求和的结果将是1111111111111111(因为是数据和加上其反码)。如果有一个比特为0,标识数据出现差错。
3.4 可靠数据传输原理
- 可靠数据传输协议(rliable data transfer protocol)的责任是保证传输数据比特不会受到损坏或丢失,而且所有数据都是按照其发送顺序进行交付。
- 用rdt表示可靠数据传输。
- 用udp标识不可靠数据传输。
3.4.1 构造可靠传输协议
参考可靠传输协议…
1.经完全可靠信道的可靠数据传输:rdt 1.0
- rdt的发送端通过rdt_send(data)事件来接受较高层的数据,产生一个包含该数据的分组packet(通过make_pkt(data)),并将该分组发送到信道上去。
- 在接收端,rdt通过rdt_rcv(packet)事件从底层信道接收一个分组,并从分组中抽取收据(通过extract(packet,data)动作),并将数据上传给较高层(通过deliver_data(data))动作。
- 由于信道完全可信,所以直接发送数据,而不需要任何反馈。
2.经具有比特差错信道的可靠数据传输:rdt 2.0
- rdt2.0在rdt1.0的基础上解决了比特位翻转的问题
- 底层信道实际上可能会在分组中出现比特受损。
- 在计算机网络中,基于重传机制的可靠数据传输协议称为自动重传请求(Automatic Repeat reQuest,ARQ)协议。
ARQ还需要另外三种协议功能来处理比特差错:
- 差错检测
- 接收方反馈:比如用0标识NAK(否定确认) 和用1表示ACK(肯定确认)
- 重传
但是rdt2.0有着一个致命的缺点,只考虑了发送方到接收方的数据传输,如果反馈信息ACK,NAK传输时发生比特位翻转会出现什么情况?如果ACK发生翻转,那么发送方会再次重复的发送相同的数据包;如果NAK发生翻转,那么发送方会认为数据传输情况很好,但是接收方却已经收到了一个错误的数据包。(因为ACK可能会错误,因此多了两个状态)
由此rdt2.1应运而生,在rdt2.0的基础之上,发送方在打包数据包时添加了0或者1编号,同样ACK,NAK字段上也添加了0,1字段,表示0.1号字段的确认或者否定。发送方就有了2种状态发送0号数据包,1号数据包,接收方也有了2种状态等待0号数据包和等待1号数据包。现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回ACK,但是ACK出现翻转,接收方处于等待1号数据状态,发送方重复发送0号数据,接收方会拒绝0号数据,避免重复。如果接收方接收到0号数据包出现错误,返回NAK,但是NAK出现翻转,接收方处于等待0号数据状态,发送方继续发送1号数据,接收方会拒绝1号数据,避免错序。
rdt2.2是在rdt2.1上的基础之上做了小小的改善,摒弃了NAK,只需采用ACK。我们在ACK的信息上加上了期望的顺序号,现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回(ACK,1),发送方接着发送1号数据包。如果接收方接收到0号数据包出现错误,返回(ACK,0),发送方重传0号数据包。
3.经具有比特差错的丢包信道的可靠数据传输:rdt 3.0
- 基于rdt2.2中的技术(检验和、序号、ACK分组和重传等)需要增加一种新的协议解决丢包问题。
- 为了实现基于时间的重传机制,需要一个倒计数定时器(countdown timer),在一个给定的时间过后,可中断发送方。因此需要做到
- 每发送一个分组时,启动一个定时器。
- 响应定时器中断。
- 终止定时器。
3.4.2 流水线可靠数据传输协议
流水线(pipelining)技术可能给可靠传输协议带来如下影响:
- 必须增加序号范围:每个分组都有唯一的序号,
- 接收方和发送方可能需要缓存多个分组。
- 解决流水线的差错恢复的两种基本方法:回退N步(Go-Back-N,GBN)和选择重传(Selectinve Repeat,SR)。
3.4.3 回退N步
在回退N步中,允许发送方发送多个分组而不需等待确认。最大允许数为N。N常被称为窗口长度(window size),GBN协议也常被称为滑动窗口协议。
- 基序号(base):为最早的未确认分组的序号。
- 下一序号(nextseqnum):为最小的未使用的序号
GBN发送方必须相应三种类型的事件:
- 上层的调用:当上层调用rdt_send()时,要检测发送窗口是否已满。如果未满,产