看了日报,然后强迫症就上来了。第一次答题。这些东西都是很久以前学的了,而且不是我的主专业,欢迎指正和补充。 解答问题之前,先介绍一下OSI model - Wikipedia [1]。打不开链接没关系,下面会有解释。OSI Model定义了网络的七层结构。每一层分工不同,七层加在一起保证了数据传输的准确。每一层都有包装来保证那一层的协议的运行。另外,除了包装以外,每一层还有发现、协商、维护的数据流来保障那一层的协议的运行。 七层定义如下: - Physical Layer
- Data Link Layer
- Network Layer
- Transport Layer
- Session Layer
- Presentation Layer
- Application Layer
Physical Layer 这一层是专门传0和1的。定义是:Transmission and reception of raw bit streams over a physical medium [1]。介质有电话线、网线、电线、空气等。这一层提供一些抗干扰能力,努力保证0不被改成1、1不被改成0。这一层的错误率还挺高的。 “电磁波电流传递而不会行程干扰”的能力是这一层提供的。在铜线电流里,很简单,一条铜线传一条电流,靠物理和电磁屏障来避免不同导线内的电流互相干扰,提高铜线截面积和纯度来降低传导过程当中产生的噪声,电流整形滤波来消除噪声。在无线电里,有不同机制。有的用分时机制,约好不同节点在不同时间说话。有的用分频机制,不同节点用不同无线电波频率说话。还有更高明的靠编码,同时同频跟不同节点一起说话。像WiFi这种拥挤、没有条款制约的就靠吼。。。反正每个包都有标签,谁嗓门大,谁耳朵尖,谁传的数据快。 至于“自由。。。传输到指定的主机”的能力,请继续往下看。 Data Link Layer 这一层是传“Frame”的,把0和1组织起来,加入针对线路传输中的错误的校验。定义是:Reliable transmission of data frames between two nodes connected by a physical layer [1]。这一层的介质有Ethernet、WiFi等。如果信号不好导致数据传输错误,比如说传的0变成1了,或者1变成0了,这一层能查出来,然后把包丢掉。这一层一旦发现错误就丢包。这一层的寻址用MAC,用来“包装”这一层的数据。 Network Layer 这一层提供了知道数据是谁传给谁的能力,可以利用中转来实现远距离传输了。大名鼎鼎的IP协议就是这一层的。定义是:Structuring and managing a multi-node network, including addressing, routing and traffic control [1]。每个包都表了目的地的IP地址,用来“包装”这一层的数据。 讲到这一层就讲讲routing。Routing是网络里每台设备维护自己的routing table来实现的。Routing table定义了去哪里的数据发给谁。Routing table基本长这样:(注:不是真的长这样,只解释一下原理。并不想解释所有参数以及如何利用整个表推演得到最优的下一站以及如何防止数据“迷路”) 目的地->网关 10.0.0.1-10.0.0.255->10.0.0.1 10.0.1.1-10.0.1.100->10.0.1.1 意思是,如果我要发数据给10.0.0.1到10.0.0.255之间的地址,把数据发给10.0.0.1就行了。然后把数据重新打包发给10.0.0.1的MAC地址。数据的IP地址是不变的,把目的地的MAC换成了10.0.0.1的MAC。(注:还请较真儿的同学们别跟我提NAT,本题不需要解释。)当10.0.0.1收到这个包裹的时候,同样会看自己的routing table。这样一站一站直到发到目的地为止。至于全世界所有的routing table是怎么建立起来的,怎么维护的,就不在这个问题里细说了。
写半天才写了三层。。。其实讲到这里已经基本解答了这个问题。有人提到握手什么的,再多写一层。 Transport Layer 这一层开始进入软件层。这一层开始负责数据的完整性、维护顺序之类的了。这一层还加入了端口的概念,用来标明哪个包是给哪个程序的。TCP和UDP协议是这一层的。定义是:Reliable transmission of data segments between points on a network, including segmentation, acknowledgement and multiplexing。IP协议只负责谁的数据送给谁。这一层加入了握手,保证对方真实存在。这一层还提供了把大量数据分成下面三层所支持的小包从而实现连续的数据传输功能。另外,TCP协议还加入了数据包排序和掉包重发的功能。在routing的过程中,一些包能早到,一些包能晚到,一些包能被丢失。TCP在接受端能重新排序。接受端还需要向发送端确认收到。但是代价是降低了数据的吞吐,增高了延迟。而UDP就完全不管这些,收完了事。大多数应用都需要数据的准确性,所以大多数应用都使用TCP。而少数应用场景则使用UDP。比如说早期腾讯在网络条件还很差的时候,用UDP来传视频数据。效果差很多,但最起码在网卡的时候还能看个影儿。占领了很大的市场。心机啊。
至于“准确”的部分,在每一层都有机制来保障。最常见的就是靠校验码来“包装”那一层的数据。一旦发现错误就丢包,然后进行补救。软件层会超时重试,TCP会通知重发,再底层就不补救了但是会降频来增加信噪比、降低错误率。校验码的原理是用一个协议制定的算法来对数据部分进行计算,得到一个很短的固定长度的校验码。算法的特点是,一旦有一个0或1被传输错误,计算出来的校验码一定会不同。而一个以上的0或1被传输错误的时候,计算出来的校验码会有很高的几率会不同。其实理论上还是不能完全的避免传输错误的。
到这里,已经有了自由、准确、稳定和连续的数据流了。再往上走就是纯软件了。跟本题无关了。 最后,中心思想就是,网络分了很多层,每一层的分工不同,每一层都有额外的数据来给每个包打标签。最后把包发到目的地。 写完了,吃饭去了~ |