关于Internet的基础

一直想找时间好好理清楚Internet的基础,例如协议栈、例如http、例如tcp等等,但一直没整理。

原因一个是这确实是自己的短板,知道的不少,但一直没有从上到下的整理过。

再就是互联网协议从底到上,点太多,经常抓瞎,不知从何谈起。

[BTW,本文尝试不用Q&A的方式来展开试试看~]


现在正好离职了,终于空了足够时间来整理一下~

google+wiki的时候,找到了此文(),写的很浅显易懂。推荐~

加上wiki

上面引用的那位哥说了这么句话:

前面说过,以太网数据包只包含MAC地址,并没有IP地址的栏位。那么是否需要修改数据定义,再添加一个栏位呢?

回答是不需要,我们可以把IP数据包直接放进以太网数据包的"数据"部分,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。

这句话说得很好,其实不管七层OSI,还是成为实际标准的四层tcp/ip协议栈,关键的就是这样一个层级间的再封装以保持的层级无关(独立)性

这种无关性,才能保证整个行业,各自轻松愉快的向前发展,而不用过分关心协议外的耦合性。(有种回答“学计算机都会修电脑”这种问题的即视感。。。)

下图(拼图)描述了从主机A到主机B的网络拓扑,可以清晰看到层与层之间的关系,同层级之间的联系,不同层级的数据格式、协议等:

层级之间,以一种简单方式封装实现的层级无关的数据包结构,wiki的原话相当到位:沿着不同的层应用数据的封装递减 (当然,过分简单也就意味着无法兼顾安全。)


想象下你是如何从主机A访问到这里的(类似的例子其实在有提到)[这里会做很多简化]


再回去看那个网络拓扑(如Application层:浏览器 -> node.js),就更加清晰明了了。


上面这个例子也简单描述了request/response模型


顺便提一下,http协议是无状态协议,服务器甚至都不知道两次http请求是不是相互有关联,这其实并不适合大部分的业务逻辑,这时候就需要一种方式来“记录(保持)”状态 – Cookies和Session。 

客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。


正是基于这一整套简单又很聪明的设计,构成了整个internet的基础。

简单又干活。(码农毕生追求了吧~)


wiki里同时看到这么一段有趣的历史(这才让我想起来确实曾有一些高昂的专用网络):

在长期的发展过程中,IP逐渐取代其他网络。这里是一个简单的解释。IP传输通用数据。数据能够用于任何目的,并且能够很轻易地取代以前由专有数据网络传输的数据。下面是一个普通的过程:

新工作、新生活即将开始,就拿IP取代专属网络这种屌丝气死高富帅的故事来励志吧~