传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上进行流量控制、分段/重组和差错控制。一些协议是面向连接的,这也就意味着传输层能保持对分段数据的跟踪,并且重传那些失败的分段。


概括说来,传输层的职责有以下7个方面:

  1. 在源和目的主机的应用程序之间跟踪独立的通信

  2. 分段数据并管理每个分段

  3. 将这些数据分段重组为完整的数据流

  4. 标志不同的生活服务程序

  5. 在终端用户之间执行流量控制

  6. 差错恢复

  7. 开始一个会话


我们常说TCP支持可靠的网络通信,那么可靠通信的标准又是什么呢?

在网络术语中,可靠性是指从源设备发送的每段数据都能到达目的设备。在传输层,有三项保证可靠性传输的操作:

  • 跟踪已发送的数据

  • 确认已接收的数据

  • 重新传输未确认的数据

为了支持这种可靠性的传输,需要在收发主机之间交换更多的控制数据,控制数据位于传输层报头中。

在传输层中,既有上述带有确认机制的可靠传输协议,也有只保证尽力传输的不可靠传输协议,两种协议有各自的应用场景,简单的对比如下表:

不可靠通信可靠通信
快速可靠
低开销
无须确认确认数据
不重传丢失的数据重传丢失的数据
按照数据发送的顺序处理数据按照数据发送的顺序处理数据

TCP/IP协议族中最常用的两种传输协议是传输控制协议(TCP)和用户数据报协议(UDP)

根据RFC768,用户数据报协议是一种简单的无连接协议。该协议的优点是提供低开销的数据传输,UDP中通信的数据段称为数据报。UDP采用“尽力”的方式传输。

常见的采用UDP协议的应用包括:

域名系统(DNS)

视频流

IP语音(VoIP)

UDP数据报头有8个字节开销,示例如下图:

位(0)
位(15)位(16)位(31)
源端口(16)目的端口(16)
长度(16)校验和(16)
应用层数据

如RFC793定义,TCP是一种面向连接的协议,为实现额外的功能,TCP协议会产生额外的开销。TCP协议描述的其他功能包括原序处理、可靠传输以及流量控制。TCP数据报头有20个字节的开销,示例如下图所示:

位(0)位(15)位(16)位(31)
源端口(16)目的端口(16)
序列号(32)
确认号(32)

报头长度(4)

保留(6)

代码位(6)

窗口(16)
校验和(16)紧急(16)
选项(0,若有则为32位)
应用层数据

采用TCP协议的应用程序包括:

Web浏览器

电子邮件

文件传输程序


在传输层,数据传输的识别依赖于基于端口寻址的策略,服务器进程有静态分配的端口号,而客户端则为每个会话动态选择端口号。

通过传输层端口号和网络层分配给主机的IP的地址,我们可以唯一识别特定主机上运行的特定进程。这种组合也就是我们通常所说的套接字

Internet编号指派机构(IANA)负责分配端口号。IANA是一个负责分配多种地址的标准化团体。

端口类型包括:

  • 公认端口(端口0到1023)

  • 已注册端口(端口1024到49151)

  • 动态或私有端口(端口49152到65535)

以下是一些知名的公认端口号:


知名端口应用程序协议
20文件传输协议(FTP)数据TCP
21文件传输协议(FTP)控制TCP
23TelnetTCP
25简单邮件传输协议(SMTP)TCP
69简单文件传输协议(TFTP)UDP
80超文本传输协议(HTTP)TCP
110邮局协议3(POP3)TCP
194Internet在线聊天(IRC)TCP
443安全的HTTP(HTTPS)TCP
520路由信息协议(RIP)UDP

当两台主机采用TCP进行通信时,在交换数据前将建立连接。通信完成后,将关闭会话并终止连接。连接和会话机制保证了TCP的可靠×××。

TCP通过“三次握手”建立连接,具体过程如下:

  1. 客户端向服务器发送包含初始序列值的数据段,开启通信会话

  2. 服务器发送包含确认值的数据段,其值等于收到的序列值加1,并加上其自身的同步序列值。该值比序列号大1,因为ACK总是下一个预期字节或者二进制八位数。通过此确认值,客户端可以将响应和上一次发送到服务器的数据段连接起来。

  3. 发送带确认值的客户端响应,其值等于接受的序列值加1。这便完成了整个建立连接的过程

整个过程如下图所示:

wKiom1TQ3wrwJlQZAACuDmx2qrU176.jpg

在TCP数据段报头中,有6个包含控制信息的1比特字段,用于管理TCP进程。这些字段是:

URG-紧急指针

ACK-确认字段

PSH-推送功能

RST-重置连接

SYN-同步序列号

FIN-发送方已传输完所有数据

由于它们只有1比特的大小,所以只可能有两个值:1和0   当值设为1时,表示包含控制信息


TCP会话终止

若要关闭连接,应设置数据段报头中的FIN标志,为终止每个单向的TCP会话,需采用包含FIN数据段和ACK数据段的二次握手。因此如果要终止TCP支持的整个会话过程,需要实施4次交换,以终止两个双向会话。

  1. 当客户端的数据流中没有其他要发送的数据时,它将发送带FIN标志设置的数据段

  2. 服务器发送ACK信息,确认收到从客户端发出的请求终止会话的FIN信息

  3. 服务器向客户端发送FIN信息,终止从服务器到客户端的会话

  4. 客户端发送ACK信息,确认收到从服务器发出的FIN信息

具体的流程如下图所示:

wKioL1TQ7oLy891nAACa5SQV7vI488.jpg

TCP窗口

源主机在收到确认消息之前可以传输的数据的大小称为窗口大小。窗口大小是TCP报头中的一个字段,用于管理丢失数据和流量控制


TCP重传

无论网络设计得多么完美,都有可能发生数据丢失的现象。因此,TCP提供了管理数据段丢失的方法,其中一个就是重新发送未被确认的数据段。

例如:

如果接收到序列号为1500到3000以及3400到3500的数据段,那么确认号应该为3001.这是因为未收到序列号为3001到3399之间的数据段。

如果源主机在规定的时间内未收到确认信息,它将根据收到的最后一个确认号重新发送数据。

RFC793中未对重新发送数据的过程进行说明,这属于TCP的特殊实施过程。

TCP标准的实施流程是,主机传输数据段,并将数据段的副本放入重新发送队列,然后启动计时器。当接收到确认信息时,主机将从队列中删除对应数据段。如果到计时器结束还没有收到确认信息,将重新传输数据段。现在,主机还具备一项备选功能,选择性确认。如果两台主机都支持选择性确认功能,目的主机便可以确认间断数据段中的数据,那么源主机就只需要重新传输丢失的数据。


TCP拥塞控制

TCP报头中的窗口大小字段指出了在收到确认消息之前可以接收的数据量。初始窗口大小应在会话创建阶段通过三次握手来确定。TCP反馈机制将根据网络和目的设备所能支持的最大容量(以不丢失数据为前提)将数据传输速率调整到最大。通过对传输速率的管理,TCP尝试确保收到全部数据且将数据重发率降到最低。

接收数据出现延迟时,发送方将不再发送任何会话数据段。如果网络拥堵,或者接收主机资源紧张,延迟时间可能更长,该会话的传输速率也就越低,而数据传输速率的降低有助于缓解资源紧张的状态。


我们也可以通过动态窗口大小来控制数据流量。当网络资源受到限制时,TCP可以减少窗口大小,这样目的主机就需要更加频繁地确认收到的数据段。由于源主机需要更加频繁地等待数据确认,这便可以大大降低传输速率。

TCP目的主机将窗口大小值发给源主机,表明它在该会话过程中准备接收的字节数。如果目的主机由于缓存内存受限需要降低通信的速率,那么它向源主机发送的确认信息中可以包含一条较小的窗口大小值。

TCP中这种增减窗口大小值的动态运动不断进行,直至达到每个TCP会话窗口的最佳大小。在高效网络中,由于不丢失数据,窗口大小可能很大。而在基础网络中,窗口大小就会很小。


UDP协议


UDP是一种简单的协议,提供了基本的传输层功能。与TCP相比,UDP的开销极低,因为UDP是无连接的,并且不提供复杂的重新传输、排序和流量控制机制。

某些应用程序可以容许小部分的数据丢失,比如我们经常看的网络视频。如果这些应用程序采用TCP,那么将面临巨大的网络延迟,因为TCP需要不停检测数据是否丢失并重传丢失的数据。与丢失小部分数据相比,网络延迟造成的用户体验更差劲。正是由于UDP的开销很低,所以才会对一些对效率要求苛刻的程序有强大的吸引力。我们最常接触到的DNS系统正是采用了UDP来保证传输的高效率。