传输层的任务:进程到进程的通信。由于它支持端点应用程序之间的通信,因此,传输层协议有时也称为端到端协议。
两种因素促成了端到端协议的形成,从其上层看,需要使用传输层服务的应用层进程有一些特殊的需求,下面列出了希望传输层能提供的一些常用的特性:
1.确保消息成功传输。
2.消息按序传输。
3.最多传送每个消息的一个副本。
4.支持任意大的消息。
5.支持发送方与接收方之间的同步。
6.允许接收方对发送方进行流量控制。
7.支持每台主机上的多个应用程序。
......
从其下层看,传输层协议赖以运行的下层网络所能提供的服务能力有某些限制。其中比较典型的下层网络可能会:
1.丢弃消息。
2.使消息乱序。
3.传送一个消息的多个副本。
4.限制消息的大小。
5.在任意长延迟后才发送消息。
这样的网络被称为是提供尽力而为的服务,因特网就是这样一个网络的一个实例。
简单多路分解协议UDP:
最简单的传输协议是把下层网络的主机到主机的传递服务扩展到进程到进程的通信服务,任何主机上都可能运行多个进程,因此该协议至少需要增加一个多路分解功能,以便每台主机上的多个进程能够共享网络,除此之外,传输协议不再向下层网络提供的尽力而为的服务增加任何其他功能。因特网提供的用户数据报协议(UDP)就是这样的传输协议。
在这样的一个协议中,唯一值得注意的问题是用来标识目的进程的地址形式,使用一个称为端口的抽象的定位器,使进程之间能够间接地相互识别,基本思想是,源进程相端口发送消息而目的进程从端口接收消息。
实现该多路分解功能的端到端协议的首部通常包含消息的发送方(源)和接收方(目的)的标识符(端口)。进程通过特定主机上的某个端口(即一个对)标识的。实际上,这个对构成了UDP协议的多路分解密钥。
一个发送进程如何知道接收进程的端口号?服务器进程在一个知名端口接收消息,就是说,每个服务器进程在某个固定的广为公布的端口接收消息。
可靠的字节流TCP:
提供可靠的、面向连接的字节流服务。全双工协议,也就是说,每个TCP连接支持一对字节流,每个方向一个字节流,对这两个字节流中的每个流,它还包含一个流量控制机制,允许接收方限制发送方在给定时间内发送多少数据。另外,TCP支持多路分解机制,允许任何主机上的多个应用程序同时与它们各自的对等实体进行对话,此外,TCP也实现了一个经过高度调整的拥塞控制机制,这种机制的思想是控制TCP发送数据的速度,其目的不是为了防止发送方发出的数据超出接收方的接收能力,而是防止发送方发出的数据超出网络的容量。
流量控制防止发送方发出的数据超出接收方的接收能力;拥塞控制防止过多的数据注入网络而造成交换机或链路超载。因此,流量控制是一个端到端的问题,而拥塞控制是主机如何同网络交互的问题。
1.端到端的问题:
TCP的核心是滑动窗口算法。
(1)首先,TCP支持运行在因特网中任意两台计算机上的进程之间的逻辑连接,TCP需要有明确的连接建立阶段,使连接的双方同意相互交换数据。TCP也有一个明确的断开连接阶段,在连接建立阶段发生的事件之一,是双方建立某种共享状态使滑动窗口算法开始运行。连接断开阶段是必要的,因为只有这样双方主机才知道是释放这种状态的时候。
(2)TCP连接很可能具有差异很大的往返时延。对于滑动窗口算法而言,意味着触发重传的超时机制必须具有适应性。
(3)失序的分组多长时间能到达,换句话说,分组多晚才到达目的地。是不是会搅乱已排好序的分组。
(4)流量控制。
(5)拥塞控制。
在TCP中,下层的IP网络被认为是不可靠的,而且会使传递消息错序;TCP在端到端的基础上利用滑动窗口算法提供可靠的/有序的传送。
2.报文段的格式
SrcPort和DstPort字段分别表示源端口和目的端口。这两个字段加上源IP地址和目的IP地址,组合成每个TCP连接的惟一标识。也就是说,TCP的多路分解密钥由四元组给出:
DstIPAddr>
注意,因为TCP连接有始有终,所以有可能在某一对端口间建立了一个连接,并用它发送和接收数据,然后关闭掉。接着在一段时间后,第二个连接又使用这同一对端口。我们有时把这种情况称为相同连接的两个不同实例。
Acknowledgment,SequenceNum和AdvertisedWindow字段都在TCP的滑动窗口算法中使用。因为TCP是面向字节的协议,所以数据的每个字节都是有序号;SequenceNum字段包含报文段携带数据的第一个字节的序号。Acknowledgment和AdvertisedWindow向相反方向流动。
6比特的Flags字段用来在TCP对等实体间传递控制信息。可能的标志位有SYN,FIN,RESET,PUSH,URG和ACK。
......
3.连接的建立与终止
建立连接:一方执行主动打开操作,而接受连接的一方执行被动打开操作。只有在连接建立阶段完成以后,双方才开始发送数据。同样的,当其中一方发送完数据,就会关闭一个方向的连接,这就使TCP开始一轮终止连接的消息,注意,尽管连接的建立是一个非对称的活动(一方执行被动打开而另一方执行主动打开),但是连接的断开则是对称的活动(每一方必须独立地关闭连接)。因此,有可能一方已经完成了关闭连接,意味着它不再发送数据,但是另一方却仍保持双向连接的另一半为打开状态并且继续发送数据。
三次握手:
算法的思想是双方需要商定一些参数,在打开一个TCP连接的时候,参数就是双方打算为各自的字节流使用的开始序号,通常,参数可以是每一方希望另一方了解的任何情况。首先,客户机(主动参与方)发送一个报文段给服务器(被动参与方),声明它将使用的初始序号(Flags
= SYN, SequenceNum = x)。服务器用一个报文段响应,确认客户端的序号(Flags = ACK, Ack = x +
1),同时声明自己的初始序号(Flags = SYN, SequenceNum =
y),也就是说,第二个报文段的Flags字段的SYN和ACK位被置位,最后,客户机用第三个报文段响应,确认服务器的序号(Flags =
ACK, Ack = y
+1)。每一端的确认序号比发送来的序号大1的原因是Acknowledgment字段实际指出希望接收的下一个序号,从而隐含地确认前面所有的序号。前两个报文段都使用计时器。
状态转换图:
滑动窗口再讨论:
TCP的滑动窗口算法的变体,它服务于这样几个目的:(1)保证数据的可靠传递;(2)确保数据的有序传递;(3)增强发送方和接收方之间的流量控制。TCP使用一个固定尺寸的滑动窗口,而是由接收方向发送方通知它的窗口尺寸。这是通过使用TCP首部的AdvertisedWindow字段完成的,此后,发送方在任意给定时刻未被确认的字节数就不能超过AdvertisedWindow的值。接收方根据分配给连接用于缓存数据的内存数量,为AdvertisedWindow选择一个合适的值。其思想是不使发送方发送的数据超过接收方缓冲区的限度。
可靠和有序的传输
.......