之前学习了网络层的技术和协议,知道了IP协议指导数据包在网络中传输。而第四层传输层协议提供从源主机到目的主机的传输服务,专注于数据包的传输方式。
传输层为上层协议提供了从源主机到目的主机的传输服务。包括以下基本服务:
这些服务又可以分为:
传输层中最经典的两个协议就是TCP(Transmission Control Protocol, 传输控制协议)和UDP(User Datagram Protocol, 用户数据报协议)。
TCP协议是一个可靠的传输协议,提供面向连接的服务,可以将传出消息分段为数据段,并在目标主机上重新组装消息。同时,提供确认检测等可靠性传递,并可以进行流控制。
常见的使用TCP的应用程序协议有:文件传输协议(FTP)、超文本传输协议(HTTP)、简单邮件传输协议(SMTP)和Telnet。
TCP协议的报头如下:
它的特点是存在一个序列号(Seq)和一个确认位(Ack),除此之外还有code bits用于表示当前数据段的状态,以及window表示最大传输byte的大小。
TCP在数据传输开始之前需要建立面向连接的会话。TCP使用三次握手(three-way handshake)建立连接。
在三次握手中,发送的数据段的序列号(Seq)和确认号(Ack)的变化如下:
例如:A -> B之间建立TCP连接的序列号和确认号的变化。
假设初始情况下,A同步请求:Seq=0, Ack=0, Len=24
则B的回复为:Seq=0, Ack=1=0+1, Len=24 (注意,这里Seq=0是B选择的,与A的无关)
A的确认为:Seq=1=0+1, Ack=1, Len=20
在数据传输结束时,发送端发送一个信号,将code bit的FIN置为1,指示传输结束。结束连接需要进行四次挥手。
大多数网络对单个PDU中可包含的数据量都有限制。传输层将应用程序数据划分为适当大小的数据块。在目的地,传输层在将数据发送到目的地应用程序或服务之前重新组装数据。
在会话建立期间,通过序列号(Seq)可以确定一个会话。在会话期间传输数据时,序列号将按已传输的byte递增。这种对数据byte的跟踪使每个数据段能够被唯一地识别和确认。可以识别缺失的片段。
但因为IP协议是无连接的服务,网络可能提供具有不同传输时间的多个路由,因此数据可能以错误的顺序到达。通过对数据段进行编号和排序,传输层可以确保这些数据段按照正确的顺序重新组装。
TCP使用肯定应答重传(Positive acknowledgment with retransmission, PAR)技术来保证数据的可靠传输。
PAR要求接收端与发送端通信,并在接收到数据时发回确认消息。使用PAR,发送端发送一个数据包,并启动一个计时器(timer),并在发送下一个数据包之前等待确认。如果定时器超时,则发送端重新发送数据包并重新启动定时器。
当接收端收到的数据段到达得太快,主机或网关无法处理时,它们会暂时存储在内存(buffer)中。如果buffer已满,则发生了TCP拥塞(Congestion)。
TCP使用流控制发送降低数据流的速率,从而避免发送主机溢出接收主机的缓冲区。它的工作原理和红绿灯很像:
接收主机上的TCP进程可以向发送方发出“not ready”。发送主机收到这个信号时停止发送。当接收主机可以继续处理数据段时,它会发送一个“ready”信号。发送主机收到这个信号时可以恢复段传输。
同时,TCP还通过窗口大小(window size)来控制发送主机最大发送的byte数。窗口大小可以进行动态调整,称为Sliding Window.
在一个初始化后,若在当前window size下可以成功发送,则下次调整window size为它的两倍。若发送超时或发生丢包,则window size回到上次可以重新发送的大小进行重新尝试。
在传输层,在发送端应用程序和目的地应用程序之间流动的每个连接集称为会话。每个主机上可能运行许多应用程序或服务。传输层为每个应用程序或服务分配端口(Port)号,以跟踪同时通过网络的不同会话。例如发送HTTP请求:
端口的范围使0 ~ 65535,其中分为三类:
常见TCP协议服务的端口号:
特别的是,DNS协议在区域传输的时候使用TCP协议,在域名解析时使用UDP协议。
UDP是一个轻量级的协议,它提供无连接的服务,不提供可靠性保证和流控制。
使用UDP的应用程序协议包括:动态主机配置协议(DHCP)、域名系统(DNS)、简单网络管理协议(SNMP)、简单文件传输协议(TFTP)。
UDP的报头如下:
它没有序列或确认字段,也没有code bits和window size。
区别于TCP,UDP一旦数据准备好发送并且端口被识别,马上可以开始发送数据。UDP不像TCP那样跟踪序列号。UDP无法将数据报重新排序为它们的传输顺序。
常见使用UDP的协议的端口号如下:
在这篇文章中,我们简要地探讨了传输层的各种服务和协议,包括TCP和UDP。我们了解了如何通过端口号进行多路复用,以及如何通过序列号和确认位来实现可靠的数据传输。我们还了解了TCP和UDP的主要区别,以及它们在实际应用中的使用。