解析计算机网络中的传输层

322 阅读10分钟

1、概述

首先了解什么是运输层,在计算机网络五层体系结构中运输层是为它上面的应用层提供通信服务的,它是面向通信部分的最高层。

从IP层来说,通信的两端是两台主机,IP数据报的首部明确标志了两台主机的IP地址,但是在两台主机中真正通信的实体是主机中的进程(两台主机之间的进程进行交换数据),因此两台主机进行通信就是两台主机中的应用进程进行通信

在运输层来讲,通信的真正端点不是主机而是主机中的进程。同时它底层的网络层的主要目的是为主机之间提供逻辑通信。

从这里可以总结到:网络层为主机提供逻辑通信,运输层为应用进程之间提供逻辑通信。

在运输层中根据应用程序的不同需求,运输层存在两种不同的运输协议,即面向连接的TCP和无连接的UDP。

2、用户数据包协议UDP

2.1、UDP特点:

  • 1、传送数据之前不需要先建立连接,即发送数据之前不需要建立连接

  • 2、不提供可靠交付,只是尽最大努力交付,主机不需要维持复杂的连接状态表

  • 3、UDP是面向报文的,发送发的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。因此UDP对应用层交下来的报文不合并也不拆分,而是保留这些报文的边界。也就是说应用层交给UDP多长的报文,UDP就照样发送,一次发送一个报文给IP层。如果UDP接收IP层的用户数据包,那么去除首部后就直接原封不动的交给应用层。

  • 4、UDP没有拥塞控制,拥塞控制就是当网络出现拥塞时会控制发送的速率,但是UDP不会做任何控制,只是最大努力的交付。

  • 5、UDP支持一对一、一对多、多对一、多对多的交互通信。类似群聊

  • 6、UDP首部开销小,UDP的首部只有8个字节,比TCP的20个字节的首部要短。

2.2、UDP首部格式

  • 1、源端口,记录发送方的端口号。

  • 2、目的端口,记录目标端口号。

  • 3、长度,UDP数据包的长度,最小值为8。

  • 4、校验和,检测UDP用户数据包在传输中是否有错,有错就丢弃。

这里有一个问题就是UDP存在一个伪首部的问题,在计算校验和时,要在UDP用户数据包之前增加12个字节的伪首部。伪首部并不是UDP数据包真正的首部,只是在计算校验和时,临时添加在UDP用户数据包前面,得到一个临时的UDP数据包。

3、传输控制协议TCP

3.1、TCP特点

  • 1、面向连接的运输层协议,也就是说在使用TCP协议之前必须先建立TCP连接,在传送数据结束之后必须释放TCP连接。

  • 2、每条TCP连接只能有两个端点,TCP连接只能点对点的交互。

  • 3、TCP提供可靠交付的服务,通过TCP连接传送数据需要保证无差错、不丢失、不重复并且保证顺序性

  • 4、TCP提供全双工通信,TCP保证发送方与接收方的应用进程在任何时候都可以发送数据。

  • 5、面向字节流,TCP中的流指的是流入到进程或从进程流出的字节序列,TCP把应用层交下来的数据仅仅看成一连串的无结构的字节流,TCP并不知道传送的数据的含义。

3.2、TCP的连接

TCP来连接只能有两个端点,这两个端点叫做套接字(socket),socket=IP地址+端口号

因此一条TCP连接有两个socket,即TCP连接::={socket1,socket2}={(IP1:port1),(IP2,port2)}

3.3、TCP的首部格式

TCP面向字节流的,但是TCP传送的数据单元依然是报文段,一个TCP报文段分为首部数据两部分,而TCP的全部功能都体现在它的首部的各个字段的作用。

TCP报文段首部的前20个字节是固定的。包括如下:

  • 1、源端口

  • 2、目的端口

  • 3、顺序号seq

  • 4、确认号ack

  • 5、数据偏移

  • 6、保留位

  • 7、紧急URG

  • 8、确认ACK

  • 9、推送PSH

  • 10、复位RST

  • 11、同步SYN

  • 12、终止FIN

  • 13、窗口

  • 14、校验和

  • 15、紧急指针

  • 16、选项

3.4、TCP的可靠传输

  • 1、滑动窗口

在滑动窗口中接收方会向发送方发送一个可接收数量值,这个值就是发送方滑动窗口的大小,即需要发送的数据的大小,并且当接收方接收数据之后会给发送方一个确认消息,因此就能标识哪些数据是已发送并且确认接收的.

通过这样的滑动窗口的实现,实现了接收方接收消息的有序性以及可容性,不会造成发送方发送数据过多,接收方来不及接收的情况.

  • 2、超时重传

超时重传的实现在TCP中采用了一种自适应算法,它记录一个报文段发出的时间,以及收到确认的时间,这两个时间就是报文段往返时间.通过这样的时间来确认是否超时以及进行超时重传,

  • 3、选择确认

选择确认所要解决的就是接收方收到的报文段无差错,但是只是未按序号,中间还缺少了一些序号的数据.这是就可以通过选择确认来解决.

  • 4、拥塞控制

首先了解什么是拥塞,即某段时间,对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.

因此拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载.

  • 5、流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收.

流量控制往往使指点对点通信量的控制,是端到端的问题.流量控制就是抑制发送端发送数据的速率,以便接收方来得及接收.

3.4.1、TCP拥塞控制方法
  • 1、慢开始

拥塞控制中发送方会维持一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态的在变化,发送方热昂自己的发送窗口等于拥塞窗口.

发送方控制拥塞窗口的原则为:只要网络没有出现拥塞,拥塞窗口就可以再增大一些,一边把更多的分组发送出去.这样就可以提高网络的利用率.但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞.

慢开始算法的思路如下:

当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发送拥塞.较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值.

  • 2、拥塞避免

拥塞避免的思路为:

让拥塞窗口缓慢的增大,即没经过一次往返时间就把发送方的拥塞窗口加1,而不是像满开始阶段那样加倍增长.因此拥塞避免阶段有"加法增大"的特点.这表明在拥塞避免阶段,拥塞窗口按线性规律缓慢增长,比满开始算法的拥塞窗口增长速率慢的多.

  • 3、快重传

快重传所要解决的就是让发送方尽早知道发生了个别报文段的丢失.

快重传要求接收方不要等待自己发送数据时才进行捎带确认,而是要理解发送确认,即使收到了失序的报文段也要记录发出对已收到的报文段的重复确认.

按照快重传算法,接收方必须理解发送对数据的重复确认,以便让发送方及早知道接收方没有收到数据.

  • 4、快恢复

当发送方知道丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法.

快恢复的实现是把快恢复开始时的拥塞窗口值增大一些(增大3个报文段的长度).

3.4.2、滑动窗口的实现

TCP的滑动窗口是以字节为单位的,并且发送的字节都是根据序号进行有序发送。场景如下:

A向B发送数据,那么此时A和B都会构建自己的滑动窗口,A构建发送窗口,B构建接收窗口。此时A发送给B数据,那么A会构造自己的发送滑动窗口,下图中A的窗口大小为20,并且此时B已经接收了36,下一个要接收的序号为3。

从上图中可以看到窗口越大发送发就可以在收到B确认之前连续发送更多的数据,因而可以获得更高的传输效率。

并且发送窗口的位置由窗口前沿后沿的位置共同确定的。

发送窗口后沿变化有两种情况:

  • 不动,没有收到新的确认则后沿不懂
  • 前移,收到新的确认则进行前移。

后沿不能向后移动,也就是移动到37之前的数据,因为不能撤销掉已收到的确认。

发送窗口前沿变化也有两种:

  • 不动,也就是没有收到新的确认,或者收到了确认但发送窗口缩小了,使得窗口前沿不动
  • 前移,收到新的确认或者收到确认并发送窗口增大。

3.5、三次握手

image

1、客户端发送seq=x以及SYN=1给服务端。

2、服务端收到消息返回ack=x+1,以及seq=y以及确认消息ACK,同步消息SYN给客户端。

3、客户端收到服务端消息,返回ack=y+1以及seq=x+1,ACK确认消息给服务端告诉服务端我已经收到消息

这样实现的目的是保证客户端与服务端的连接是正常的,同时通过服务端发送确认消息来保证服务端到客户端的连接是正常的。

就像平时打电话:

客户端:你听得到吗?

服务端:我听得到,你听得到我吗?

客户端:我也听得到......

3.6、四次挥手

1、客户端发送FIN以及seq=u给服务端,告诉服务端想要断开连接。

2、服务端收到客户端消息,并返回ack=u+1以及seq=x给客户端,告诉客户端我已经收到了你的消息。

3、服务端关闭与客户端连接前需要发送FIN以及seq=w给客户端,告诉客户端我想要断开连接。

4、客户端收到服务端消息,返回ack=w+1,seq=u+1给服务端,告诉服务端我已经收到了你的消息,发送之后准备断开与服务端的连接。

参考资料:

  1. 三次握手四次挥手图片来源:blog.csdn.net/ThinkWon/ar…

  2. 《计算机网络》