视频地址:湖南科技大学计算机网络微课堂https://www.bilibili.com/video/BV1c4411d7jb
5.1 运输层概述
为什么需要运输层
- 之前介绍的计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了
主机到主机的通信
。 - 但实际上在计算机网络中进行通信的真正实体是位于通信两端
主机中的进程
。 - 如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层协议又称为
端到端协议
。
运输层直接为应用进程间的逻辑通信提供服务
- 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。
- 根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即
面向连接的TCP
和无连接的UDP
。
5.2 端口号、复用、分用的概念
5.2.1 端口号
为什么需要端口号?
- 运行在计算机上的进程使用进程标识符
PID
来标志。 - 因特网上的计算机并不是使用统一的操作系统,不同的操作系统(windows,Linux,Mac os)又使用不同格式的进程标识符。
- 为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。
- TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。
端口号分类
端口号使用16比特表示,取值范围0~65535;
- 熟知端口号:0~1023,这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53。
- 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须登记,以防止重复。例如: MySql使用的端口号3306。
- 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
端口号只具有本地意义
,即端口号只是为了标识本计算机应用层中的各进程
,在因特网中不同计算机中的相同端口号是没有联系的。
5.2.2 发送方的复用和接收方的分用
发送方
- 发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,称为
UDP复用
。使用TCP协议进行封装,称为TCP复用
。运输层使用端口号来区分不同的应用进程
。 - 不管是使用运输层的UDP协议封装成的UDP数据报,还是TCP数据报,在网络层都需要使用IP协议封装成IP数据报,称为
IP复用
。 - IP数据报首部中协议字段的值,用来表示IP数据报的数据载荷部分封装的是何种协议数据单元。
- 协议字段为6,表示封装的是TCP报文段。协议字段为17,表示封装的是UDP报文段。
接收方
- 接收方的网络层收到IP数据报后进行IP分用。
- 根据IP数据报中协议字段的值是6还是17分别交付给运输层的UDP或者TCP。
- 运输层根据协议不同分别进行UDP分用和TCP分用。也就是根据端口号将其上交给上层的应用进程。
TCP/IP体系的应用层常用协议所使用的运输层熟知端口号
【举例】运输层端口号的作用
如图所示:
- 用户PC通过交换机和DNS服务器以及Web服务器互联,他们处在同一个以太网中。
- DNS服务器中记录有Web服务器域名所对应的IP地址
用户PC发送DNS查询请求报文
- 用户在浏览器中输入URL来访问Web服务器的内容,在浏览器输入Web服务器的域名。
- 用户PC中的DNS客户端进程会发送一个
DNS查询请求报文
(查询域名对应的IP地址) - DNS查询请求报文需要使用UDP协议封装成
UDP数据报
。 - UDP数据报首部的源端口从短暂端口号:49152~65535中挑选一个未占用的,用来表示
DNS客户端进程
如:49152
。目的端口为53。这是DNS服务器端进程
使用的端口号。 - 将UDP数据报封装到
IP数据报
中,通过以太网发送到DNS服务器。
DNS服务器收到用户PC发送的IP数据报
- 收到
IP数据报
,解封出UDP数据报
。UDP首部的目的端口是53,表示应该将UDP数据报的数据载荷部分(DNS查询请求报文)交给本服务器的DNS服务器端进程处理。 - DNS服务器端解析DNS查询请求报文内容,然后按其要求查询对应域名的IP地址。
- 查到后,会给用户PC发送
DNS响应报文
(内容为域名对应的IP地址)。 - DNS响应报文使用UDP协议封装为
UDP数据报
,源端口为53,目的端口为49152
。 - 将UDP数据报封装为
IP数据报
,通过以太网发送到用户PC。
用户PC收到DNS服务器响应报文
- 解析出
UDP数据报
,目的端口是49152
,需要将响应报文交给DNS客户端进程处理。 - DNS客户端进程解响应报文,得到域名对应的IP地址。
- 有了IP地址,用户PC端的HTTP客户端进程,就可以向Web服务器发送
HTTP请求报文了
(首页内容是什么) - HTTP请求报文使用TCP协议封装成
TCP报文段
。 - TCP数据报首部的源端口从短暂端口号:49152~65535中挑选一个未占用的,用来表示
HTTP客户端进程
如:49152
。目的端口为80。这是HTTP服务器端进程使用的端口号。 - 将TCP报文段封装在
IP数据报
中,通过以太网发送到Web服务器。
Web服务器收到用户PC发送的IP数据报
- 收到IP数据报,解封出
TCP报文段
。TCP首部的目的端口是80,表示应该将TCP报文段的数据载荷部分(HTTP请求报文)交给本服务器的HTTP服务器端进程处理。 - HTTP服务器端解析
HTTP请求报文
内容,然后按其要求查询首页内容。 - 查到后,会给用户PC发送
HTTP响应报文
(HTTP客户端请求的首页内容)。 - HTTP响应报文使用TCP协议封装为TCP报文段,源端口为80,目的端口为
49152
。 - 将TCP报文段封装为
IP数据报
,通过以太网发送到用户PC。
用户PC收到Web服务器响应报文
- 收到
IP数据报后
,解析出TCP报文段
,TCP首部的目的端口是49152
,表示应该将TCP报文段的数据载荷部分(HTTP响应报文)交给用户PC端的HTTP客户端进程处理。 - HTTP客户端解析
HTTP响应报文
内容,并在网页浏览器上显示。 - 这样就可以在浏览器上看到Web服务器提供的首页内容了。
5.3 UDP和TCP的对比
- UDP什么时候都可以进行数据传输,TCP必须建立连接才能传输数据。
TCP和UDP广播数据通信
- UDP支持单播,多播以及广播(一对一,一对多,一对全的通信),TCP只支持单播(一对一)。
TCP和UDP对应用报文的处理
- UDP对发送方应用进程的报文既不合并也不拆分,直接将其交互给接收方应用进程。(面向应用报文)
- 发送方的TCP协议把应用进程的报文,看做一连串的为无结构的字节流。TCP将其编号存储在自己的发送缓冲中。
- TCP根据发送策略,从发送缓存中提取一定数量的字节,构建TCP报文段并发送。
- 接收方的TCP协议,一方面从所接收到的TCP报文段中取出数据载荷并存储在接收缓存中,一方面将缓存中的一些字节交给应用进程。
- TCP不保证接收方应用进程所收到的数据块与发送方应用进程所发送的数据块具有对应大小关系。例如:发送方应用进程交给发送方的TCP共10个数据块。但接收方的TCP可能只用了4个数据块就把收到的字节流交付给了上层的应用进程。
- 接收方应用进程收到的字节流必须和发送方应用进程发出的字节流完全一样。
- 接极方的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层数据。(面向字节流)
TCP和UDP提供的传输服务
TCP/IP体系结构的网际层向上层提供不可靠传输服务
- 当运输层使用UDP时,向上层提供的也是无连接不可靠传输服务
- 使用UDP时,若传输过程中用户数据报受到平扰而产生误码,接收方UDP可以通过该数据报首部中的校验和字段的值检查出产生误码的情况。 但仅仅丢弃该数据报,其他什么也不做。
- 如果该数据报被因特网中的某个路由器丢弃了。发送方UDP不做任何处理。
- 尽管网际层中的IP协议,向上提供的是无连接不可靠的传输服务。但只要运输层使用TCP协议,就可向其上层提供面向连接的可靠传输服务。
- 可以将其想象成:使用TCP协议的收发双方,基于TCP连接的可靠信道进行数据传输。不会出现误码、丢失、乱序以及重复等传输差错。
UDP用户数据报和TCP报文段的首部
- UDP首部仅有4个字段,每个字段长2个字节。共8个字节。
- 由于UDP提供不可靠传输服务,仅仅在网际层的基础上添加了用于区分应用进程的端口。
- TCP报文段首部最小20字节,最大60字节
- 这是因为要实现可靠传输、流量控制、拥塞控制等服务。首部比较复杂。
5.4 TCP的流量控制
为什么需要流量控制
- 一般来说,我们总是希望数据传输得更快一些。
- 但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
- 所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
- 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
5.5 TCP的拥塞控制
- 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。
- 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源
- 若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
5.6 TCP可靠储传输的实现
- TCP基于以字节为单位的滑动窗口来实现可靠传输
【假设】发送方收到了接收方的确认报文段。首部信息:rwnd=20
,ack=31
。
- 在报文段首部中的窗口字段的值是20,也就是接收方表明自己的接收窗口的尺寸为20字节。
- 确认号字段的字节为31,这表明接收方希望收到的下一个数据的序号是31。序号30及之前的数据已经全部正确接收了。
- 发送方根据这两个字段的值构造自己的发送窗口。