前言:之前欧巴要我编一个即时聊天工具,是利用socket实现一个即时聊天工具。虽然程序最后不了了之,但是妹纸还是做了一些工作的。我查阅了很多关于网络套接字的资料,发现Thomas Bleeker的博客中关于关于network socket的详细介绍。由于翻译水平有限,仅供习惯看中文的大伙参考。
原文链接:http://www.madwizard.org/programming/tutorials/netcpp/1
翻译:
网络原理与简介
首先,我介绍一下基本的网络原理与术语。上过网的人度应该对网络,服务器,客户端有一定的概念。但是为了你能够了解的足够深,并利用它来编程,我加入了这一章。在编WINSOCK程序的时候,并不需要这里提到的所有细节,但是了解一下相关基础的技术也不错。
1. networks and protocols
你可能已经知道网络是什么,它就是由一些计算机相互连接,并能相互交换数据。网络有好几种,例如局域网(LANs),广域网(WANs),当然还有互联网(Internet)。为确定所有的交换信息顺利进行。网络需要依靠协议:
如信息窗口所述,协议描述了怎样通过网络通信。它就像人类语言一样,最底层就像每个人度能说和听(比喻模拟信号)。除非他们说同一种语言(协议),否则相互很难理解对方。
2. Ethernet
网络依赖于几种协议层,在通信过程中每一层都有它自己的任务。常用的结构是以太网的TCP/IP协议。在以太网中,电脑可以用同轴双绞线或者光纤电缆连接起来。现在,大多数的网络都是利用双绞线。广域网和互联网(很多广域网联合的部分)使用以太网中的技术。因此我先讨论以太网。
MAC//----------------------------------------------------------------------
以太网的最底层是硬件层,叫媒介接入层或者MAC层。比如,这一层可以是一个网卡,数据包含串行网络接口和控制原始数据转变成模拟信号,并发送到正确地方的控制器。当然,通过网络发送的数据包需要到达它们的目的地。因此,需要一些种类的地址。后面你会看到,以太网不同层需要不同方式的地址。在最底层MAC层,地址是由一串MAC号构成的。
MAC地址是焊死在芯片中的硬件地址,每个芯片的MAC地址都是全世界独一无二的。有48比特,一般写成14:74:A0:17:95:D716进制形式。
发送一个数据包到其他的网络接口,数据包需要数据包括MAC地址。局域网内使用一个简单的方式来发送数据包到正确的接口:广播式。你的网卡只需要把数据包发送到它所有能到达的地址。每一个接受接口都会看一下数据包的目的端MAC地址。如果接收端的MAC地址与目的端MAC地址吻合,则接受该数据包。这个方法在局域网很有效,但是在更大的网络中如WANS,internet等很明显就不能使用这个方法了。会增大网络负载,你也不希望每个人通过internet发送数据包到internet上的每一个角落。WANs有很好的路由机制,这里不再讨论。只要记住,在对底层,处理的是MAC地址。以太数据包数据包括循环冗余校验和错误检测。
IP-----------------------------------------------------------------------
硬件层的上一层上IP层。IP简单的说是代表Inernet协议。像MAC层一样,IP层也有它自己的地址。
通常使用的是IPV4版本的IP地址,由32比特组成。它的格式众所周知,10.0.0.1。与MAC地址不同的是,IP地址是通过软件分配的。
IP地址大家都很熟悉,INERNET通过IP地址唯一识别以太特殊的电脑。IP地址可以通过软件分配到一个网络接口,这样就把IP地址与MAC地址联系起来了。用IP号赋地址,相应的MAC地址需要被保存。这部分由地址解析协议(ARP)来完成。每一个主机保有一份IP地址与MAC地址配对的清单。如果一个IP号没有匹配的MAC地址,主机会向局域网内发送一个询问数据包。如果LAN中的某计算机识别出了这是它自己的IP号,就会给这台主机回送相应的MAC地址。如果这个询问IP没有配对的MAC地址,这个询问数据包就会送到网关(gateway),网关是把数据包传递到外网的计算机。由IP地址转换成MAC地址实际上是在数据链路层即(MAC层)完成的。
IP协议将源IP地址和目的IP地址加在数据包里,还有其他的数据包性能如TTL hops(数据包存活时间)、所用协议版本、报头校验、序列数还有其他的一些字段。由于它们对我们网络编程不是很重要,所以不详细讲述了。
TCP---------------------------------------------------------------------
下一层是TCP层(或者UDP层)。这一层离网络应用很近,它需要处理很多任务。TCP最终在数据包中加入端口号。
很多端口号是众所周知的。他们通常与特定的服务相关。例如,WWW使用的端口默认为80,FTP使用的端口号是21,e-mail使用端口号为25(SMTP)和110(POP)。尽管这些端口通常用于这些服务。但是你可以随意使用其他的端口号。但是最好使用大于1024的端口号。
IP层不关心数据传输是否正确,但是TCP层需要。TCP层确保数据正确的到来。它能让接受端控制数据流等。接收端可以决定什么时候接收数据。如果一个数据包在传输过程中丢失了,TCP从新发送这个数据包。TCP也可以重新整理数据包的顺序,使他们和原始数据顺序一样。UDP可以替代TCP,它不需要这些特性,而且不能保证数据包的正确到达。TCP是面向连接的,连续数据流最好使用TCP协议。另一方面,UDP是无连接的面向数据数据包的。我们在这教程中不使用UDP协议。
Software-----------------------------------------------------------------------
最后,在TCP层上面的是网络软件。在windows,你的应用不能直接访问TCP层,但是可以使用WINSOCK API。软件层提供非常便利的方式来处理网络。由于所有的基础层,你不需要担心数据包,数据包的大小,数据损坏,重传丢失的数据包等。
3. The Ethernet interface stack
上图显示在以太接口栈中每一层协议的封装。它从软件层开始,在软件层只是一些需要通过网络发送的数据。虽然图中没有显示,但是通常这些数据有一定的格式(如HTTP,FTP协议等)。用户数据首先在TCP层加上了TCP表头包括发送端端口号和目的端端口号。然后在IP层,再加上包含发送端IP地址和目的端的IP地址的IP表头。最后,在数据链路层,加上以太表头,指定了发送端MAC地址和目的端的MAC地址。这样就完成了再网络中传送的数据包了。你可以看到,在TCP/IP数据包中有很多的表头。通过选择足够大的数据包可以使表头最小化。而WINSOCK已经帮你安排好这个了。