第一章 - 互连网入门
首先,我们将首先学习一下基础的互连网规则。上网的朋友都会或多或少的了解一些诸如:网络(networks),服务端(servers),客户端(clients)之类的名词,不知道也没关系,反正下面也会说到。你在初学winsock编程时,可以不必了解很高深的理论知识,但这并不意味着你以后在高层次的网络编程中也用不到它们。.
1. 网络和协议
你或许有自己对于互连网的定义。不过,基本上都是认为互连网就是将一大堆互不相识的计算机可以相互联系,相互交换数据(有点象婚介中心……)。我们常常碰到的一些类型的网络,如:LANs (Local Area Network 局域网), WANs (Wide Area Network 广域网),当然还有 internet 。确保这些网络可以安安稳稳的活下去的条件就是今天的主角(以后他还是主角)-----协议。
|
上面的定义还真生涩,简而言之,协议就是描述网络间的沟通。可以想象它为:把中文中一个一个方块字(相当于电子信号 electronic signals),依照习惯、语法规则等等,组织成一句一句有意义的的句子。(相当于协议)
2. 以太网 Ethernet
网络基于几个协议层(protocol layers),每一层在网络通讯过程中都有各自的任务。在协议模型中最著名的是OSI(开放互联网)模型,但实际在以太网中用的是 TCP/IP(Transmission Control Protocol/Internet Protocol ) 。在以太网中,计算机之间使用铜轴双绞线(UTP)或是光纤相连。我们常常可以看见网线是铜轴双绞线,光缆也开始慢慢普及(有些广告中会说:小区光缆百兆到楼)这些硬件都是用于网络的架设,首先我们先要了解一下以太网。
MAC
以太网的最底层为硬件级,称做介质访问层(?介质访问控制,直接说数据链路层多好),或简称 MAC 。这一层基本都是硬件设备,包括一些网络接口和将原始数据转换为电信号并将其发送到适当目的地的控制器。
这些封包最终会如其所愿的到达它们的目的地,目的地靠什么表示?门牌号码?恩,差不多,在以太网内不同的层地址表示也不尽相同。我们熟悉的IP地址可不在这层上(到底哪层以后的几章会说明。)在最低层的MAC等级中,地址由MAC地址表示。这也就是我们常常听到的网卡MAC地址。
|
发送一个封包到另个网络接口,封包内需要有目的MAC 地址,在局域网中用的是一种很简单的方法——广播(broadcasting ) 。就是将封包发送到每一个可到达的网络接口,那些硬件获得封包后取出其中的MAC地址与自己的MAC地址开始比对,是则接收,无则扔去。这种方法很好,既易于实现,又高效。可是在大型的网络中这种方法的缺点暴露无疑:你肯定不希望你的东西到处派送!在广域网中使用了路由器(这个也以后讨论)。现在大家只要知道在最底层,MAC地址为基本地址。当然封包都需CRC和错误检测。
网络层 IP(ICMP)
硬件等级上面一层是IP(Internet Protocol 网际协议)层。就是网际网路层,和上层相同,这一层也有自己的IP定义方式。
|
IP 地址对大家应该不陌生。只要在CMD窗口里敲击 ipconfig 你便可以得知自己的IP地址(当然你的计算机要在网络上)。internet用其可以精确识别每台网络上的计算机。可以这么说。只要一个网络设备使用软件,那么它就会有个IP地址。既然IP是个软件层的地址,那它总要变回为MAC地址,这就是ARP(Address Resolution Protocol)协议,很熟悉吧?ARP欺骗……这里先不说这么无聊的东西,呵呵。当IP没有匹配的MAC地址时,主机会向网络发送询问包,网络内一位计算机,发现自己认识这个IP地址,自然要告诉那个查询者此IP的MAC地址。可是网络上谁都不认帐,只好将其发到网关,这样可以到更广阔的网络空间去寻找自己想知道MAC地址。IP与MAC地址相互转换的过程发生在数据链路层(MAC层)。
IP协议在封包里加入目的和源地址。高级版本中有TTL跳跃(我们在ping另台计算机时,后面会有TTL值,我们可以根据这个值来粗略判断对方是什么操作系统,比如64>值<128便估计对方是WINNT X.X,和中间跳过了多少网络设备) ,头效验,队列计数或其它什么功能。这些我们现在不讨论了……
TCP
下一层为传输层(TCP或UDP层)这一层是我们工作的重点,因为它紧密联系了各个网络软件会话。这一层将端口号加入到封包里。
|
很多端口是WKP (Well Known Ports 知名端口),也就是约定俗成的默认端口,比如上面说的80端口,FTP是端口21,Email 为 (25 SMTP)和 (110 POP)还有在WINDOWS 下熟悉的135,139,3389……。你自然可以使用别的端口,不过还是建议在WINDOWS下使用1024以上的端口。
网络(IP)层并不在意传输是否成功,可传输层在意,传输层为了保证数据可以准确,对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接,这时没传数据。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。由于TCP需要时刻跟踪,这需要额外开销,使得TCP的格式有些显得复杂。UDP可不关心封包是否会丢失,它只关心时效性,对于象音频通讯,几个字听不见是没关系的……相比之下,TCP的作用要大一些,好象除了QQ没人喜欢UDP。
应用层(软件层 Software)
最后,在传输层上面的是应用层(software),你作为初学者,你写的软件不可能直接访问TCP层,必须通过WinSock API ,在应用层面上,系统提供了十分方便的操作接口,由于这些API的存在,我们无须关心封包,封包大小,数据遗失,和重新发送丢封包等等。
3. 示意图
上面的示意图,清楚的展示了以太网内各层次间的联系。所有的数据都是由应用层开始,层层封装最后发送到网络。无论数据是什么格式(HTTP,FTP……)都会遵从此表。用户的数据首先会加个TCP头(包含了源和目的端口),然后加上IP头(加入源和目的IP地址),最后在数据链路层加入以太网头(包含源和目的MAC地址),好了我们的数据终于可以出发了……,自然我们希望将这些头最小化,令人高兴的是 winsock 帮你做了一切……
4. 一些资料