运输层协议概述
进程之间的通信
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
当网络的边缘部分中的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。
因此,两台主机进行通信就是两台主机中的应用进程互相通信。
从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
运输层有一个很重要的功能—“复用”和“分用”。“复用”指发送方不同的应用进程都可以使用同一个运输层协议传送数据,而“分用”指接收方的运输层在剥离报文的首部后能够把这些数据正确交付对应的应用进程。
从上图可看出,网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
运输层向高层用户屏蔽了下面网络核心的细节(网络拓扑、路由器所选择的协议等),它使应用进程看见的就是好像两个运输层实体之间有一条端到端的逻辑通信信道。
运输层的两个主要协议
- 用户数据报协议UDP :传送数据之前不需要先建立连接。远地主机的运输层在收到UDP 报文后,不需要给出任何确认。
- 传输控制协议TCP:提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。
两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元TPDU。但在TCP/IP 体系中,根据所使用的协议是TCP 或UDP,分别称之为TCP 报文段或UDP 用户数据报。
运输层的端口
应用层所有的应用进程都可以通过运输层再传送到IP 层(网络层),这就是复用。运输层从IP 层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程,这就是分用。
为使运输层能正确地将数据发送给对应的应用进程,我们在运输层使用协议端口号(简称端口)为每个应用进程赋予一个非常明确的标志。以此,我们需要利用目的主机提供的端口号来识别实现某功能的进程,而不需要知道具体实现这个功能的进程是哪个。
注意:这种在协议栈层间的抽象的协议端口是软件端口,和硬件端口完全不同。硬件端口实现不同硬件设备的交互,软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
TCP/IP 的运输层用一个16位的端口号来标志一个端口。端口号只具有本地意义,不同计算机的相同端口之间没有联系。
1. 服务器端使用的端口号
这里分为两类,最重要的一类叫做熟知端口号或系统端口号,数值为0~1023。
IANA 把这些端口号指派给了TCP/IP 最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后,IANA 必须为它指派一个熟知端口,否则互联网上的其他应用进程就无法和它进行通信。
另一类叫做登记端口号,数值为1024~65535。这类端口号为没有熟知端口号的应用程序所使用。
2. 客户端使用的端口号
数值为49152~65535,由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。
当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。
短暂端口表示这种端口的存在时间是短期的。客户进程并不在意操作系统给它分配的是哪一个端口号,因为客户进程之所以必须有一个端口号(在本地主机中必须是唯一的),是为了让运输层的实体能够找到自己。
这和熟知端口不同。服务器一旦接通电源,服务器程序就运行起来。为了让互联网上所有的客户程序都能找到服务器程序,服务器程序所使用的端口(熟知端口)就必须是固定的,并且是众所周知的。
用户数据报协议UDP
UDP 概述
用户数据报协议UDP 并没有在IP 的数据报服务之上增加太多功能。
- UDP 是无连接的;
- UDP 使用尽最大努力交付;
-
UDP 是面向报文的。发送方的UDP 对应用程序交下来的报文,在添加首部后就向下交付IP 层。
- UDP 没有拥塞控制。这使数据在发生网络拥塞时可能会丢失部分,但是并不会出现太大的数据延时。但当很多源主机同时向网络发送高速率的实时视频流时,网络就有可能发生拥塞,故不拥有拥塞控制功能的UDP 可能会引起网络产生严重的拥塞问题。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小。
UDP 的首部格式
用户数据报UDP 有两个字段:数据字段和首部字段。
首部字段很简单,只有8个字节,由四个字段组成,每个字段的长度都是两个字节。
- 源端口:源端口号;
- 目的端口:目的端口号;
- 长度:UDP 用户数据报的长度,最小值为8(只有首部);
- 检验和:检测UDP 用户数据报在传输中是否有错,有则丢弃。
当运输层从IP 层收到UDP 数据报时,就根据首部中的目的端口,把UDP 数据报通过相应的端口,上交最后的终点—应用进程。
若接收方UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP 发送“端口不可达”差错报文给发送方。
传输控制协议TCP 概述
TCP 最主要的特点
TCP 是TCP/IP 体系中非常复杂的一个协议。
- TCP 是面向连接的运输层协议。应用程序在使用TCP 协议之前,必须先建立TCP 连接。传送数据完毕后,必须释放已经建立的TCP 连接。
- 每一条TCP 连接只能有两个端点,每一条TCP 连接只能是点对点的(一对一)。
- TCP 提供可靠交付的服务。通过TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达。
- TCP 提供全双工通信。
-
面向字节流。TCP 中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP 的交互是一次一个数据块(大小不等),但TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如发送方应用程序交给接收方的TCP 共10个数据块,但可能缓存已经满了,接收方的TCP 只用了4个数据块就把收到的字节流交付上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
上图中,TCP 连接是逻辑连接,且实际网络中,一个TCP 报文段常常包含上千个字节。
TCP 和UDP 在发送报文时所采用的方式完全不同。
TCP 并不关心应用进程一次把多长的报文发送到TCP 缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少字节(UDP 发送的报文长度时应用进程给出的)。
TCP 的连接
TCP 把连接作为最基本的抽象。
每一条TCP 连接有两个端点。TCP 连接的端点叫做套接字(socket)或插口。
套接字socket = (IP 地址:端口号)
例如 192.3.4.5:80
每一条TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。
即: TCP 连接 ::= {socket1,socket2} = {(IP1:port1),(IP2:port2)}
可靠传输的工作原理
停止等待协议
1. 无差错情况
如图a
2. 出现差错
如上图b,A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传。
有三点需要注意:
- A在发送完一个分组后,必须暂时保留已发送分组的副本;
- 分组和确认分组都必须进行编号;
- 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一点。
3. 确认丢失和确认迟到
当B 发送给A 的确认报文丢失,则B 会再次收到A 重传的M1 报文,此时B 应该:
- 丢弃这个重复的分组M1;
- 向A 发送确认报文。
上述这种可靠的传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)。即重传是自动进行的,不需要B 向A 请求。
4. 信道利用率
停止等待协议的传输效率是很低的,为了提高效率,常采用流水线传输。
发送方可连续发送多个分组,不必每发送完一个分组就停下来等待对方的确认。
当使用流水线传输时,就要使用连续ARQ 协议和滑动窗口协议。
连续ARQ 协议
图a 中表示发送方维持的发送窗口,其意义是:位于发送窗口内的5个分组都可以连续发送出去,而不需要等待对方的确认。
连续ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。图b 表示发送方收到了对第一个分组的确认,于是把发送窗口向前移动一个分组的位置。
接收方一般采用累积确认的方式。也就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,即表示:到这个分组为止的所有分组都已正确收到了。
TCP 报文段的首部格式
TCP 虽然面向字节流,但是TCP 传送的数据单元却是报文段。一个报文段分为首部和数据两部分,而TCP 的全部功能都体现在它首部中各字段的作用。
TCP 报文段首部的前20个字节是固定的,后面有4n 个字节是根据需要而增加的选项(n 为整数)。因此TCP 首部的最小长度是20字节。
首部固定部分各字段的意义如下:
- 源端口和目的端口。各占2个字节,分别写入源端口号和目的端口号;
- 序号。占4字节,共232个序号。在一个TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号;
-
确认号。占4字节,是期望收到对方下一个报文段的第一个数据字节的序号;
若确认号=N,则表示到序号N-1 为止的所有数据都已正确收到; - 数据偏移。占4字节,指出TCP 报文段的数据起始处距离TCP 报文段的起始处有多远;
- 保留。占6为,保留为后用,暂为0;
- 紧急URG(URGent)。当URG 置1,发送应用进程就告诉发送方的TCP 有紧急数据要传送。于是发送方TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中**紧急指针(Urgent Pointer)**字段配合使用。
- 确认ACK(ACKnowledgment)。仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK 置1。
- 推送PSH(PuSH)。发送方TCP 把PSH 置1,并立即创建一个报文段发送出去。接收方TCP 收到PSH = 1 的报文段,就尽快交付接收应用进程。
- 复位RST(ReSeT)。当RST = 1,表明TCP 连接中出现严重差错,必须释放连接,重新建立运输连接。RST 置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也称为重建位或重置位。
- 同步SYN(SYNchronization)。在连接建立时用来同步序号。当SYN = 1而ACK = 0时表明这是一个连接请求报文段。对方若同意建立连接,则应在相应的报文段中使SYN = 1和ACK = 1。因此SYN = 1就表示这是一个连接请求或连接接收请求报文。
- 终止FIN(FINis)。用来释放一个连接。当FIN = 1表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
- 窗口。占2字节,其值为[0,216-1] 之间的整数。窗口指的是发送本报文段的一方的接收窗口(不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位为字节)。之所以有该限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。
- 检验和。占2字节,检验和字段检验的范围包括首部和数据这两部分。
- 紧急指针。占2字节。紧急指针仅在URG = 1时才有意义,其指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。即使窗口为零也可以发送紧急数据。
- 选项。长度可变,最长可达40字节。当没有使用“选项”时,TCP 首部长度是20字节。
TCP 可靠传输的实现
有关建立TCP 连接的“三次握手”和释放连接的“四次挥手”详见:
详解TCP 协议的【三次握手】建立连接和【四次挥手】释放连接
未完待续…