TCP/IP 网络基础(一)数据链路层

前言

没错,想弄懂TCP/IP,把Steven Richard那几本《TCP/IP详解》、《Unix网络编程》看完就好了。只是一来,作为web开发人员,只是想弄清楚网络层面的基础原理,并不会有多少机会进行Socket编程;二来,越来越多的工作和学习经验告诉我,看书未必是最有效的学习方式。面向问题学习,找到合适的教程、文章,往往就够用了。

因此,我在学习TCP/IP的过程中搜索了一些更简练的书。《图解TCP/IP》这本书就是极好的。另外还有一本《TCP/IP高效编程》,篇幅精炼,偏向Socket编程。我将再结合一些网上资料理解书中没有讲解的概念,边学边写这个系列。

此外,阮一峰老师的两篇入门文章也是个非常好的引子。顺序清晰,不纠结细节,值得一看。
互联网协议入门(一)
互联网协议入门(二)

如下图,这是TCP/IP的一个精简的分层。往下,你最多会想知道IP数据是怎么到达物理机器的,而不会有兴趣了解物理导线内发生了什么;往上则是HTTP等一堆应用层协议的事情。因此本系列将会大概分为三篇,讲解大家最关心的问题:数据链路如何工作、IP的寻址和路由,以及TCP协议。
《TCP/IP 网络基础(一)数据链路层》

别把OSI参考模型太当回事。它是个失败的协议规范,因此顶多拿来“参考”下。那些层次也并不是它首先提出的。因此最合适的做法也许是忘掉它。

以太网

以太网(Ethernet)是普遍应用的局域网技术规范,可以认为和IEEE802.3是一回事。在各种教科书中,会有提到令牌环网、串行链路等其他局域网技术,但是放心,那些早就被以太网淘汰了。

以太网规定,所有连入网络的设备,都必须具有“网卡”接口。然后数据包是从一块网卡,传输到另一块网卡的。网卡的地址,就是数据包的发送地址和接收地址,叫做MAC地址,也叫物理地址,这是最底层的地址。每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。有了这个地址,我们可以定位网卡和数据包的路径了。

以太网的工作原理

在以太网中,通过广播方式通信。发送方将数据包(包含目的MAC地址)向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
最简单的以太网结构如下图,所有的电脑都连在一根网线(同轴电缆)上:
《TCP/IP 网络基础(一)数据链路层》

1号计算机想向2号机算机发送一个数据包,它只能往网线上发,所以同一个子网络的所有计算机都会收到这个包。它们读取这个包的首部,找到接受方的MAC地址,同自身的MAC地址相比较,如果两者相同,就接收这个包,作进一步处理,否则就丢弃。

冲突、集线器和交换机

很显然所有主机都连到一起,大家又发又收就会产生冲突,然后数据就乱套了,无法使用。连到一起的一群主机就叫冲突域。
集线器就是啥都不干,把插到它身上的主机都连起来。
交换机则聪明一些,它记住哪些MAC地址应该被发到哪个端口,连到别的端口的主机就不会收到这些信号,从而可以隔绝冲突。(把冲突划小。)

通过集线器和交换机连接起来的主机还是在同一个局域网内,因为它们可以用MAC地址通信。

共享介质和非共享介质

前面讲的结构就是共享介质数据链路,即所有主机都连到一根线上。实际上这种方式早就过时了。回想一下我们在家里、学校或办公室的网络连接,都是把主机通过双绞线插到交换机上的独立端口上(通过WiFi连接时可以想象成与这种情况等价)。由交换机决定一个请求包发送给哪个端口,而不会向所有端口发送。这样就避免了冲突,因此一些资料上讲的冲突检测和避免的算法我们基本上不用去考虑了。

另外还有个概念是全双工半双工。半双工是指同一时刻只能发送或者接收,前面提到的同轴电缆这种共享介质结构就有这种特点。而使用双绞线这种非共享介质的结构,就能实现全双工——同时接收和发送。

至于同轴线缆和双绞线,前者就是以前的有线电视那种线,后者就是网线(使用传说中的RJ-45接口)。

分组交换与数据帧

分组交换是个重要的发明。在它之前,只有一种“电路交换”。即电话局有个接线员,你打电话过去说请给我转接老王,然后接线员说请稍等,就把你的电话线和老王的电话线接到一起,创建一个真正的物理线路。
电路交换自然是相当的落后,我们只看过民国电影中的高官和地下党使用。它最大的问题在于不能共享线路。假如你从北京打到上海,那北京到上海的这条电话线就变成了你的专线,别人不能同时通话。

分组交换则像寄信和寄快递——把信息写上收件人地址交给邮局或快递公司,如果东西很多就分成多件快递。往细一点说,路由器等设施就相当于快递的中转站。这种方式就可以共享物理线路。

物理线路只认识 0/1。数据链路层则加入了第一层封装:对上层数据包进行拆分和打包,在所发送的数据包上附加上目标地址,本地地址,以及一些用于纠错的字节等。对来自物理层的一个个比特流组装成数据帧。
帧的结构包括首部和数据,首部包含发送者、接收者等数据。我们见过的几乎所有通信协议都是这么设计的~
贴上下图,以供一窥:
《TCP/IP 网络基础(一)数据链路层》

数据链路层的限制

理论上说,全世界的网络可以只在数据链路层上工作,不需要更高层的协议——因为我们只要知道对方的MAC地址,就可以直接通信了。而实际上,MAC地址虽然全球唯一,但并没有什么规律,想在全世界的电脑中找到一个特定的MAC地址,想想就知道太难了,就是大海捞针。
实际上,因特网是由无数个“网络”组成的。网络的出口通过网关(路由器)互相连接。而MAC地址不可以跨越网关。在同一个网络内部,知道对方的MAC地址就可以畅行无阻地通信,但在网络间就要使用IP协议通信了。
《TCP/IP 网络基础(一)数据链路层》
至于互联网为啥是这样的,可以说既有历史原因,也是科学合理的——在因特网出现之前,就只有各个组织独立搭建的网络。甚至网络内使用了各不相同的技术。通过网关将它们连起来,在更高一层协议上通信,就可以打通各个网络。

最后,关于一些细节,可以参考这个系列:wenqian’s blog之网络.

    原文作者:TCP
    原文地址: https://segmentfault.com/a/1190000011335623
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞