一、传输层的作用
- 逻辑通信:为运行在不同主机上的应用进程之间提供逻辑通信。它在端系统中实现,将应用进程的报文封装成传输层报文段后传递给网络层;在接收端,重组网络层上交的报文段并传递给接收应用进程。
- 多路复用与多路分解:发送端通过多路复用从不同套接字收集数据块,增加首部信息后生成报文段;接收端通过多路分解将报文段中的数据交付到正确的套接字。
- 提供可靠或不可靠的服务:根据不同的协议(如TCP和UDP),传输层可以提供可靠的数据传输服务(TCP)或不可靠的数据传输服务(UDP)。
二、UDP(用户数据报协议)
- 特点:
- 无连接:发送和接收端之间没有握手协议,每一个UDP报文段的管理是独立的。
- “尽力而为”服务:UDP报文段可能会丢失和乱序,不提供可靠性保证。
- 首部开销小:UDP报文段结构简单,首部字段只有8字节,包括源端口、目的端口、长度和检验和。
- 时延短:适合对时延敏感的应用,如网络管理、DNS、流媒体等。
- 报文段结构:
- 首部字段:源端口、目的端口、长度、检验和。
-
伪首部:用于计算检验和,包括源IP地址、目的IP地址、协议号等。
-
检验和:提供差错检测功能,采用2字节的整型数据求和反码的方式计算。若接收方将全部数据与检验和相加的和为全1的数据,则没有检测出差错。
-
UDP检验和的计算涉及以下几个部分:
- 伪首部(Pseudo-header):这是一个虚拟的首部,仅用于计算检验和,但不会真正出现在UDP报文段中。伪首部包括:
- 源IP地址(32位)。
- 目的IP地址(32位)。
- 协议号(8位,UDP的协议号为17)。
- UDP报文段的长度(16位)。
- UDP首部:UDP报文段的8字节首部,包括:
- 源端口号(16位)。
- 目的端口号(16位)。
- 长度(16位)。
- 检验和(16位)。在计算检验和时,检验和字段本身被置为0。
- UDP数据部分:应用层传递给UDP的数据。
- 伪首部(Pseudo-header):这是一个虚拟的首部,仅用于计算检验和,但不会真正出现在UDP报文段中。伪首部包括:
-
UDP检验和的计算过程如下:
- 将伪首部、UDP首部和数据部分按顺序拼接成一个连续的字节流。
- 将字节流划分为16位(2字节)的整数序列。
- 对所有16位整数进行二进制反码求和(即按位加,溢出回卷)。
- 将最终的和取反码,得到检验和。
-
三、TCP(传输控制协议)
- 特点:
- 面向连接:在数据传输之前需要建立连接,通过三次握手过程来建立连接,确保双方都准备好进行数据传输。
- 可靠传输:通过确认应答、超时重传、滑动窗口等机制实现可靠的数据传输,确保数据的完整性和顺序性。
- 字节流服务:没有报文的界限,只区分报文段。
- 全双工服务:允许同时进行双向数据传输。
- 流量控制与拥塞控制:通过窗口机制防止接收端溢出和分组交换机溢出。
- 报文段结构:
- 首部:20字节固定首部+可变长度的选项字段。
- 首部字段:
- 源端口和目的端口:各占2字节,用于标识发送端和接收端的端口号。
- 序号字段:占4字节,用于对TCP连接中的数据流中的每一个字节进行编号。
- 确认号字段:占4字节,表示期望收到对方的下一个报文段的数据的第一个字节的序号。
- 数据偏移:占4位,表示TCP报文段的数据起始处距离TCP报文段的起始处有多远,单位是32位字。
- 保留字段:占6位,保留为今后使用,目前应置为0。
- 标志字段:包括URG(紧急)、ACK(确认)、PSH(推送)、RST(复位)、SYN(同步)、FIN(终止)等标志位。
- 窗口字段:占2字节,用于流量控制,表示接收方期望接收的字节数。
- 检验和:占2字节,用于检验TCP报文段的首部和数据部分。
- 紧急指针字段:占16位,指出在本报文段中紧急数据共有多少个字节。
-
选项字段:长度可变,最初只规定了最大报文段长度MSS选项。
- 连接管理:
- 连接建立:通过三次握手过程实现。
- 客户端发送一个SYN报文段,请求建立连接,其中SYN=1,序号为x。
- 服务器收到请求后,发送一个SYN ACK报文段作为响应,其中SYN=1,序号为y,ACK=1,确认号为x+1。
- 客户端收到SYN ACK报文段后,发送一个ACK报文段,其中SYN=0,序号为x+1,ACK=1,确认号为y+1,完成连接建立。
- 连接关闭:客户端和服务器端分别关闭它们的连接,通过发送包含FIN=1的报文段来表示释放连接,并对包含FIN=1的报文段进行确认ACK。
- 连接建立:通过三次握手过程实现。
- 往返时间估计与超时重传:
-
往返时间估计:采用指数加权移动平均(EWMA)方法估计往返时间(RTT),公式为
\[EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT\]其中 $\alpha$ 推荐取值为0.125。
-
超时重传时间间隔:通过计算 $SampleRTT$ 与 $EstimatedRTT$ 之间的差值的 $EWMA(DevRTT)$,并加上一个安全余量来设置超时重传时间间隔,公式为
\[DevRTT = (1-\beta)*DevRTT + \beta*|SampleRTT-EstimatedRTT|\\ TimeoutInterval = EstimatedRTT + 4*DevRTT\]推荐取值:$\beta$ = 0.25
-