目录
5.1 运输层概述
之前所介绍的物理层、数据链路层、网络层它们共同实现了主机到主机的通信,但实际上在计算机网络进行通信的真正实体是位于通信两端主机中的进程。
如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称端到端协议。
运输层使应用进程看见的就好像是在两个运输层实体之间有一条端到端 的逻辑通信信道。
根据应用需求的不同,互联网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP,这两种协议就是本章讨论的主要内容。
5.2 端口号、复用&分用
运行在计算机上的进程使用进程标识符PID来标志,不同的操作系统又使用不同的进程标识符。
为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。
TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。
端口号用16比特表示,取值范围0~65535:
- 熟知端口号:0~1023,指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53
- 登记端口号:1024~49151,为没有熟知端口号的应用程序使用
- 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后这个端口号可供其他客户进程以后使用。
端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程。
复用:应用层的所有应用进程都可以通过运输层再传送到IP层(网络层)
分用:运输层从IP层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程
5.3 UDP和 TCP的对比
用户数据报协议UDP
- 无连接
- 支持单播、多播、广播
- 面向报文
- 不可靠传输
- UDP用户数据报首部仅8字节
传输控制协议TCP
- 面向连接
- 仅支持单播
- 面向字节流
- 可靠传输
- TCP报文段首部最小20字节,最大60字节
5.4 TCP流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
下假设B的接收窗口初始为400字节,如图
若调整窗口的报文丢失,发送方会无法得知此时接受方已经有新的空间,而接收方却一直在等待,从而形成死锁局面。
故引入零窗口探测报文。
而零窗口探测报文也有重传计时器,不会因丢失造成死锁延续。
5.5 TCP拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
下介绍TCP拥塞控制的四种算法
先假定以下条件:
(1)数据是单方向传送的,而另一个方向只传送确认
(2)接收方总是有足够大的缓存空间,因而发送方的发送窗口的大小由网络拥塞程度来决定
(3)以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位
发送方维护一个叫拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。
维护原则是只要网络没有出现拥塞,拥塞窗口就增大一些;出现网络拥塞就减小一些。
网络拥塞的依据:没有按时收到应当到达的确认报文(超时重传)。
发送方将拥塞窗口作为发送窗口swnd,即swnd=cwnd。
维护一个慢开始门限ssthresh状态变量:
当cwnd<ssthresh,使用慢开始算法
当cwnd>ssthresh,停用慢开始算法改用拥塞避免算法
“慢开始”是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢;
“拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络不容易拥塞。
所谓“快重传”,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。
要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认;
即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认;
发送方一旦收到了3个连续的重复确认,就将相应的报文段立即重传。
发送方收到3重复确认后知道现在只是丢失了个别报文段,执行“快恢复”算法,而不是慢开始。
将慢开始门限和拥塞窗口的值调整为当前的一半,开始执行拥塞避免算法。
5.6 TCP超时重传时间的选择
由上可见,RTT的测量很重要,若因RTT测量错误使得RTO偏大(偏小),会降低传输效率(增大网络负荷)
出现超时重传时,新的RTO=2倍的旧RTO
5.7 TCP可靠传输的实现
TCP基于以字节为单位的滑动窗口来实现可靠传输
后沿可能不动(没有收到新的确认),可能前移(收到了新的确认)。
前沿通常不断向前移动,若不动,1是没有收到新的确认且对方通知的窗口大小没变,2是收到新的确认但是对方通知的窗口缩小刚好使前沿不动
使用三个指针P1、P2、P3描述发送窗口状态
- P3-P1=发送窗口的尺寸
- P2-P1=已发送但尚未收到确认的字节数
- P3-P2=允许发送但尚未发送的字节数(可用窗口/有效窗口)
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大。
网络传送窗口值要经历不确定的的时间滞后。
发送方可能会根据拥塞程度适当减小发送窗口。
对于不按序到达的数据,TCP并无明文规定。
如果接收方把不按序到达的数据一律丢弃,那么接收方的窗口管理会很简单,但发送方重复传输大量数据引起网络资源浪费。
通常将不按序到达的数据存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
TCP要求接收方必须有累计确认和捎带确认机制,这样可以减小传输开销。
接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便带上。
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,反而浪费了网络资源。
TCP的通信是全双工的,每一方都有自己的发送窗口和接收窗口。
5.8 TCP运输连接的管理
TCP是面向连接的协议,基于运输连接来传送TCP报文段,运输连接的建立与释放是每一次通信必不可少的。
运输连接三步:1)“三报文握手” 2)数据传输 3)“四报文挥手”
TCP的运输连接管理就是使运输连接的建立和释放都能正常进行。
注意:1)SYN=1的报文段不能携带数据,但要消耗掉一个序号 2)普通的确认报文段如不携带数据,则不消耗序号
此外,TCP还设有保活计时器。
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器。
若保活计时器定时周期内未收到客户进程发来的数据,则当保活计时器到时后,TCP服务器进程就向客户进程发送一个探测报文段,以后则每隔75秒发送一次。若一连发送十个探测报文段后仍无TCP客户进程的响应,服务器进程关闭该连接。
5.9 TCP报文段的首部格式
源端口号:占16比特,用来标识发送该TCP报文段的应用进程。
目的端口号:占16比特,用来标识接收该TCP报文段的应用进程。
序号:占32比特,指出本TCP报文段数据载荷的第一个字节的序号。
确认号:占32比特,指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
确认标志位ACK:取值为1时确认号字段才有效,0无效。(TCP规定连接建立后所有TCP报文段都必须把ACK置1)
数据偏移:占4比特,以4字节为单位,用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。
这个字段实际上指出了TCP报文段的首部长度,最小是0101,最大是1111。
保留:占6比特,保留为今后使用,应置0。
窗口:占16比特,以字节为单位,指出发送本报文段的一方的接收窗口,这是以接收方的接收能力来控制发送方的发送能力(流量控制)。
校验和:占16比特,检查范围包括首部和数据载荷。计算时与UDP类似,要在TCP报文段前加上12字节的伪首部。
同步标志位SYN:在TCP连接建立时用来同步序号。
终止标志位FIN:用来释放TCP连接。
复位标志位RST:用来复位TCP连接。RST=1时,表明TCP连接出现异常,必须释放连接再重新建立。RST置1还用来拒绝非法报文段或拒绝打开一个TCP连接。
推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程。
紧急标志位URG:取值为1时紧急指针字段有效,0无效。
紧急指针:占16比特,以字节为单位,指明紧急数据的长度。
当发送方有紧急数据,可插队到发送缓存的最前面,立即封装发送。紧急指针会指出本报文段包含了多少紧急数据,紧急数据后是普通数据。
选项:
填充:确保报文段字节数能被4整除。