运输层位于网络层之上、应用层之下,向它上面的应用层提供通信服务;属于面向通信部分的最高层,也是用户功能中的最底层。
从网络层来说,通信的两端是主机;IP数据报的搜捕明确标志了两个主机的IP地址,但是这种说法还不够清楚。通常一个主机中会同时有多个应用程序,数据发送给主机之后又将要发送给哪个应用程序?所以,从运输层的角度来看,通信的真正端点不是主机而是主机的进程,也就是说,端到端的通信是应用进程之间的通信。学习运输层的协议之前我们先来了解一下其功能;
运输层的功能
运输层有一个很重要的功能:复用和分用;
- 复用:是指在发送方不同的应用进程都可以使用同一个运输层协议传输数据;
- 分用:是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付母的应用进程;
网络层和运输层有一个明显的区别:网络层是为主机之间主机提供逻辑通信;运输层为应用进程之间的提供端到端的逻辑通信。(“逻辑通信”的意思是:从应用层看来,只要把应用层的报文交给下面的运输层,运输层就可以直接把这报文传送到对方的运输层)
运输层的两个主要协议
运输层有两个非常出名的协议:用户数据报协议UDP、传输控制协议TCP;相信很多不是很了解网络的同学也一定都知道TCP和UDP,甚至还知道UDP在传送数据之前不需要建立连接,TCP则提供面向连接服务。
前面我们已经数据发送给目的地址,接下来就需要利用目的地址提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个,解决办法就是在传输层使用协议端口号(简称端口);端口号只是为了标志本计算机应用层各个进程在和运输层交互是的层间接口,主要分为两大类:
- 服务器端使用的端口号;这里又分为两类,最重要的一类是熟知端口号(或系统端口号),数值为0~123,主要是给TCP/IP最重要的一些应用程序,让所有用户都知道。另一类是登记端口号,数值为1024~49151,给没有熟知端口号的应用程序使用,防止重复;
- 客户端使用的端口号;数值为49152~65535,这类端口号仅在用户进程运行时才动态选择,又被成为短暂端口号;
接下来,让我们正式学习一下UDP和TCP这两个协议吧~
用户数据报协议UDP
UDP只是在IP的数据报服务至上增加了复用和分用的功能及差错检测的功能,其主要特点是:
- UDP是无连接的;
- UDP使用尽最大努力交付,即不保证可靠传输;
- UDP是面向报文的,适合一次传输少量数据;
- UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低;
- UDP支持一对一、一对多、多对一和多对多的交互通信;
- UDP的首部开销小,只有8个字节,TCP的有20个字节;
用户数据报UDP有两个字段:数据字段和首部字段。首部字段只有8个字节,由四个字段组成,每个字段的长度都是两个字节;
- 源端口。源端口号,在需要对方回信是选用,不需要时可用全0;
- 目的端口。目的端口号,在终点交付报文时必须要使用到;
- 长度。UDP用户数据报的长度,最小值是8(只有首部);
- 检验和。检验UDP用户数据报在传输中是否有错,有错就丢弃;
UDP检验: 传输控制协议TCP
TCP协议是TCP/IP体系中非常复杂的一个协议;首先,我们来了解一下TCP最主要的特点:
- TCP是面向连接的运输层协议;
- 每一条TCP连接只能有两个端点,只能是点对点的;
- TCP提供可靠交付的服务;通过TCP连接传送的数据,无差错、不丢失、不重复,并且有序到达;
- TCP提供全双工通信;TCP连接的两端有发送缓存和接收缓存:
- 发送缓存:准备发送的数据和已经发送但尚未收到确定的数据;
- 接收缓存:按序到达但尚未被接受应用程序读取的数据和不按序到达的数据;
5. 面向字节流;TCP中的“流”指的是流入到进程或从进程留出的字节序列;
然后,我们还是要先来认识一下TCP的首部报文格式:
- 序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
- 数据偏移(首部长度) : TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。
- 6个控制位
- 紧急位URG: URG=1时, 标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
- 终止位FIN:FIN=1时, 表明此报文段发送方数据已发完,要求释放连接。
- 同步位SYN:SYN=1时, 表明是一一个连接请求/连接接受报文。
- 复位RST:RST=1时, 表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
- 推送位PSH:PSH=1时, 接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
- 确认位ACK:ACK=1时 确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。
- 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
- 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6。
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认....
TCP连接管理
既然TCP是面向连接的,那么我们就一定要知道其连接和释放的过程;在此之前,我们要知道TCP的连接采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器;
- TCP连接的建立(三次握手):
- 第一步:客户端发送连接请求报文段,无应用层数据 SYN=1,seq=x(随机产生一个序号)
- 第二步:服务器端为该TCP连接分配缓存和变量,并向服务器端发送确认报文段,允许连接,无应用层数据 SYN=1,ACK=1,,seq=x(随机),ack=x+1(确认号)
- 第三步:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据 SYN=1,ACK=1,seq=x+1,ack=y+1
- TCP连接的释放(四次挥手)
-
- 第一步:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接 FIN=1, seq=u
- 第二步:服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了——当前处于半关闭状态 ACK=1,seq=v, ack=u+1
- 第三步:服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。 FIN=1,ACK=1, seq=w, ack=u+1
- 第四步:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL (最长报文段寿命)后,连接彻底关闭。 ACK=1, seq=u+1, ack=w+1
前面已经说过,TCP实现的是可靠传输,那么究竟是如何实现可靠传输的呢?
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果接收端的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送;
- 停止等待协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就- 停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
TCP可以进行流量控制,所谓流量控制:就是让发送方发送速率不要太快,要让接收方来得及接收;利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。也就是在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
最后就是TCP拥塞控制,进行拥塞控制主要是为了防止过多的数据注入到网络;通过四种算法来实现:慢开始和拥塞避免、快重传和快回复:
- “慢开始”是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢;
- “拥塞避免"并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞;
- “快重传”就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传;
-
快恢复算法:
-
当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把sstresh门限减半。但是并执行慢开始;
-
考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算,而是将cwnd设置为sstresh的打星,然后开始执行拥塞避免算法
-