运输层-TCP、UDP
运输层协议概述
通常我们认为的通信是两个计算机之间的通信,严格的来讲是计算机中的两个应用程序的通信。实际上完成的是端到端的通信,这就是运输层的作用:为计算机的应用进程提供逻辑通信。
网络层是为主机之间提供通信。运输层屏蔽了网络层通信的细节,使应用程序认为他们是直接通信的。
端口
两台计算机的应用程序想要进行通信,必须要有表示程序的标识。应用程序在一个计算机中是通过进程标识符唯一确定的,而应用程序的创建、运行是短暂。所有必须有一个长久的标识符:端口。计算机使用的端口可以不相同,我们只用把数据报发送到指定端口,使用这个端口的是谁由本地计算机决定。
两种协议
运输层有两种协议
-
TCP(传输控制协议)
- 面向连接
- 每个TCP连接只能有连个端点,即TCP只能一对一通信
- TCP提供可靠服务
- TCP提供全双工通信
- 面向字节流。虽然应用程序交付给运输层是数据块,但TCP仅仅把它看做一串无结构的字节流。TCP不保证发送方发送的数据块和接收方接收的数据块大小对应,但保证接收收到的字节流和发送方一致。
-
UDP(用户数据报协议)
- 面向无连接
- 尽最大努力交互
- UDP是面向报文的。UDP对应用程序交下来的报文不管多大都不进行任何拆分和合并,只在报文前添加UDP首部后,就交给网络层传输。
- UDP没有拥塞控制
- UDP支持一对多、多对一、一对一、多对多通信
- UPD首部开销较小,只有8个字节
用户数据报UDP
传输控制协议TCP概述
TCP连接的端点不是主机、不是主机IP、不是应用进程端口,而是套接字(Socket)。套接字是IP+port。每一条TCP连接被两个套接字所确定。
- TCP连接是由软件所提供的一种抽象
- 同一IP地址可有多个TCP连接
- 同一端口也可有多个TCP连接
TCP可靠传输的工作原理
理想传输有一下两个特点:
- 数据在传输信道上无差错
- 发送方不管以多高的速度发送数据,接收方总能来的即处理数据
然而现实中的网络传输并不具备这样的条件,必须使用一些可靠传输的协议保证可靠传输。
停止等待协议
每发送一组数据就停止发送,等待接收方确认,收到确认信息后再发送下一组数据。
在传输工程中接收方会出现以下两种差错:
- 接收方B检测到数据出现了差错,就丢弃数据,什么也不做。
- 接收方没有收到M1组信息,这时接收方什么也不知道,当然也什么都不做。
要保证可靠传输,发送方必须重新发送分组,保证接收方收到分组。
问题一:发送方A如何知道接收方B是否收到信息呢
- 超时重传:
- A每发送一组数据就启动一个超时计时器
- 如果A在计时器时间范围内收到B的确认消息,就撤销该超时计时器,继续发送下一组数据
- 如果A未在规定时间内收到B的确认信息,就重新发送该分组信息。
问题二:如果A发送的信息,B正确的接收了,但是发送的确认信息延迟了,A重新发送了该组数据。那么B是如何知道接收的是重复的数据呢?
- 分组数据编号:
- A为每一组发送的数据编号,B如果接收到了编号重复的数据,就丢弃,并发送确认信息。
- B恢复的确认信息也会进行编号,指示该确认信息对应哪一组数据
- A收到了信息,并确定它是哪一组的,如果重复了就丢弃,避免重新发送
注意:
- 再发送完一个分组必须暂时保留该分组信息副本,以备重发
- 分组和确认信息必须编号
- 超时计时器的时间必须比平均往返时间长
自动重传请求ARQ
通常A总是能收确认信息,如果A不断发送分组信息,但不能收到确认信息就认为网络太差不能进行可靠传输。像这种可靠传输协议通常称为自动重传请求。即接收方不需要发送信息请求重新发送不正确的分组数据。
流水线传输
停止等待协议虽然比较简单,但是信道利用率很低。
TD 是分组发送时间,TA 是确认信息发送时间,RTT是分组数据和确认数据传输时间
为了提高信道利用率,可以使用流水线传输。
TCP可靠传输的实现
连续ARQ协议
- 发送方一次可以发送多个分组
- 发送方和接收方使用滑动窗口用来发送和接收数据
- 每收到一个确认发送方就把滑动窗口向前滑动一个滑动窗口大小
- 接收方一般采用累积确认方式
- 采用回退N(Go-Back-N)的方式重传
累积确认
接收方不必对每个分组信息回复确认信息,只需要对最后一个分组信息发送确认,这样就表示到目前为止所有的数据都正确收到了。
Go-Back-N
如果发送方滑动窗口发送了5个分组数据,其中的第3组数据丢失了,那么发送方只能收到前两组发出确认,而无法知道后三个分组的情况。那么发送方就会把五组数据全部重发。
- TCP使用流水线传输和滑动窗口协议实现高效可靠的传输
- 滑动窗口是以字节为单位的
- 发送方和接收方分别维持一个发送窗口和接收窗口
- 发送窗口表示:在没有收到确认的情况下可以把窗口内的数据全部发送出去
- 接收窗口表示:只允许接收位于窗口内的数据
TCP的流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收,不发送网络拥塞。
可能会发生死锁
B向A发送了0窗口的消息,不久B的接收缓存又有空间了,向A发送了rwnd为400的消息。但是如果rwnd为400的消息丢失了,B一直等到A的回复,A一直等到B的回复,就会发生死锁。
- 为了解决这个问题TCP为每一个连接设立了持续计时器。只要一方接收到0窗口的通知就启动该计时器。
- 若计时器时间到期就发送一个0窗口探测报文(仅携带1字节数据),如果对方任然是0窗口,重设持续计时器
- 重复以上过程,如果不是0窗口了,就继续发送数据。
糊涂窗口综合征
发送方每次仅发送一个字节或几个字节的数据,会使发送的效率严重降低。
- 使用Nagle算法
TCP的拥塞控制
在某段时间,对某网络资源的需求量大于该资源所能提供的可用部分,网络性能就要变坏,甚至崩溃。这就是拥塞。
拥塞是有很多因素引起的:
- 点缓存过小
- 链路容量不足
- 处理机处理速率过慢
- 拥塞进一步加重拥塞
监测可能引起网络拥塞的指标:
- 由于缺少缓存队列而被丢弃分组的百分比
- 平均队列长度
- 超时重传的分组数
- 平均分组时延
- 分组时延的标准差
TCP网络拥塞控制方法
拥塞控制方法有四种控制算法:
慢开始
由小到大逐个增加拥塞窗口的值。有两个重要变量:
- 拥塞窗口:包括初始拥塞窗口值和窗口增大量
- 慢开始门限:防止拥塞窗口过大引起网络拥塞
每收到一个新的对重传报文段的确认就把拥塞窗口值加一
慢开始门限的用法如下:
- cwnd < ssthresh:使用慢开始算法
- cwnd > ssthresh:停止使用慢开始算法改用拥塞避免算法
- cwnd = ssthresh:既可以使用慢开始算法也可使用拥塞避免算法
快重传
发送方只要接连收到3个重复确认,就可认为接收方没有收到数据报文段,因而立即进行重传即“快重传”。
快重传要求接收方立即发送确认,不要等待自己发送信息时才捎带发送。即使收到已失序的报文段也要发送已重复报文段确认。
快恢复
当发送端连续收到3个重复确认时,由于发送方认为现在网络很好没有发送网络拥塞,因此不执行慢开始算法而执行快恢复算法。
- 慢开始门限等于拥塞窗口/2
- 新拥塞窗口等于慢开始门限
- 开始执行拥塞避免算法使拥塞窗口线性增大
拥塞窗口缓慢增大,称为加法增大,新拥塞窗口大小等于原来大小一半,称为乘法减小。二者合在一起就是AIMD算法。