计算机网络(四)——传输层
传输层处于一个关键位置,向上为应用层服务,是用户功能中的最底层,向下处于通信部分的最高层。由于网络层协议不可靠,传输层需要提供一个可靠的协议保证应用程序之间的信息传递。
(一)服务
image.png如上图所示,传输层提供以下服务:
- 端到端的通信:网络层提供的是主机之间的逻辑通信,而传输层提供应用进程之间的逻辑通信;
- 1.在主机中使用端口标识不同的应用进程,应用进程通过端口将报文传给传输层;
- 2.采用套接字的方式标识同一台主机中的不同应用进程,套接字=(主机IP地址,端口号)。 - 复用与分用:不同的应用程序都可以使用同一个传输层协议传输数据,接收方的传输层在收到剥去报文首部后能够把这些数据交给正确的进程;
- 差错检查:对收到的报文进行差错检测;
- 提供两种不同协议:面向连接的TCP和无连接的UDP。
(二)UDP协议
UDP协议是无连接协议,它很简洁,只包括两个基本服务:复用与分用和差错控制。它有以下4个优点:
- 不用建立连接:由于传输前不用建立连接,因此时延短,速度快;
- 无连接状态:不用保持连接状态,也不需要跟踪一些参数,因此可以支持更多活动客户机;
- 分组首部开销小:首部仅8B的开销;
- 应用层能更好地控制要发送的数据和时间:UDP报文可以随时发送,不需要考虑拥塞控制,更加灵活。
1.UDP报文格式
image.png(三)TCP协议
TCP协议是有连接协议,相比UDP协议,它需要提供更多功能,它有以下几个特点:
- 面向连接:传输前先建立连接;
- 点对点:每条TCP连接只能有两个端点;
- 可靠的交付:保证传送的数据无差错、不丢失、不重复且有序;
- 全双工通信:为了能让通信双方的应用进程在任何时候都能发送数据,连接的两端都设有缓存区域存放临时数据;
- 面向字节流:TCP把应用程序交给的数据视为一连串无结构的字节流。
1. TCP报文段
image.png2. TCP连接管理
两个端点使用TCP协议时,要经历三个阶段:建立连接、数据传送和连接释放。这有点类似于两个人打电话,先拨号,再聊天,最后挂断电话。但是TCP协议在建立连接和释放连接时,稍微有些复杂,因为它要解决三个问题:
- 接收双方都知道对方的存在;
- 约定一些参数,方便数据传递;
- 可以对数据资源进行分配。
2.1 建立连接
TCP建立连续协议需要“三次握手”才能相互确认对方的存在。
image.png image.png
2.2 连接释放
如果需要断开两个进程之间的连接,则需要“四次挥手”。
image.png
TCP连接建立和释放的总结:
image.png
3. 可靠传输
TCP协议将数据以字节流的方式在发送端与接收端之间传输,要对每个字节进行编号,方便接收端向发送端确认信息,如果接收端收到的字节流不连续,那么它将会计算出丢失的字节序号,反馈给发送端,让发送端重传。
3.1 序号
发送端现在缓存区中,将字节流从0开始编号,然后再分组组成多个报文依次发送。如下图:第一个报文的序号是0,第二个报文的序号是3。
image.png
3.2 确认
TCP报文中的确认字段用于发送端与接收端之间确认报文信息。根据上图,如果A、B两个进程之间进行信息传递,当B收到第一个报文段,那么他将会向A发送字段为3的确认号,也就是说,确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。
3.3 重传
根据不同情况将重传分为两类:超时和冗余ACK。
3.1 超时
B每接收到一个报文段都会向A发送确认信息,但是如果A在一定时间内接收不到B的确认信息,那么就要重传这一报文段。
由于互联网网络情况变化很大,A等待的时间不能记为固定值,这样会导致传输速率低效,需要自适应算法,将一个报文发出的时间,以及收到相应确认的时间作差,结果记为往返时间RTT,多次记录RTT并进行加权平均计算:
image.png
第一次重传时间根据加权平均RTT计算:
image.png
之后使用下面方式计算:
image.png
3.2 冗余ACK
如果A向B发送1,2,3,4,5个报文段,但是第2个报文段丢失,B接收到1,3,4,5个报文段,于是B向A发送3个对1号报文段的冗余ACK。当A收到对1号报文段的3个冗余ACK时,就立即执行重传。
也就是说,每当接收方接收到比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期望字段的序号。
4. 流量控制
发送方与接收方两端都设有缓存区,但如果发送法的发送速度与接收方处理数据速度不一致的话,缓存区将有溢出的可能,因此使用流量控制防止数据溢出。
在流量控制方面,接收方要随时告诉发送方能够接受多少字段,方便发送方调整报文段长度,保证接收方的缓存区不会溢出。
image.png
5. 拥塞控制
为防止过多数据注入网络造成网络堵塞,因此用拥塞控制发送方发送速率。
虽然流量控制与拥塞控制都是控制发送方发送数据的速率,但是拥塞控制从全局角度着眼,涉及所有的主机、路由器,而流量控制只是在两个端点之间进行数据传输量的控制。
因此拥塞控制中,要求发送方维护两个窗口:接收窗口和拥塞窗口。
- 接收窗口(rwnd):接收端根据自己接收缓存大小,将最新窗口值反馈给发送端;
- 拥塞窗口(cwnd):发送方根据自己估算的网络拥塞程度设置窗口值。
因此发送窗口的取值为:发送窗口的上限值=min[rwnd, cwnd]
5.1 慢开始和拥塞避免
发送方采用慢开始算法与拥塞避免算法相结合发送数据。
- 慢开始:在开始发送TCP报文段时,将cwnd=1,也就最大报文段长度MSS,每当收到一个对新报文段的确认后,cwnd+=MSS,使cwnd逐步增大。
- 拥塞避免:发送端每经过一个RTT就增加一个MSS大小,也就是cwnd+=1,使cwnd放慢增长速度,如果出现网络拥塞,那么则从慢开始门限(ssthresh)开始,另ssthresh=cwnd/2;
5.2 快重传和快恢复
- 快重传:快重传使用冗余ACK来实现。
-
快恢复:当遇到拥塞时,另ssthresh=cwnd/2
image.png