本文共 5083 字,大约阅读时间需要 16 分钟。
点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏
小伙伴儿们看完以后可不可以帮我点亮一下在看呀~
从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络的边缘部分中的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有传输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
下图说明了传输层的作用。设局域网 LAN1 上的主机 A 和局域网 LAN2 上的主机 B 通过互连的广域网 WAN 进行通信。我们知道,IP 协议能把源主机 A 发送出的分组,按照首部中的目的地址,送交到目的主机 B 。那么,为什么还需要传输层?
图1
**从 IP 层来说,通信的两端是两台主机。**IP 数据报的首部明确地标志了这两台主机的 IP 地址。但“两台主机之间的通信”这种说法还不够清楚。这时因为,真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。
IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付到主机中的应用进程。从传输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信实际上是应用进程之间的通信。
在一台主机中,经常有多个应用程序同时分别和另一台主机中的多个应用程序通信。例如上图中,主机 A 的应用进程 AP1 和主机 B 的应用进程 AP3 通信,与此同时,应用进程 AP2 也和对方的应用进程 AP4 通信。
这表明传输层有一个很重要的功能——复用(multiplexing)和分用(demultiplexing)。这里的“复用”是指发送方不同的应用进程都可以使用同一个传输层协议传送数据(加上适当的首部),而“分用”是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付给目的应用进程。
上图中两个传输层之间有一个双向粗箭头,写明“运输层提供应用程序间的逻辑通信”。
逻辑通信的意思是:从应用层来看,只要把应用层的报文交给下面的传输层,传输层就可以把这个报文传送到对方的传输层,就好像这种通信就是沿水平方向直接传送数据。但事实上这两个传输层之间并没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向(经过多个层次)传送的。
图2
从上图可以看出网络层和传输层有明显的区别。网络层为主机之间提供逻辑通信,而传输层为应用进程之间提供端到端的逻辑通信。另外,传输层还需要对报文进行差错检测,提供面向连接的 TCP 和无连接的 UDP 。
TCP/IP 传输层的两个主要协议分别是:
下图给出了这两种协议在协议栈中的位置。
图3
**UDP 在传送数据之前不需要建立连接。**远地主机的传输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式。
**TCP 提供面向连接的服务。**在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 提供可靠的、面向连接的传输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
下图给出了一些应用和应用层协议主要使用的传输层协议(UDP 或 TCP)。
图4
应用层所有的应用进程都可以通过传输层再传送到网络层,这就是复用。传输层从网络层收到发送给各个应用进程的数据后,必须分别交付给指明的各应用进程,这就是分用。显然,给应用层的每个应用进程赋予一个明确的标志是至关重要的。
解决这个问题的方法就是在传输层使用协议端口号(protocol port number),或通常简称为端口(port)。这就是说,虽然通信的终点是应用进程,但只要把所传送的数据交到目的主机的某个合适的目的端口,剩下的工作(即最后交付给目的进程)就由 TCP 或 UDP 来完成。
注意:这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。
硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体进行交互的一种地址。 不同的系统具体实现端口的方法可以是不同的。
TCP/IP 的传输层用一个 16 位端口号来标志一个端口。16 位端口号可允许有 65535 个不同的端口号,这个数目对一个计算机来说是足够用的。
注意:端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和传输层交互时的层间接口。在互联网不同的计算机中,相同的端口号是没有关联的。
由此可见,两个计算机中的进程要互相通信时,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且要知道对方的端口号(为了找到对方计算机中的应用程序)。互联网上的计算机通信采用客户端-服务器模式。客户端在发起通信请求时,必须先知道对方服务器的 IP 地址和端口号。因此传输层的端口号分为下面两大类。
图5
用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。UDP 的主要特点是:
如下图所示,在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在除去首部后就原封不动地交付给上层的应用进程。也就是说,UDP 一次交付一个完整的报文。
因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报首部的相对长度太大,这也降低了 IP 层的效率。
图6
微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本
UDP 没有拥塞控制
因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的。很多的实时应用(IP 电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但不允许数据有太大的时延。UDP 正好适合这种要求。
用户数据报 UDP 有两个字段:首部字段和数据字段。首部字段很简单,只有 8 个字节,由四个字段组成,每个字段的长度为 2 个字节。如图所示。
图7
各字段意义如下:
当传输层从网络层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程。
下图是 UDP 基于端口分用的示意图。
图8
如果接收方 UDP 发现收到的报文中的端口号不正确(即不存在对应该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送**“端口不可达”差错报文**给发送方。
注意:虽然 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字(TCP 之间的通信必须要在两个套接字之间建立连接)。
UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。所谓伪首部,是因为这种伪首部不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加到 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时的 UDP 用户数据报来计算的。伪首部既不向下传递也不向上递交,而仅仅是为了计算检验和。
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法类似。但不同的是,IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和是把首部和数据部分一起都检验的。
TCP 是 TCP/IP 体系中非常复杂的一个协议。下面介绍 TCP 最主要的特点。
在发送时,应用程序在把数据传给 TCP 的缓存后,就可以做自己的事,而 TCP 在合适的时候把数据发送出去。
在接收时,TCP 把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
**TCP 把连接作为最基本的抽象。**TCP 的许多特性都与 TCP 是面向连接的这个基本特性有关。
前面我们说过,每一条 TCP 连接有两个端点,这个端点就叫做套接字(socket)或插口。套接字的表示方法是在点分十进制的 IP 地址后面写上端口号,中间用冒号或逗号隔开。
套接字 socket = ( IP 地址 : 端口号 )192.3.4.5:80
由于每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定,则有:
TCP 连接 := { socket1, socket2 } = { (IP1 : port1), (IP2 : port2) }
注意:同一个 IP 地址可以有多个不同的 TCP 连接,而同一个端口号也可以出现在多个不同的 TCP 连接中。