\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{%
  calc,
  backgrounds,
  positioning,
  chains,
  scopes,
}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}
\def\ul{.65cm}
\begin{tikzpicture}
  [
    help lines/.style = {color=yellow!50,very thin},
    font=\small,
    every box/.style = {draw, thin},
    %
    every layer/.style = 
      {minimum width = 9.5cm},
    every visible layer/.style = 
      {every layer, every box},
    every layer icon/.style  = 
      {label={[align=right,font=\normalsize,shift={(2cm,0cm)}]180:#1 }},
    layers/.style = 
      { chain default direction = going above,
        start chain = layers chain, node distance = 2pt,
        every layer/.append style = 
          {on chain=layers chain},
        every visible layer/.append style = 
          {on chain=layers chain, fill=gray!30},
      },
    %
    link layer/.style = 
      {every visible layer, minimum height = 1.5cm, 
       every layer icon = {Network\\Interface}
      },
    %
    place holder layer/.style = 
      {every layer, minimum height = 0.7cm},
    %
    internet layer/.style = 
      {every visible layer, minimum height = 1.5cm, 
       every layer icon = {Internet}
      },
    %
    transport layer/.style = 
      {every visible layer, minimum height = 1.5cm, 
       every layer icon = {Transport}
      },
    %
    application layer/.style = 
      {every visible layer, minimum height = 1.5cm, 
       every layer icon = {Application}
      },
    %
    every module/.style =
      {},
    module/.style = 
      {every module, every box, align=center, fill=white, minimum height = #1},
    place holder module/.style = {every module, minimum height = #1},
    modules/.style = 
      { chain default direction = going left,
        start chain = #1, node distance = 2pt,
        every module/.append style = 
          {on chain=#1}
      },
  ]

  \begin{scope}[layers]
    \node[link layer] (link layer) {};
    \node[place holder layer] (none layer) {};
    \node[internet layer] (internet layer) {};
    \node[transport layer] (transport layer) {};
    \node[place holder layer] (api layer) {};
    \node[application layer] (application layer) {};
  \end{scope}

  \begin{scope}[modules=interface modules
    , every node/.style={text width=1.5cm}]
    \node[module=1cm, anchor=south east] 
      at ([shift={(-5pt, 5pt)}]link layer.south east) 
        {Loop};
    \node[module=1cm] {Ethernet (skeleton)};
    \node[module=1cm] {PPP};
    \node[module=1cm] {SLIP};
  \end{scope}

  \begin{scope}[modules=none layer modules]
    \node[module=0.5cm, anchor=south east] 
      at ([shift={(-15pt, 2pt)}]none layer.south east)
        {EtherARP};
  \end{scope}

  \begin{scope}[modules=internet modules, text width=2.0cm]
    \node[module=1cm, anchor=south east] 
      at ([shift={(-5pt, 5pt)}]internet layer.south east)
        {IP, IPv6};
    \node[module=1cm] {IGMP};
    \node[module=1cm] {ICMP, ICMPv6};
  \end{scope}

  \begin{scope}[modules=transport modules, text width=2.0cm
    , every node/.style={minimum width=3.4cm}]
    \node[module=1cm, anchor=south east] 
      at ([shift={(-5pt, 5pt)}]transport layer.south east)
        {UDP};
    \node[module=1cm] {TCP};
  \end{scope}

  \begin{scope}[modules=api layer modules
    , module/.append style={text width=2.5cm}]
    \node[module=0.5cm, anchor=south east] 
      at ([shift={(-15pt, 2pt)}]api layer.south east)
        {Berkely Sockets};
    \node[place holder module=0.5cm, minimum width = 0.1cm] {};
    \node[module=0.5cm] {Raw API};
  \end{scope}

  \begin{scope}[modules=transport modules, text width=2.0cm]
    \node[module=1cm, anchor=south east] 
      at ([shift={(-5pt, 5pt)}]application layer.south east)
        {SNMP};
    \node[module=1cm] {DHCP};
    \node[module=1cm] {DNS};
  \end{scope}

  \path
    let 
      \p1 = (link layer.south west),
      \p2 = (application layer.north west)
    in
      (\p1) -- (\p2) node
        [font=\Large\bf, pos=1,anchor=east, rotate=90,yshift=1.0cm
         , color=white]
        {lwIP TCP/IP Suit\'e};

  \begin{pgfonlayer}{background}
    \path [fill = gray] ([shift={(-1.5cm,-0.2cm)}]link layer.south west) 
      rectangle
      ([shift={(0.2cm,0.2cm)}]application layer.north east);
  \end{pgfonlayer}

\end{tikzpicture}
\end{document}

