上一节讲述了应用层的DNS相关内容,接下来进入运输层及相关的协议内容。
1 运输层的作用
我们知道主机之间通信的话可以通过分层中的网络层即可实现(网络层添加目标IP和源IP),那么为什么还需要运输层,因为我们需要实现不同主机上的进程间的通讯。通过引入运输层从而实现了不同主机上进程间的通讯。
在了解运输层之前我们先来了解下网络层。网络层有一个协议为IP(Internet Protocol),即网际协议。IP为主机之间提供了逻辑通信,但是其是尽最大可能交付,也就是说IP是不可靠的服务。
在简单了解了IP服务后,我们来讨论下运输层的两大协议UDP和TCP,UDP和TCP将主机间的通讯扩展到了主机上进程间的通讯。将主机间通讯扩展到主机上进程间通讯称为运输层的多路复用和多路分解。UDP提供了进程间数据交付和差错检查两种最低限度的运输层服务,UDP是无连接的,不可靠数据传输的运输层服务。相反的TCP是一种全双工面向连接的服务,它通过序列号、确认号、校验和及定时器实现了进程间的可靠数据传输。
2 多路复用和多路分解
在上面提到通过运输层的多路复用和多路分解从而实现了将IP提供的主机间通讯扩展到进程间的通讯。那么多路复用和多路分解究竟是如何运作的。
假设你的PC上运行着微信、QQ和网易云音乐,这个三个应用(进程)都会与对应的服务器进程数据的交互,当其他主机的数据传输到你的PC后,均通过物理层、链路层、网络层及运输层,然后分发到对应的应用程序(进程),那么运输层是如何做到的?那么要实现这个功能,那么每个应用(进程)都需要一个唯一的标识,而这个唯一的标识统称之为套接字,我们都知道套接字是运输层提供给运输层的接口,而每个套接字实例均有一个唯一的标识,而每个套接字又与应用(进程)绑定,那么运输层就可将数据通过套接字将数据正确分发给不同的进程。如下图:
其他主机的数据到达你的PC均通过物理层、链路层、网络层,到达运输层后通过套接字将数据分发到每个进程中,这个过程就叫做多路分解。相应的运输层也将主机上的每个进程的数据组装成报文段交付给网络层从而将数据发送给目的主机,这个过程称之为多路复用。
3 无连接传输UDP
前面我们已经提到UDP是无连接的,提供了不可靠数据传输服务及差错校验。其作用只是在网络层添加了多路分解和多路复用,从而实现了进程间的通讯,那么UDP如此不可靠是否就一无用处呢?不是的,使用UDP协议作为数据传输可能基于以下几点考虑:
- 关于发送什么数据以及何时发送的应用层控制更为精细。采用UDP进行数据发送时,应用层将数据传递给UDP后,UDP会当即将数据发送。对于TCP由于流量控制及拥塞控制的原因,同时确保数据的准确传输,所以TCP会忽略时延从而保证数据正确被交付,这就会导致有些数据时延特别大,对于有最小发送速率有要求的应用,很明显使用UDP更能保证数据被即时发送,所以说如何需要控制发送什么数据同时控制何时发送,应用层使用UDP更能把控发送的时间点(因为TCP由于缓存和流量控制原因,即使应用层将数据交付给TCP,TCP也不能保证数据当即会发送)。
- 无须建立连接。UDP在数据发送时不像TCP的三次握手一样,所以UDP会省去三次握手的时延。
- 无状态连接。我们知道对于TCP为了提供可靠数据传输服务,TCP会维护确认号、序列号以及流量控制状态,但是UDP是无状态的,UDP不需要维护过多的状态信息。
- 分组首部开销小。UDP只需要维护源和目标端口以及校验和和数据长度信息,而TCP是有状态的,所以首部需要维护序列号、确认号和流量窗口等信息,所以TCP首部要比UDP首部大的多,UDP报文段首部只有8字节的开销,而TCP每个报文段首部至少20字节。
UDP报文段结构
接下来我们来了解每个UDP报文段的结构,如下图:
如图所示,UDP报文段只有四个部分,每个部分占两个字节,源端口号和目的端口号用于运输层实现进程间通讯标识(多路复用和堵路分解)。长度是指UDP数据报的长度(包括首部和应用数据)。校验和用于运输层对应用数据进行校验是否出了差错。
UDP校验和
UDP的校验和提供了差错检测功能。也就是说,检验和用于确定UDP报文段从源到目的地移动时,其中的比特是否发生改变。发送方的UDP对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出将会被回卷。得到的结果被放到UDP报文段的校验和字段。
接下来我们来看一个有3个16比特字例子:
这三个16比特字的前两个之和为:
将前两者之和与第三个相加如下:
最后的一个加法是有溢出的,所以发生了回卷。反码的运算规则就是将所有的0换成1,所有的1换成0。因此,该和0100101011000010的反码就是1011010100111101,这就是校验和。在接收方,数据的三个16比特字和校验和加在一起结果为1111111111111111。如果这些比特值为0的则代表UDP的报文段数据在传输过程中发生差错。
UDP提供的服务很少,所以关于其报文格式没有那么复杂也容易理解,其应用的话,DNS就是基于UDP进行数据传输的。因为DNS使用TCP的话,由于流量控制、拥塞控制以及可靠传输的原因,会导致获取主机名称对应的IP地址时延会较高,影响了应用层的一次请求响应速度,所以DNS在UDP上进行数据的传输。接下来来了解TCP相关的知识,但是在了解TCP之前我们先来了解下可靠数据传输的原理。
本节学习了运输层的作用和UDP不可靠数据传输的相关内容,下节进入可靠数据传输的相关原理和协议的内容:可靠数据传输原理