1. 运输层通信
我们知道,网络层的通信虽然通过IP协议能把分组送到目的主机,但这个分组还停留在主机的网络层而没有交付主机中的应用进程。而我们平时上网真正需要通信的是应用进程相互通信,而从运输层的角度看也是如此,端对端的通信是主机中进程之间的通信。
简而言之,网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端对端的逻辑通信。
而主机中会有很多个应用进程,怎么才能区分每个应用进程?这就需要在运输层使用协议端口号,通常简称为端口。
TCP/IP 的运输层用一个 16 位端口号来标志一个端口(端口号只具有本地意义,而且很多情况个自行修改)。16 位的端口号可允许有 65535 个不同的端口号,这个数目对于一台计算机来说是足够用的。
由此可见,两个计算机中的进程要互相通信,不仅需要知道对方的 IP 地址,还要知道对方端口号(为了找到指定计算机中的指定进程)。
运输层要完成通信还需要依靠协议, TCP/IP 运输层的两个主要协议都是互联网的正式标准即:
(1)用户数据报协议 UDP (User Datagram Protocol)
(2)传输控制协议 TCP(Transmission Control Protocol)
2. 用户数据报协议 UDP
2.1 UDP 概述
用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。
UDP 的主要特点是:
- UDP 是无连接的。即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
- UDP 使用尽最大努力交付。即不保证可靠交付,因此主机不需要维持复杂的连接状态表。(但也不保证数据的完整性,可能导致数据丢失。)
- UDP 是面向报文的。即对应用层交下来的报文,在添加首部后就向下交付 IP 层。对应用层交下来的报文既不合并也不拆分,而是保留这些报文的边界。接收时也只是取出首部后就向上交付,也就是说 UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。否则太大或太小,都会降低 IP 层的效率。
- UDP 没有拥塞控制。因此网络出现的拥塞不会影响源主机的发送速率。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小。只有 8 个字节,比 TCP 的 20 个字节的首部要短。
2.2 UDP 的首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有 8 个字节,由四个字段组成,每个字段长度都是 2 个字节。各字段意义如下:
- 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
- 目的端口:目的端口号。这在终点交付报文时必须要使用到。
- 长度: UDP用户数据报的长度,其最小值是8(仅有首部)。
- 校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应端口上交应用进程。
如果接收方 UDP 发现收到的报文中的目的端口号不正确,就丢弃该报文,并由网际控制报文协议 ICMP 发送 “端口不可达” 差错报文给发送方。
【伪首部】
UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。
3. 传输控制协议 TCP
TCP 协议比较复杂,重点包括可靠传输、流量控制和拥塞控制等。
TCP 的主要特点是:
- TCP 是面向连接的运输层协议。就是说,应用程序在使用 TCP 协议之前,必须先建立TCP 连接。传输完毕后,必须释放 TCP连接。
- 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(也就是一对一)。
- TCP 提供可靠交付的服务。无差错、不丢失、不重复,并且按序到达。
- TCP 提供全双工通信。TCP 允许通信双方的应用在任何时候都能发送数据。
- 面向字节流。