作为程序猿/媛的你,是否还记得第一次敲出的“Hello World”,还记得是什么语言么,现在的你是否已经精通了各种语言的“Hello World”?这是一个程序员,向计算机世界打招呼的方式,编程语言就是是人类与计算机沟通的协议,只有通过这种协议,你才能让计算机知道,你希望它做什么。
协议的三大要素。编程语言更加接近人类的语言,机器便不能直接读懂,需要进行翻译,翻译的工作通常交个一个叫编译器的家伙去完成,就像不同 国家的人交流,一般需要一个精通两国语言的翻译官一样。其翻译的过程比较复杂,特别是编译原理,就像你最开始学习英语的时候,是不是感觉头也大了, 但我们讲的是网络协议,就不去深究编译原理。
那么,我们常用的互联网协议有哪些呢?我们先从一个简单的网页请求大概的说一下整个过程,后面将逐步细化,完善整个知识体系。 当你在浏览器中输入 “https://www.taobao.com” ,这是一个URL。浏览器只知道名字是 “www.taobao.com” ,并不知道如何去访问,于是,它打开地址簿去查找,可以使用一般的地址簿DNS协议,也可以使用更加精确的地址簿查找协议HTTPDNS。无论使用什么方式查找,都会得到一个IP地址:119.75.217.109,IP地址,也是互联网世界的“门牌号”。
知道了IP,浏览器开始打包请求,普通请求一般使用HTTP协议,对于金融,购物等往往需要加密传输,则会使用HTTPS。无论什么协议,你都会写明你的需求,例如:“你要买什么,买多少” 。DNS,HTTPDNS,HTTP,HTTPS所在的层我们称为应用层。经过应用层包装后,浏览器会将打好的包发给传输层。传输层有两种协议:无连接的UDP,面向连接的TCP,所谓的面向连接就是TCP会保证这个包能到达目的地,如果不能到达就会重发,直到到达,UDP就是群发,不关心结果。TCP协议会在TCP头中加入浏览器监听的端口和电商服务器监听的端口,操作系统往往是通过端口来判断,这个包需要发给哪个进程。
传输层封装完毕后,浏览器将包交给网络层,网络层协议就是IP协议,IP协议会在IP头加上目标IP地址,和浏览器所在机器的IP地址,操作系统知道目标IP地址后,就开始想如何通过IP目标地址找到目标机器没,操作系统会判断这个目标地址是“本地人”,还是“外地人”。如果是本地人,那么从IP地址就可以看出,显然,电商网站远在天涯。操作系统知道要去远方,但并不知道如何走,只能走一步问一步,第一步就是网关,操作系统启动时,就被DHCP协议分配了IP地址,默认的网关地址就是“192.168.1.1”.操作系统如何将IP发给网关?本地通信基本靠吼,谁是192。168.1.1?网关会回答且报告MAC地址,大吼一声就是ARP协议。这一层是MAC层,会加上操作系统所在机器的MAC,也会加上网关的MAC,然后将包发给网关。
网关收到包以后,会根据自己的经验判断下一步怎么走。网关往往是一个路由器,到某个IP怎么走,一般网关会有自己的一张地图,也就是路由表。路由器连着两个局域网,在每个局域网内部都可以使用MAC地址通信,从一个网关到下一个网关。每一次跨过网关,就是拿出IP去询问如何到达目的地,这些局域网的网关往往是知道如何走的,这种沟通协议称为路由协议,常有的OSPF和BGP协议。通过一顿折腾,到达某个局域网时,谁是目标IP啊,这时会电商网站一看这是找自己啊,“大爷,您来了,我在这,我的MAC地址是XXXXX”,网关取下IP头,一看,确实是你,那包裹就给你了,操作系统收到包后,拿出TCP头,进入传输层。每过一层都会给客户回复一个“我到了”,因为客户还不知道包是否到达,会根据一定时间内是否收到“我到了”,组织重发。当包到达TCP传输层后,会有目标端口,通过这个端口,操作系统可以找到电商网站的进程。
假设有一个Tomcat服务器。电商网站就会得到这个HTTP请求的内容,就可以知道客户的需求,那么Tomcat如何告诉相关的实际进程呢?往往是通过RPC调用,远程过程调用。现在的RPC框架比较多,后面也会详述。找到对应的处理进程后,进程将结果(还有没有,需要多少钱等信息包装为一个HTTP包),发给客户,与来的时候一样,历经千辛万苦,到达个人电脑,最终进去浏览器,显示支付结果等精美的网页。
一个简简单单的请求过程,中间会牵连大量的协议,那么管理集群时,又是怎么样的场景。后面讲继续深入的学习。