计算机网络——传输层
一. 传输层
为进程提供通用的数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。传输层具有复用和分用功能,复用就是多个应用层进程可以同时使用下面传输层的服务;分用则相反,指传输层把收到的信息分别交付给上面应用层中的相应进程。主要使用传输控制协议TCP和用户数据报协议UDP。
二. UDP(用户数据报协议)
- UDP是无连接的
- 尽最大可能交付
- 没有拥塞控制
- 面向报文,发送方的 UDP 对应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部就向下交付给 IP 层,一次发送一个报文,报文长度是应用进程给出的;接收方的 UDP 对 IP 层交上来的数据报去除首部后就交付给上层的应用进程。(UDP的数据传输流程)
- UDP的首部开销小,只有8个字节(TCP的首部至少有20个字节),包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
- 支持一对一、一对多、多对一和多对多的交互通信。
三. TCP(传输控制协议)
- TCP是面向连接的
- 提供可靠交付
- 有流量控制、拥塞控制
- 面向字节流,把应用层传下来的报文看成字节流,发送到TCP的缓存中,然后给它加上TCP首部构成 TCP 报文段,它是TCP数据传输单元,报文段的长度根据窗口值和网络拥塞程度来决定;接着传送到IP层,加上IP首部(20个字节),再传送到链路层,加上链路层的首部和尾部后才离开主机发送到物理链路。
- 每一条 TCP 连接只能有两个端点,连接只能是点对点的(一对一)。TCP 连接的端点叫套接字(socket),IP地址通过冒号拼接上端口号就构成了套接字。套接字 = (IP地址 : 端口号) 。(比如IP地址为 192.3.4.5,端口号为80,则拼接出的套接字为 192.3.4.5:80)
- 提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据。
发送消息或浏览网页,需要确保用户数据不丢失,所以使用TCP协议;
视频聊天或看直播,即使几个画面丢失,对用户影响也不大,所以使用UDP协议。
四. TCP 可靠传输
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
五. TCP 滑动窗口
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息(比如拥塞情况)来设置自己的窗口大小。发送窗口不能超过接收窗口的数值。TCP窗口单位是字节。
六. TCP 拥塞控制
拥塞控制指防止过多的数据注入到网络,以防路由器或链路过载,是个全局性的过程。
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
慢开始与拥塞避免:
首先使用慢开始算法,发送方维持一个叫做拥塞窗口的状态变量(cwnd),一开始发送方设置cwnd的值为1,也就是发送方只能发送1个报文段,当收到确认后,将cwnd的值乘以2,每个轮次都这样增长,也就是2,4,8,16… 为了防止cwnd增长过大引起网络拥塞,所以需要设置一个慢开始门限状态变量(ssthresh)。当cwnd小于ssthresh时,使用慢开始算法;当cwnd大于ssthresh时,改用拥塞避免算法,每个轮次只将cwnd加1,控制为线性增长,使网络比较不容易出现拥塞。如果出现了超时,就将ssthresh设为当前cwnd值的1/2,同时设置cwnd=1,然后重新进入慢开始阶段。
快重传与快恢复:
在接收方,要求每次接收到报文段都对最后一个已收到的有序报文段进行确认。比如已经接收到 M1 和 M2,此时收到 M4,则应当发送对 M2 的确认。在发送方,如果收到三个重复确认,那么就可以知道下一个报文段丢失了,此时执行快重传算法,立即重传下一个报文段。比如收到三个 M2,则是 M3 丢失了,立即重传 M3。这种情况只是丢失个别报文段,并不是网络拥塞,因此执行快恢复算法,令 ssthresh = 当前 cwnd / 2 ,然后设置 cwnd = ssthresh,接着执行拥塞避免算法。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
七. TCP 流量控制
流量控制是指控制发送端发送数据的速率,以便接收端来得及接收,是个端到端的问题。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。