运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。
网络层提供了主机之间的逻辑通信,而运输层为运行在不同的主机上的进程提供了逻辑通信。
Internet上提供TCP(传输控制协议) 和 UDP(用户数据报协议)两种
一个进程有一个或多个套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。
1.无连接的多路复用与多路分解
在运输层,无连接的网络传输是通过UDP来实现的,一个UDP套接字是由一个含有目的IP地址和目的端口号的一个二元组来全面标识的。
主机收到UDP段后检查段中的目的端口号,并将UDP段导向绑定在该端口号的Socket,因此如果两个UDP报文段有不同的源IP地址/端口号,却有相同的目的端口号,那么两个报文段将通过相同的目的套接字被定向到相同的目的进程。
2.面向连接的多路复用与多路分解
在运输层中面向连接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差别,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。当一个TCP报文段从网络到达一台主机时,主机会使用全部4个值来将报文段定向,即多路分解到相应的套接字。
UDP的优势
UDP报文段结构由RFC 768定义,UDP首部只有4个字段,每个字段由两个字节组成。
1.经完全可靠信道的可靠数据传输 :rdt 1.0
有限状态机(FSM) 可以表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,下图即表示发送方和接收方的有限状态机,底层信道是完全可靠的,发送方和接收方有各自的FSM,每个FSM都只有一个状态。
(图解:FSM描述中的箭头指示了协议从一个状态变迁到另一个状态。引起变迁的事件显示在横线的上方,事件发生时所采用的运动显示在横线的下方。FSM的初始状态用虚线表示。)
2.经具有比特差错信道的可靠数据传输: rdt2.0
下图为rdt 2.0 的有限状态机描述图,该数据传输协议(自动重传请求协议)采用了差错检测、肯定确认与否定确认。
rdt_send(data)
事件时:
sndpkt = make_pkt(data, checksum)
产生一个包含待发送数据且带有校验和的分组udt_send(sndpkt)
发送到信道中rdt_rcv(rcvpkt) && isACK(rcvpkt)
),那么发送方知道最近一个分组已经被正确接收,因此协议返回左边状态,继续等待下一次由较高层传下来的数据发送请求rdt_rcv(rcvpkt) && isNAK(rcvpkt)
),那么发送端知道接收端接收到的分组是受损的,所以调用 udt_send(sndpkt)
重新发送该分组,然后状态不变,继续等待接收接收端的 ACK 或 NAK 分组。在上述协议中,当发送方处于等待ACK或NAK状态时,它不能从上层获得更多数据。这样子的协议被称为停等协议 (stop-and-wait)。
rdt_rcv(rcvpkt) && corrupt(rcvpkt)
,则返回 NAK 分组rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
,则返回 ACK 分组3.经具有比特差错的丢包信道的可靠数据传输 rdt 3.0
在现实的网络环境中,除了比特受损外,底层信道还会丢包;有很多可能的方法可以解决丢包问题,这里我们让发送方负责检测和恢复丢包工作。
假定发送端传输一个数据分组,该分组发生丢失 或者 接收端对该分组的 ACK 发生了丢失。在这两种情况下,发送端都收不到应当到来的接收端的响应。所以,如果发送端愿意等待足够长的时间以确定该分组缺失已丢失,则它只需要重传该数据分组即可。
从发送端的观点来看,重传是一个万能灵药。为了实现基于时间的重传机制,需要一个倒数计时器 (countdown timer),在一个给定的时间量过期之后,可中断发送方。发送方需要做到:1)每次发送一个分组(包括第一次分组和重传分组)时,就启动一个定时器;2)相应定时器中断;3)终止定时器。
下图是rdt 3.0
的发送方FSM,该协议运行在可能发生出错和丢失的信道上。
rdt 2.2 协议中的接收端有限状态机描述图仍然适用于 rdt 3.0 协议,下面我仍然用文字来简要描述一下上图中的发送端发送分组流程:
rdt_send(data)
事件,通过 sndpkt = make_pkt(0, data, checksum)
产生一个序号为 0,包含待发送数据且带有校验和的分组,接着通过 udt_send(sndpkt)
将其发送到信道中并启动定时器,然后状态变迁为“等待接收接收端的 ACK 0”corrupt(rcvpkt)
)或者收到了 ACK 1(即 isACK(rcvpkt, 1)
,也就是收到了自己发送的上一个分组的 ACK),则直接忽略udt_send(sndpkt)
重新发送该分组并重新启动定时器停等协议可能会限制底层网络硬件所提供的能力
解决方法是:不使用停止等待方式,运行发送方发送多个分组而无需等待确认。由于许多从发送方向接收方输送的分组可以被看成是填充到一条流水线中,因此这种技术被称为流水线 (pipelining)。当然,流水线会增加协议的复杂度:
因为信道中的分组要有一个唯一的序号,会有多个分组在信道中未被确认。
发送方至少应该缓存已经发送却还没有被确认的分组。接受方也许应该缓存已经正确接收的分组。
解决流水线差错错误的两种基本思路:回退N步和选择重传。
GBN 协议被称为滑动窗口协议 (silding-window protocol)
选择重传协议让发送方仅重传那些它怀疑在接收方出错的分组,避免了不需要的重传。
参考:
https://www.cnblogs.com/hithongming/p/9379397.html
https://www.cnblogs.com/oxspirt/p/6496434.html
https://www.cnblogs.com/huahuahu/p/liu-shui-xian-ke-kao-shu-ju-chuan-shu-xie-yi.html
计算机网络自顶向下方法第3章-传输层 (Transport Layer).1
原文:https://www.cnblogs.com/xiaoguanqiu/p/10990852.html