6.计算机网络:运输层
本文最后更新于 2024年1月27日 下午
计算机网络:运输层
运输层端口号
从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
但是,把一个特定机器上运行的特定进程,指明为互联网上通信的最后终点还是不可行的。这是因为进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。解决这个问题的方法是在运输层使用协议端口号,或者简称端口(port)。端口的本质是应用层的各种协议进程与运输实体之间进行层间交付的地址。需要注意,端口号是一种只具有本地意义的地址。
TCP/IP协议群的运输层使用的端口号长度为16位。
用户数据报协议/UDP
UDP协议的特点
- 无连接的
UDP在发送数据之前不需要建立连接,减少了开销和数据发送之前的时延,同时也不保证可靠的交付。
- 面向报文的
UDP对应用层交下的报文,既不合并也不拆分,而是直接保留这些报文的边界。UDP一次交付一个完整的报文,因此虽然UDP没有长度限制,应用程序也必须要选择报文的合适长度,使其能在IP层不加分片、高效地传输。
- 没有拥塞控制
UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低,对于对时延要求非常高的实时应用是非常有用的。
UDP首部格式
UDP的首部长度只有8个字节,一共四个字段,每个字段的长度都是两个字节。
需要注意的是,UDP首部在计算校验和时,要在UDP数据报之前增加一个12个字节的伪首部,这个首部只在计算校验和时,临时添加在UDP用户数据报前面。伪首部既不向下传送也不向上递交,仅仅是为了计算校验和。
传输控制协议/TCP
TCP协议的特点
- 面向连接的
应用程序在使用TCP协议之前,需要建立TCP连接,传输数据结束后必须释放已经建立的TCP连接,TCP提供可靠交付的服务。
- 面向字节流
在TCP中,字节流指流入或流出进程的字节序列。也就是说,TCP把应用程序交付的数据仅仅看做一连串无结构的字节流,TCP并不知道所传送的字节流的含义。
- 基于滑动窗口
TCP基于滑动窗口进行流量控制,其会根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应当包含多少个字节。
套接字
TCP连接的端点称为套接字(socket),套接字由IP地址和端口号拼接而来,格式为(IP地址:端口号)。
每一条TCP连接唯一地被通信两端的两个套接字确定,因此,每一条TCP连接可以表示为:{(IP1:Port1),(IP2:Port2)}。
TCP首部格式
TCP的首部是长度可变的,最小长度为20个字节。
头部中重点的字段是:
- 源端口和目的端口
各2字节。分别写入源端口号和目的端口号。
- 序号/报文段序号
占4字节。一个TCP连接中传送的每一个字节都按照顺序编号,整个要传送的字节流起始号必须在建立连接时确定。
- 确认号
占4字节。由于TCP采用了ARQ机制,所以需要有确认号来表示期望收到对方下一个报文段的第一个数据字节的序号。
- 校验和
同UDP,在计算校验和时,也需要在TCP首部添加12字节的伪首部用于生成校验和。
- 选项
长度可变,最长可以达到40个字节。TCP最初只规定了一种选项,称为“最大报文段长度(MSS,Maximum
Segment
Size)”,表示每个报文段中数据字段的最大长度,注意MSS表示的是整个报文段长度减去TCP首部后的长度。
MSS存在的原因是MSS长度的设置与IP数据报的行为有关:如果MSS过长,IP数据报需要进行分段,如果MSS过短,那么IP数据报的字节效率不高。
在建立连接的过程中,通信双方把自己可以支持的MSS写入这一字段,之后就按照这个数值传输数据。双方可以有不同的MSS值。
随着互联网的发展,又陆续增加了比如窗口扩大、时间戳等等选项,在此不一一介绍。
流量和差错控制
需要注意的是,由于MAC层、IP层都没有流量控制和差错检测,TCP/IP协议栈中的流量控制和差错检测由TCP层负责,TCP进行流量控制和差错检测的机制在第二章数据链路层已介绍过,在此不过多赘述。