1.6 TCP/UDP 协议(传输层)

传输层定义了主机应用程序之间端到端的连通性。
传输层中最为常见的两个协议分别是:
TCP:Transmission Control Protocol,传输控制协议。
UDP:User Datagram Protocol,用户数据包协议。

1、TCP

1.6 TCP/UDP 协议(传输层)

TCP 是一种面向连接的传输层协议,提供可靠的传输服务。
TCP 位于 TCP/IP 模型的传输层,是一种面向连接的端到端协议。TCP 为主机提供可靠的数据传输。在本例中,两台主机在通信之前,需要 TCP 在它们之间建立可靠的传输通道。

2、TCP 端口号

1.6 TCP/UDP 协议(传输层)

TCP 允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标 IP 地址的组合唯一地标识了一个会话。
端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为 0~1023。如 FTP、HTTP、Telnet、SNMP 服务均使用知名端口。
动态端口号范围从 1024 到 65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。

3、TCP 头部

1.6 TCP/UDP 协议(传输层)

TCP 通常使用 IP 作为网络层协议,这时 TCP 数据段被封装在 IP 数据包内。
TCP 数据段由 TCP Header(头部)和 TCP Data(数据)组成。TCP 最多可以有 60 个字节的头部,如果没有 Options 字段,正常的长度是 20 字节。
Source Port:源端口号。16 位。源主机的应用程序使用的端口号。
Destination Port:目的端口号。16 位。目的主机的应用程序使用的端口号。每个 TCP 头部都包含源和目的端的端口号,这两个值加上 IP 头部中的源 IP 地址和目的 IP 地址可以唯一确定一个 TCP 连接。
Sequence Number:序列号。32 位。用于标识从发送端发出的不同的 TCP 数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化,接收端依据此序列号,便可按照正确的顺序重组数据。
Acknowledge Number:确认序列号。32 位。用于标识接收端确认收到的数据段。确认序列号为成功能到的数据序列号加 1。
Header Length:头部长度(数据偏移)。4 位。该字段表示 TCP 所传输的数据部分应该从 TCP 包的哪个位置开始计算,可以把它看作是 TCP 头部的长度。该字段长 4 位,单位是 4 个字节(即 32 位)。不包括选项字段(Options)的话,TCP 头部长度为 20 个字节,因此,数据偏移字段可设置为 5。反之,若该字段值为 5,那么说明从 TCP 包的一开始到 20 字节为止都是 TCP 头部,余下的部分为 TCP 数据(Data)。
Resv.:即 Reserved,4 位。这些位必须是 0,为了将来定义新的用途所保留。
Code Bits:字段长 8 位,从左到右由以下八个内容组成,这些控制标志也叫控制位。当它们的对应位上的值为 1 时,具体含义如下:
CWR:Congestion Window Reduce,拥塞窗口缩小。CWR 标志与后面的 ECE 标志都用于 IP 头部的 ECN 字段,ECE 标志为 1 时,则通知对方已将拥塞窗口缩小。
ECE:ECN Echo(ECN:Explicit Congestion Notification,显式拥塞通告)。其值为 1 则通知对方,从对方到本地的网络有阻塞。
URG:Urgent。表示包中有需要紧急处理的数据,对于需要紧急处理的数据,与后面的紧急指针有关。
ACK:Acknowledgement。该位为 1,确认应答的字段有效。TCP 规定除了最初建立连接时 SYN 之外该位必须设为 1。
PSH:Push。该位为 1,表示需要将收到的数据立刻从缓存区读走并传给上层应用协议,若该位为 0,则先将数据进行缓存。
RST:Reset。该位为 1,表示 TCP 连接出现异常必须强制断开连接后再重新连接。
SYN:Synchronize。该位为 1,表示希望建立连接,并在其序列号的字段进行序列号初值设定。
FIN:Finish。该位为 1,表示不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。每个主机又对对方的 FIN 包进行确认应答之后可以断开连接。不过,主机收到 FIN 设置为 1 的 TCP 段之后不必马上回复一个 FIN 包,而是可以等到缓冲区中的所有数据都因为已成功发送而被自动删除之后再发送 FIN 包。
Window:窗口大小。16位。表示接收端期望通过单次确认而收到的数据的大小。由于该字段为 16 位,所以窗口大小的最大值是 65535 字节,该机制通常用来进行流量控制。
Checksum:检验和。16 位。校验整个 TCP 报文段,包括 TCP 头部和 TCP 数据。该值由发送端计算和记录并由接收端进行验证。
Urgent Pointer:紧急指针。16位。只有在 URG 控制位为 1 时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所在的位置为止是紧急数据。因此,紧急指针是指出了紧急数据的末尾在报文段中的位置。

4、TCP 建立连接的过程

1.6 TCP/UDP 协议(传输层)

TCP 是一种可靠的,面向连接的全双工传输层协议。
TCP 连接的建立是一个三次握手的过程,如上图所示。
1、主机 A(也称客户端)发送了一个标识了 SYN 的数据段,表示期望与服务器 A 建立连接,此数据段的序列号(Seq)为 a。
2、服务器 A 回复标识了 SYN+ACK 的数据段,此数据段的序列号(Seq)为 b,确认序列号为主机 A 的序列号加 1(a+1),以此作为对主机 A 的 SYN 报文的确认。
3、主机 A 发送一个标识了 ACK 的数据段,此数据段的序列号(Seq)为 a+1,确认序列号为服务器 A 的序列号加 1(b+1),以此作为对服务器 A 的 SYN 报文的确认。

5、TCP 传输过程

1.6 TCP/UDP 协议(传输层)

TCP 的可靠传输还体现在 TCP 使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。
确认技术的工作原理如下:
目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。
如上图所示,主机 A 向服务器 A 发送 TCP 数据段,为描述方便,假定每个数据段的长度都是 500 个字节。当服务器 A 成功收到序列号是 M+1499 的字节以及之前的所有字节时,会以序列号 M+1499+1=M+1500 进行确认。另外,由于数据段 N+3 传输失败,所以服务器 A 未能收到序列号为 M+1500 的字节,因此服务器 A 还会再次以序列号 M+1500 进行确认。

6、TCP 流量控制

1.6 TCP/UDP 协议(传输层)

TCP 滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
如上图所示,主机 A 和服务器 A 之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机 A 发送数据给服务器 A 时,服务器 A 通过滑动窗口进行流量控制。
主机 A 向服务器发送 4 个长度为 1024 字节的数据段,其中主机的窗口大小为 4096 个字节。服务器 A 收到第 3 个数据段后,缓存区满,第 4 个数据段被丢弃。服务器以 ACK 3073 响应,窗口大小调整为 3072,表明服务器的缓冲区只能处理 3072 个字节的数据段。于是主机 A 改变其发送速率,发送窗口大小为 3072 的数据段。

7、TCP 关闭连接

1.6 TCP/UDP 协议(传输层)

TCP 支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP 通过三次握手建立的实际上是两个方向的连接,因此,在传输完毕后,两个方向的连接必须都要关闭。
TCP 连接的建立是一个三次握手的过程,而 TCP 连接的终止则要进行四次握手。
如上图所示:
主机 A 想终止连接,于是发送了一个标识了 FIN+ACK 的数据段,序列号(Seq)为 a,确认序列号(Ack)为 b。
服务器 A 回应一个标识了 ACK 的数据段,序列号为 b,确认序列号为 a+1,作为对主机 A 的 FIN 报文的确认。
服务器 A 想终止连接,于是向主机 A 发送一个标识了 FIN+ACK 的数据段,序列号为 b,确认序列号为 a+1。
主机 A 回应一个标识了 ACK 的数据段,序列号为 a+1,确认序列号为 b+1,作为对服务器 A 的 FIN 报文的确认。
经过以上四次交互,便完成了两个方向连接的关闭。

8、UDP

1.6 TCP/UDP 协议(传输层)

UDP 是一种面向无连接的传输层协议,传输的可靠性没有保证。
当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以使用 UDP 协议来替代 TCP 协议在传输层控制数据的转发。UDP 将数据从源端发送到目的端时,无需事先建立连接。
UDP 采用了简单、易操作的机制在应用程序间传输数据,没有使用 TCP 中的确认技术或滑动窗口机制,因此 UDP 不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。

9、UDP 头部

1.6 TCP/UDP 协议(传输层)

UDP 报文分为 UDP 报文头和 UDP 数据区域两部分。
UDP 适合于实时数据传输,如语音和视频通信。相比于 TCP,UDP 的传输效率更高,开销更小,但是无法保障数据传输的可靠性。
Source Port:源端口号,16位。表示源主机的应用程序使用的端口号。
Destination Port:目的端口号,16位。表示目的主机的应用程序使用的端口号。
Length:UDP 头部和 UDP 数据的字节长度,16位。因为 UDP 头部长度为 8 字节,所以该字段的最小值为 8。
Checksum:校验和,16位。提供了与 TCP 校验字段同样的功能,该字段为可选字段。

10、UDP 传输过程

1.6 TCP/UDP 协议(传输层)

主机 A 发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达主机 B。在这样的情况下,先发送的数据包不一定先到达主机 B,因为 UDP 数据包没有序号,主机 B 将无法通过 UDP 协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。通常情况下,UDP 采用实时传输机制和时间戳来传输语音和视频数据。

1.6 TCP/UDP 协议(传输层)

UDP 不提供重传机制,占用资源小,处理效率高,所以常用来传输对时延敏感的数据。
在使用 TCP 传输数据时,如果一个数据段丢失或者接收端对某个数据段没有确认,发送端会重新发送该数据段。TCP 重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于时延敏感的应用,少量的数据丢失一般可以被忽略,这时使用 UDP 传输将能够提升用户的体验。

分享