2.1. Two Types of Internet Sockets
        什么?只有两种 Internet sockets?是的。呵呵,不是的,我刚骗你的。实际上有更多,但我不想吓唬你。这里我只想谈其中的两种类型。我现在要告诉你 "Raw Sockets"也很有用的,你可以自己去查查资料,初此以外,我不会再谈论其他的类型的sockets了。
        好吧,现在开始!到底有哪两种类型呢?一个是"Stream Sockets"流Sockets;还一种就是"Datagram Sockets"数据报Sockets, 以后我们分别称为"SOCK_STREAM" and "SOCK_DGRAM"。数据报socket有时候被称做“无连接sockets”(尽管如果你愿意他们还是可以用connect()的,参见下面的 connect()
        流嵌套字是双向的可靠的通讯流。如果你把两个数据通过“1、2”这样的顺序放在流中,他们到达的顺序也就是“1,2”。而且他们是不会出现错误的。你发现他们出现了错误那肯定是你自己瞎想出来的。在这里就不讨论他们是怎么避免出现错误的。
        那么流嵌套字有什么用那?嗯,你听说过telnet这个应用程序对吧?他就用到了流嵌套字。你输入的所有的字符都会以同样的顺序返回来,对么?而且,网页浏览器用的HTTP协议使用了流嵌套字来得到页面。实际上,如果你用telnet连接一个网站的80端口,输入“GET  /”,他会返回HTML给你。
        流嵌套字怎么达到这么高的数据质量的那?他们使用了一种称作"The Transmission Control Protocol"的协议,也就是TCP协议。TCP保证了数据的到达顺序和错误检测。你可能在“TCP/IP”里听说过“TCP”,里面的“IP”代表"Internet Protocol"。IP主要处理互联网路由而不是对数据的集成。
        太酷了!那么数据报嵌套字那?他们为什么被称为无连接的?这里代表什么?为什么他们是不可靠的?好吧,这就是事实:如果你发送了一个数据报,他可能会到达。也可能是无序的到达。如果他到达了,在包中的数据也就自动检错的。
        数据报嵌套字也使用了IP进行路由,但他们不使用TCP;他们用了一种 "User Datagram Protocol"的协议,也叫“UDP”。
        为什么他们是无连接的?来看看,简单的说,那是因为你不需要象流嵌套字那样维护一条打开的连接。你只需要建立一个数据包,在上面加上IP数据头和目的地信息,然后把他发送出去。不需要连接。他们一般是用作信息的分组传输的。比如这些应用程序:tftp,bootp等等。
        “够了!”你也许会叫道。“如果数据报会丢失这些程序怎么会能运行呢?”哦,我的朋友啊,每个UDP的头都有自己的协议。比如,tftp协议每个数据包收到后都要送回一个数据报说:“我收到了!”(ACK数据包)如果原数据包的发送人没有收到回应,比如说,5秒之内,他会再次发送一个相同的数据包知道他得到一个ACK。这个通知的过程在实现SOCK_DGRAM应用程序的时候是很重要的。

2.2. Low level Nonsense and Network Theory        。

        才提到了协议的种类,现在是时候谈谈网络是怎么工作的,为了说清楚这个,我们举了一个建立SOCK_DGRAM例子。实际上,你可以跳过这个部分,但这个将是一个不错的背景知识。
表一 数据封装

        好,现在是时间学习数据封装了!这个很重要。如果你在这里学习网络课程这些知识是非常重要的。基本上,当一个数据包产生,数据包即由第一个协议(tftp)在头部(很少在尾部)被包装(“封装”),然后再下一个(UDP和IP),然后是最后一个硬件(物理)层附加的协议(Ethernet)。
        当另一台计算机收到这个数据包时,硬件去掉Ethernet数据头,核心层去掉IP和UDP,TFTP应用程序去掉TFTP的数据头,最后得到的就是数据。
        最后我来说说声名狼藉的Layered Network Model。这个网络模型描述网络功能比起其他的网络模型由许多的优点。比如,你不需要去知道物理层上如果传输数据就可以写一个嵌套字程序(串口,小以太网,AUI,或其他任何网络),因为程序已经帮你处理好了这些事情。实际的网络硬件和拓扑结构对嵌套字程序员是透明的。

      在进行其他的事情之前,我先把成熟的网络模型告诉你,记住这个经典的网络程序的例子:

  • 应用层

  • 表示层

  • 会话层

  • 传输层

  • 网络层

  • 数据链路层

  • 物理层
            物理层是硬件(串口,以太网,等等)。应用层里物理层的距离远到你所不能想象的——那是用户与网络交互的地方。
            现在,你可以非常普通的使用汽车修理指南一样的使用这个模型。分层的模型和UNIX更一致了

    • 应用层(telnet, ftp,等等.)

    • 主机到主机传输层(TCP, UDP)

    • 互联层(IP and routing)

    • 网络访问层(Ethernet, ATM, 或其他任何网络)

            在现在,你可以看到数据在这些层是怎么对应封装的?
            看到建立一个简单的数据包要做多少工作么?你也可以自己输入一个数据包头部“cat”!呵呵,只是开个玩笑。你使用流嵌套字所要做的就是send()发送数据。而对数据报嵌套字就是用你选择的方法封装数据包然后用sendto()发送他。Kernel会帮你建立传输层和互联层,硬件会完成网络访问层。呵呵,够现代的技术。
            最后我们理论上完成了整个网络。对了,我忘记告诉你我要说的关于路由的事情了:什么都没有!我根本不打算说那个。路由器拆分了数据包给IP数据头,通过路由表。。。如果你关心这个 看看IP RFC吧。如果你不去学习那些知识,那也没关系