计算机网络运输层之多路复用与多路分解

2014年03月21日 00:13:10
一、什么是多路复用和多路分解
我们知道,在网络上主机与主机之间的通信,实质上是主机上运行的应用进程之间的通信。例如,当你通过Http上网浏览网页时,实质上是你所访问的主机的服务器进程与你本机的浏览器进程在进行通信。试想一下,当你在上网的同时,还挂着QQ,还使用ftp下载大文件,这时就有三个网络上的进程与你的主机上的三个进程进行通信,那么系统是怎么样正确地把接收到的数据定位到指定的进程中的呢?也就是说,系统是怎么把从ftp服务器发送过来的数据交付到ftp客户端,而不把这些数据交付到你的QQ上的呢?反过来考虑,系统又是如何精确地把来自各个应用进程的数据发到网络上指定上的主机(服务器)上的对应进程的呢?这就是多路分解与多路复用的作用了。

为了说明这个问题,先来补充一下操作系统方面的知识,以Linux对文件和设备的管理和使用方式为例。

为了方便资源的使用,提高机器的性能、利用率和稳定性等等原因,我们的计算机都有一层软件叫做操作系统,它用于帮我们管理计算机可以使用的资源,当我们的程序要使用一个资源的时候,可以向操作系统申请,再由操作系统为我们的程序分配和管理资源。通常当我们要访问一个内核设备或文件时,程序可以调用系统函数,系统就会为我们打开设备或文件,然后返回一个文件描述符fd(或称为ID,是一个整数),我们要访问该设备或文件,只能通过该文件描述符。可以认为该编号对应着打开的文件或设备。

而当我们的程序要使用网络时,要使用到对应的操作系统内核的操作和网卡设备,所以我们可以向操作系统申请,然后系统会为我们创建一个套接字Socket,并返回这个Socket的ID,以后我们的程序要使用网络资源,只要向这个Socket的编号ID操作即可。而我们的每一个网络通信的进程至少对应着一个Socket。向Socket的ID中写数据,相当于向网络发送数据,向Socket中读数据,相当于接收数据。而且这些套接字都有唯一标识符——端口号。

有了上面的了解后,再来说说什么是多路分解和多路复用

每个运输层的报文段中设置了几个字段,包括源端口号和目的端口号等。多路分解就是,在接收端,运输层检查这些字段并标识出接收套接字,然后将该报文定向到该套接字。其工作方式可以简单地认为是这样的,主机上的每个每个套接字被分配一个端口号,当报文到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。

多路复用就是从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层中去。

二、无连接的多路复用和多路分解
在运输层,无连接的网络传输是通过UDP来实现的。UDP报文中只有源端口号和目的端口号,一个UDP套接字是由一个含有目的IP地址和目的端口号的二元组来全面标识的。在客户端,源端口号是客户进程套接字的端口号,目的端口号是服务器的端口号。而在服务器端,源端口号是服务器的创建的套接字的端口号,而目的端口号是客户端的套接字的端口号。

例如主机A产生了一个UDP报文段,报文段中就会包括源端口号(11111)、目的端口号(22222)、程序数据(还有两个其他的值,在这里我们不关心)。然后,运输层将生成的报文段交给网络层。网络层将其放到一个IP数据报中,并提供尽力而为的交付,将其发送到主机B中。如果该报文到达主机B,主机B运输层就会检查该报文的端口号,并将该报文段传递给套接字的端口号为接收到的报文段的目的端口号(22222)的套接字。从而实现了进程间的网络通信。而源端口号的作用是为了让主机B能向主机A发送信息的,也就是说,当主机B在接收到主机A的数据后,要向主机A发送一个回应时,主机B发送的报文段的目的端口号就是11111.

注意:我们看到使用UDP来传输报文段时,一个UDP套接字是由一个含有目的IP地址和目的端口号的二元组来全面标识的。因此,如果两个UDP报文段有不同的源IP地址和源端口,但具有相同的IP地址和目的端口号,那么这两个报文段将通过相同的目的端口号定向到相同的目的进程。这里没有过多地说明IP地址,是因为IP地址是网络层的知识,所以没有提及,我们现在只须知道,IP地址对应着一台主机,而端口号对应着一台主机上的一个进程(或套接字)。

三、面向连接的多路复用和多路分解
从上面的解说中,我们可以知道,网络上主机间的进程间通信,实质上是通过套接字来实现的。在运输层中面向连接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差别,就是,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。这样,当一个TCP报文段从网络到达一台主机时,主机会使用全部4个值来将报文段定向,即多路分解到相应的套接字。

与UDP不同的是,两个具有不同源IP或源端口号的到达的TCP报文段将被重定向到两个不同的套接字。

尽管如此,而TCP的多路利用和多路分解的工作原理与无连接的UDP的多路复用和多路分解的原理还是大致一样的。

想想为什么TCP的多路复用和多路分解要这样设计呢?个人认为,这是因为TCP和UDP对待接收到的数据的处理方式不同所致的。我们以服务器上的TCP套接字和UDP套接字为例,假定服务器接收客户端的数据,并把数据发送回客户端。

当一个UDP服务器接收到一个UDP报文段时,它会根据收到的UDP报文段的源IP和源端口号,把数据发送回客户端,它并不需要创建一个新的套接字来处理该报文段;

而对于一个TCP服务器,当它接受一个连接时,它会产生一个新的套接字,然后通过新的套接字来与客户端通信,也就是通过新的套接字来把数据发送回给客户端。由于每一个连接都会产生一个新的套接字,所以具有不同的源IP或源端口号的连接就是一个不同的连接,对应着产生的新的不同的套接字。

试想一下,如果TCP套接字也是使用像UDP那样的只用源端口号和目的端口号来完全标识一个套接字,那么当客户机A有一个Http连接时,该TCP报文的目的端口号为80,目的IP地址为TCP服务的IP地址。TCP服务器产生一个新的套接字来处理该请求,此时,客户机B又有一个Http连接,TCP报文的目的端口号也为80,目的IP地址也为TCP服务的IP地址。而TCP套接字也是使用像UDP那样,两个具有不同的源Ip或源端口号但具有相同目的IP和目的端口的报文段定位到同一个套接字中,那么这个客户机B的TCP报文段则会多路分解到客户机A的套接字上,而该套接字并不应该被客户机B的Http连接使用。

PS:如果对于这个解说不太明白,可以看看本人写的一个用TCP和UDP进行通信的小例子,
TCP通信:http://blog.csdn.net/ljianhui/article/details/10477427
UDP通信:http://blog.csdn.net/ljianhui/article/details/10697935

2017-02-09 自顶向下:运输层概述、运输层和网络层的关系、多路复用与多路分解、UDP简介

2017-02-09 自顶向下:运输层概述、运输层和网络层的关系、多路复用与多路分解、UDP简介 逻辑通信(logic communication)、运输层报文段(segment)、尽力而为交付服务...
  • u014222687
  • u014222687
  • 2017年02月12日 13:38
  • 436

多路复用/多路分解

套接字寻址系统使得TCP和UDP能够执行传输层另一个重要任务:多路复用和多路分解。多路复用是指把多个来源的数据导向一个输出,而多路分解是把从一个来源接收的数据发送到多个输出。 多路传输/...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年08月10日 20:22
  • 2230

Linux网络编程 - TCP高级应用:多路复用

文件I/O方式比较 1. 阻塞式文件IO 2. 非阻塞式文件IO 3. 多路复用IO 4. 信号驱动IO(也叫驱动异步IO) IO...
  • ygl840455828ygl
  • ygl840455828ygl
  • 2016年09月05日 09:37
  • 191

基于TCP客户端和服务器的I/O多路复用

一、基于TCP/IP协议的基本循环服务器 tcp_server.c [cpp] view plain copy   #include    #...
  • zscfa
  • zscfa
  • 2016年12月05日 00:09
  • 518

Android移动端IM开发之应用层实现TCP长连接多路复用

这里只是提供一个长连接多路复用的实现思路什么是长连接多路复用 从字面意思看就是一台设备只有一条长连接连向服务器,其他集成这个IM SDK的app都会共享这条长连接,TCP长连接的维护是比较耗资源的,而...
  • lhd201006
  • lhd201006
  • 2016年04月22日 17:09
  • 3131

传输层的复用和解复用

复用和解复用 将端到端的网络层协议扩展到进程到进程的传输层协议称为复用和解复用。复用和解复用是所有计算机网络都需要的 在目的端主机上,传输层将段中的数据传送给相应的进程中。一个进程可...
  • happy_lucky52
  • happy_lucky52
  • 2017年06月10日 21:37
  • 428

《计算机网络》知识总结-3.复用和分用

复用和分用纯粹是一种逻辑概念。当用户很多,而资源不足的时候,我们就会重复使用并且彼此分享,这个很好理解。 而为了把这种资源不足的行为做定义,就引发了2个新概念。 复用多个用户使用一个IO资源 发送消息...
  • u010833547
  • u010833547
  • 2016年11月01日 22:33
  • 1185

计算机网络6--多路复用技术

本页内容 1.多路复用介绍         多路复用即一个信道传输多路信号
  • u014581901
  • u014581901
  • 2016年02月05日 00:44
  • 1669

多路复用/多路分解

套接字寻址系统使得TCP和UDP能够执行传输层另一个重要任务:多路复用和多路分解。多路复用是指把多个来源的数据导向一个输出,而多路分解是把从一个来源接收的数据发送到多个输出。 多路传输/...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年08月10日 20:22
  • 2230

2017-02-09 自顶向下:运输层概述、运输层和网络层的关系、多路复用与多路分解、UDP简介

2017-02-09 自顶向下:运输层概述、运输层和网络层的关系、多路复用与多路分解、UDP简介 逻辑通信(logic communication)、运输层报文段(segment)、尽力而为交付服务...
  • u014222687
  • u014222687
  • 2017年02月12日 13:38
  • 436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机网络运输层之多路复用与多路分解
举报原因:
原因补充:

(最多只允许输入30个字)