图5-1 中两个运输层之间有一个深色双向粗箭头,写明“运输层提供应用进程间的逻辑通信”。
图5-1 运输层为相互通信的应用进程提供了逻辑通信
请注意,这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。
客户在发起通信请求时,必须先知道对方服务器的 IP 地址(用来找到目的主机)和端口号(用来找到目的进程)。因此运输层的端口号分为下面的两大类。
(1)服务器端使用的端口号 这里又分为两类,最重要的一类叫作熟知端口号(well-known port number)或全球通用端口号,数值为 0~1023。
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP | SNMP(trap) | HTTPS |
---|---|---|---|---|---|---|---|---|---|
熟知端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 | 162 | 443 |
另一类叫作登记端口号,数值为 1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。
(2)客户端使用的端口号 数值为 49151~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫作短暂端口号。
UDP 的主要特点是:简单方便,但不可靠(多应用类型)
(1)UDP 是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。
(3)UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
(4)UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
(5)UDP 支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法相似。但不同的是:IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和是把首部和数据部分一起都检验。
(1)TCP 是面向连接的运输层协议。
(2)每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
(3)TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。
(5)面向字节流。TCP 中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互式一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
全双工通信的双方既是发送方也是接收方。 下面为了讨论问题的方便,我们仅考虑 A发送数据而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。因为这里是讨论可靠传输的原理,因此把传送的数据单元都称为分组,而并不考虑数据是在哪一个层次上传送的 。“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
1. 无差错情况
2. 出现差错
3. 确认丢失和确认迟到
4. 信道利用率 (优点:简单 ;缺点:信道利用率太低)
TCP 报文段首部的前 20 个字节是固定的(如图5-13 所示),后面有 4n 字节是根据需要而增加的选项(n 是整数)。因此 TCP 首部的最小长度是 20 字节。
首部固定部分各字段的意义如下:
(1)源端口和目的端口
(2)序号
首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
(3)确认号 占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号 = N,则表明:到序号 N-1 为止的所有数据都已正确收到。
(4)数据偏移
(5)保留
(6)紧急 URG(URGent)
(7)确认 ACK(ACKnowledgment)
(8)推送 PSH(PuSH)
(9)复位 RST(ReSeT)
(10)同步 SYN(SYNchronization)
(11)终止 FIN(FINish,意思是“完了”“终止”)
(12)窗口
(13)检验和
(14)紧急指针
(15)选项
TCP 最初只规定了一种选项, 即最大报文段长度 MSS (Maximum Segment Size) [RFC879]。请注意MSS这个名词的含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。
流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫作拥塞(congestion)。可以把出现网络拥塞的条件写成如下的关系式:
Σ对资源的需求 > 可用资源 (5-7)
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不至于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
TCP 进行拥塞控制的算法有四种:即慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)(见草案标准 RFC 5681)。下面就介绍这些算法的原理。为了集中精力讨论拥塞控制,我们假定:
(1)数据是单方向传送的,对方只传送确认报文。
(2)接收方向总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。
1. 慢开始和拥塞避免
拥塞避免算法的目的是让拥塞窗口 cwnd 缓慢地增大(具体算法见[RFC 5681])。执行算法后的结果大约是这样的:每经过一个往返时间 RTT,发送方的拥塞窗口 cwnd 的大小就加1,而不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就称为“加法增大”AI(Additive Increase),表明在拥塞避免阶段,拥塞窗口 cwnd 按线性规律缓慢增长。
但请注意,“拥塞避免”并非完全避免拥塞,而是让拥塞窗口增长得缓慢些,使网络不容易出现拥塞。
TCP 建立连接的过程叫作握手,握手需要在客户和服务器之间交换三个 TCP 报文段。图5-28 画出了三报文握手建立 TCP 连接的过程。
图5-28 用三报文握手建立 TCP 连接
上面给出的连接建立过程叫作三报文握手。请注意,在图5-28 中 B 发送给 A 的报文段,也可拆成两个报文段。可以先发送一个确认报文段(ACK = 1,ack = x + 1),然后再发送一个同步报文段(SYN = 1,seq = y)。这样的过程就变成了四报文握手(释放连接),但效果是一样的。
为什么 A 最后还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了 B,因而产生错误。