5.1 运输层协议概述
5.1.1 进程之间的通信
图5-1 中两个运输层之间有一个深色双向粗箭头,写明"++运输层提供应用进程间的逻辑通信++"。
图5-1 运输层为相互通信的应用进程提供了逻辑通信
5.1.2 运输层的两个主要协议
5.1.3 运输层的端口
请注意,这种在协议栈层间的抽象的协议端口是软件端口 ,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备 进行交互的接口,而++软件端口是应用层的各种协议进程与运输实体进行层间交互的地点++。
客户在发起通信请求时,必须先知道对方服务器的 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 |
[表5-2 常用的熟知端口号] |
另一类叫作登记端口号,数值为 1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。
(2)客户端使用的端口号 数值为 49151~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫作短暂端口号。
5.2 用户数据报协议 UDP
5.2.1 UDP 概述
++UDP 的主要特点是++:简单方便,但不可靠(多应用类型)
(1)UDP 是++无连接++ 的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP 使用++尽最大努力交付++,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。
(3)UDP 是++面向报文++ 的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
(4)UDP ++没有拥塞控制++,因此网络出现的拥塞不会使源主机的发送速率降低。
(5)UDP ++支持一对一、一对多、多对一和多对多的交互通信++。
(6)++UDP 的首部开销小,只有 8 个字节++,比 TCP 的 20 个字节的首部要短。
5.2.2 UDP 的首部格式
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法相似。但不同的是:IP 数据报的检验和只检验 IP 数据报的首部,但 ++UDP 的检验和是把首部和数据部分一起都检验++。
5.3 传输控制协议 TCP 概述
5.3.1 TCP 最主要的特点
(1)TCP 是**++面向连接++的运输层协议**。
(2)每一条 TCP 连接++只能有两个端点++ (endpoint),每一条 TCP 连接只能是++点对点++的(一对一)。
(3)TCP 提供**++可靠交付++** 的服务。++通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达++。
(4)TCP 提供**++全双工++通信**。TCP 允许通信双方的应用进程在任何时候都能发送数据。
(5)面向字节流 。TCP 中的"流 "(stream)指的是流入到进程或从进程流出的++字节序列++ 。"面向字节流"的含义是:虽然应用程序和 TCP 的交互式一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
5.3.2 TCP 的连接
5.4 可靠传输的工作原理
5.4.1 停止等待协议
全双工通信的双方既是发送方也是接收方。 下面为了讨论问题的方便,我们仅考虑 A发送数据而 B 接收数据并发送确认。因此 A 叫做发送方 ,而 B 叫做接收方 。因为这里是讨论可靠传输的原理,因此把传送的数据单元都称为分组,而并不考虑数据是在哪一个层次上传送的 。"停止等待"就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
1. 无差错情况
2. 出现差错
3. 确认丢失和确认迟到
4. 信道利用率 (优点:简单**;**缺点:信道利用率太低)
5.4.2 连续 ARQ 协议
5.5 TCP 报文段的首部格式
++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报文段++。
5.6 ++TCP 可靠传输的实现++
5.6.1 ++以字节为单位的滑动窗口++
5.6.2 超时重传时间的选择
5.6.3 选择确认 SACK
5.7 TCP 的流量控制
5.7.1 利用滑动窗口实现流量控制
++流量控制++ (flow control)++就是让发送方的发送速率不要太快,要让接收方来得及接收++。
5.7.2 TCP 的传输效率
5.8 TCP 的拥塞控制
5.8.1 拥塞控制的一般原理
在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。++在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫作拥塞(congestion)++。可以把出现网络拥塞的条件写成如下的关系式:
Σ对资源的需求 > 可用资源 (5-7)
拥塞控制 就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不至于过载 。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷 。++拥塞控制是一个++ **++全局性的过程++,**涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
5.8.2 TCP 的拥塞控制方法
TCP 进行拥塞控制的算法有四种:即慢开始 (slow-start)、拥塞避免 (congestion avoidance)、快重传 (fast retransmit)、快恢复(fast recovery)(见草案标准 RFC 5681)。下面就介绍这些算法的原理。为了集中精力讨论拥塞控制,我们假定:
(1)数据是单方向传送的,对方只传送确认报文。
(2)接收方向总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。
1. 慢开始和拥塞避免
拥塞避免 算法的目的是让拥塞窗口 cwnd 缓慢地增大(具体算法见[RFC 5681])。执行算法后的结果大约是这样的:每经过一个往返时间 RTT,发送方的拥塞窗口 cwnd 的大小就加1,而不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就称为"加法增大 "AI (Additive Increase),++表明在拥塞避免阶段,拥塞窗口 cwnd 按线性规律缓慢增长++。
但请注意,++"拥塞避免"并非完全避免拥塞,而是让拥塞窗口增长得缓慢些,使网络不容易出现拥塞++。
5.8.3 主动队列管理 AQM
5.9 TCP 的运输连接管理
5.9.1 TCP 的连接建立
++TCP 建立连接的过程叫作握手,握手需要在客户和服务器之间交换三个 TCP 报文段++。图5-28 画出了三报文握手建立 TCP 连接的过程。
图5-28 用三报文握手建立 TCP 连接
上面给出的++连接 建立过程叫作三报文握手++ 。请注意,在图5-28 中 B 发送给 A 的报文段,也可拆成两个报文段。可以先发送一个确认报文段(ACK = 1,ack = x + 1),然后再发送一个同步报文段(SYN = 1,seq = y)。++这样的过程就变成了四报文握手(释放连接)++,但效果是一样的。
为什么 A 最后还要发送一次确认呢?这主要是++为了防止已失效的连接请求报文段突然又传送到了 B,因而产生错误++。