运输层有两个很重要的功能:复用(multiplexing)和分用(demutiplexing)。
复用:指在发送方不同的应用进程都可以使用同一运输层协议传输数据(当然需要加上适当的首部)。
分用:指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。
端口,全称为协议端口号(protocol port number)
TCP/IP 的运输层用一个 16 位端口号来标志一个端口。端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在因特网不同计算机中,相同的端口号是没有关联的。16 位的端口号允许有 65535 个不同的端口号。
- 服务器端使用的端口号,这里又分为两类,最重要的一类叫做熟知端口号(wellknown port number)或系统端口号,数值为 0~1023。这些数值可以在网址 http://www.iana.org/ 查到。IANA 把这些端口号指派给了 TCP/IP 最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后,IANA 必须为它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。另一类叫做登记端口号,数值为 1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。使用这类端口号必须在 IANA 按照规定的手续登记,以防止重复。
- 客户端使用的端口号,数值为 49152~65535。由于这类端口号仅在客户进程运行时动态选择,因此又叫做短暂端口号。这类端口号是留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号就可以供其它客户进程使用。
常用的熟知端口号
应用程序 | 熟知端口号 |
---|---|
FTP | 21 |
TELNET | 23 |
SMTP | 25 |
DNS | 53 |
TFTP | 69 |
HTTP | 80 |
SNMP | 161 |
SNMP(trap) | 162 |
常用应用使用的 UDP 和 TCP
应用 | 应用层协议 | 运输层协议 |
---|---|---|
名字转换 | DNS(域名系统) | UDP |
文件传送 | TFTP(简单文件传输协议) | UDP |
路由选择协议 | RIP(路由信息协议) | UDP |
IP 地址配置 | DHCP(动态主机配置协议) | UDP |
网络管理 | SNMP(简单网络管理协议) | UDP |
远程文件服务器 | NFS(网络文件系统) | UDP |
IP 电话 | 专用协议 | UDP |
流式多媒体同喜 | 专用协议 | UDP |
多播 | IGMP(网际组管理协议) | UDP |
电子邮件 | SMTP(简单邮件传输协议) | TCP |
远程终端接入 | TELNET(远程终端协议) | TCP |
万维网 | HTTP(超文本传输协议) | TCP |
文件传送 | FTP(文件传送协议) | TCP |
TCP 传输控制协议
TCP 主要特点:
- TCP 是面向连接的运输层协议。这就是说,应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
- 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
- TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、并且按序到达。
- TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给 TCP 的缓存后,就可以做自己的事,而 TCP 在合适的时候把数据发送出去。在接收时,TCP 把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
- 面向字节流。TCP 中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP 并不知道所传送的字节流的含义。TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应的大小的关系(例如,发送方应用程序交给发送方的 TCP 共 10 个数据块,但接收方的 TCP 可能只用了 4 个数据块就把收到的字节流交付给上层的应用程序。看 4,缓存)。但接收方的应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
TCP 的连接
TCP 把连接作为最基本的抽象。
TCP 连接有两个端点。TCP 连接的端点叫做套接字(socket)或插口。根据 RFC 793 的定义:端口号拼接到(contatenated with)IP 地址即构成了套接字。
套接字 socket = ( IP 地址:端口号)
TCP 连接 ::= {socket1, socket2} = {(IP1:port1), (IP2:port2)}
socket
同一个名词 socket 却可表示多种不同的意思:
- 允许应用程序访问连网协议的应用编程接口 API (Application Programming Interface),即运输层和应用之间的一种接口,称为 socket API,并简称为 socket。
- 在 socket API 中使用的一个函数名也叫做 socket。
- 调用 socket 函数的端点称为 socket,如“创建一个数据报 socket”。
- 调用 socket 函数时,其返回值称为 socket 描述符,可简称为 socket。
- 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。
TCP 的可靠传输
TCP 发送的报文段是交给 IP 层传送的。但 IP 层只能提供尽最大努力服务,也就是说,TCP 下面的网络所提供的是不可靠传输。因此,TCP 必须采取适当的措施才能使得两个运输层之间的通信变得可靠。
理想的传输条件有以下两个特点:
- 传输信道不产生差错。
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
然而实际的网络都不具备以上两个理想的条件,TCP 就是为了解决这样的问题。当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。
停止等待协议
全双工通信的双方既是发送方也是接收方。运输层不使用这种协议。
1-无差错情况
发送方发送数据,接收方返回确认,发送方继续发送下一个数据。
2-出现差错
超时重传,发送方发送数据时会暂时保留已发送的分组的副本,并设置了一个超时计时器。当接收方超时没有返回确认,发送方将会重传。
3-确认丢失和确认迟到
丢弃这个重复的分组,不向上层交付。向发送方发送迟到的确认。
4-信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低。
连续 ARQ 协议
自动重传请求 ARQ(Automatic Repeat reQuest)。
使用发送窗口,位于窗口内的分组连续发送出去,不需等待对方的确认,提高信道利用率。发送方每收到接收方的一个确认发送窗口就向前移动一个分组,当收到最后一个分组的确认,这就表示:到这个分组为止的所有分组都已正确收到了。
当中间有分组丢失时,发送窗口将要重回丢失的第一个分组,然后以这个分组开始重新发送(即使发送过了而且返回确认),这就叫 Go-back-N(回退 N)。如果通信线路质量不好,连续 ARQ 协议将会带来负面的影响。
TCP 首部格式
- 源端口和目的端口,各占 2 个字节。
- 序号,占 4 字节。序号范围是 [0, 2^32-1]。序号使用 mod 2^32 运算,超过又回到 0。每个序号代表一个字节。
- 确认号,占 4 字节。是期望收到对方下一个报文段的第一个数据字节的序号。即如果上一个序号字段值是 101,而携带的数据共有 100 字节,那么最后一个字节的序号是 200,所以确认号为 201。
- 数据偏移,占 4 位。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部长度。
- 保留,占 6 位。保留今后使用,但目前应置为 0。
- 紧急 URG(URGent),占 1 字节。当 URG = 1 时,表名紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按照原来的排队顺序来传送。与首部中的紧急指针字段配合使用。
- 确认 ACK(ACKnowlegment),占 1 字节。仅当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 推送 PSH(PuSH),占 1 字节。当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应,那么对方就不会等到整个缓存都填满了后再向上交付。推送操作很少用。
- 复位 RST(ReSeT),占 1 字节。当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其它原因),必须释放连接,然后再重新建立运输连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也可称为重建位或重置位。
- 同步 SYN(SYNchronization),占 1 字节。在连接建立时用来同步序号。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文中使 SYN = 1 和 ACK = 1。因此,SYN 置为 1 就表示这是一个连接请求或连接接受报文。
- 终止 FIN(FINis),占 1 字节。用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
- 窗口,占 2 字节。窗口值是 [0, 2^16-1] 之间的整数。窗口值作为接收方让发送方设置其发送窗口的依据。即告诉发送方,接收方的缓存空间大小。
- 检验和,占 2 字节。检验首部和数据是否有错。
- 紧急指针,占 2 字节。仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。即使窗口为零时也可发送紧急数据。
- 选项,长度可变,最长可达 40 字节,当没有使用“选项”时,TCP 的首部长度是 20 字节。
UDP 用户数据报协议
用户数据报协议 UDP 只在 IP 的数据报之上添加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。UDP 的特点是:
- UDP 是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的延迟。
- UDP 是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。
- UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。
- UDP 没有阻塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对实时应用是很重要的。如 IP 电话、实时视频会议等。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
UDP 的两个字段:数据字段和首部字段。
UDP 首部格式
由四个字段组成,每个字段都是两个字节。
各字段意义:
- 源端口,源端口号。在需要对方回信时选用。不需要时可用全 0.
- 目的端口,目的端口号。这在终点交付报文时必须要使用到。
- 长度,UDP 用户数据报的长度,其最小值是 8(仅有首部)。
- 检验和,检测 UDP 用户数据报在传输中是否有错。有错就丢弃。
如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送“端口不可达”差错报文给发送方。如 traceroute(ICMP 应用),就是使用 UDP 测试。