为了更好地阐述这个抽象的话题,将会用不同的视野来分析同样的问题,记得有一个盲人摸象的故事,有的人说大象是大树,有的人说大象是蒲扇,这当然都很片面,但如果把这些观点都集中起来就大概可以勾勒出大象的框架。
1. 用户眼中的TCP/IP协议
选择网卡,点击鼠标右键,选择属性,在菜单里就会看到TCP/IP协议,表示已经安装在系统里,还可以看看IP地址、子网掩码、缺省网关、DNS服务器,这时用户可以打开浏览器上网,非常简单不是吗?
1.1 卸载软件TCP/IP协议
如果想对TCP/IP有感性认识,可以点击右键卸载它们,然后你会看到它们从网卡的软件属性里消失了,这时你再打开浏览器,已经无法上网了。知道TCP/IP的重要性了吧?那好,我们再把TCP/IP安装回来,于是我们又可以上网了,怎么那么神奇?
1.2 卸载硬件网卡
现在我们再来看看网卡的硬件属性,会看到网卡驱动程序一栏,选择卸载,然后你会发现网卡消失了,其它的所有属性也都消失了。应了一句成语:皮之不存 ,毛将焉附。打开浏览器上网,会直接提示你,网络不可用。然后我们再把驱动程序安装回来,网卡又出现了,所有的软、硬件属性都在,又可以上网冲浪了。
1.3 卸载软件浏览器
然后我们再去控制面板,选择添加/去除程序图标,可以卸载掉你的浏览器(假设是唯一的浏览器),这时我们连输入网址的地方都没有,如何上网浏览网页呢?那好,我们再将浏览器安装回来,又可以上网了。
用户小美萌哒哒看着我们操作,于是提出了新的问题,系统自带的IE浏览器不好用,能否卸载掉,再安装其它的浏览器?当然可以!用户可以自由选择浏览器来上网。
小美又有一个问题,那可以换一块网卡吗?当然也可以啦,拔掉旧的网卡,换上新的网卡,再安装网卡驱动程序就OK了,用户可以自由选择硬件网卡。
小美突发奇想,胖哥哥,那能否卸载掉TCP/IP,换一个其它类似的东东?胖哥哥开始循循善诱了起来:因为Internet上的服务器、用户客户端99.99%在使用TCP/IP,如果换其他协议,可能会无法通信,因为不同协议无法理解对方在说什么,就好比说不同语言的人无法沟通一样。如果沟通则需要翻译,这白白增添了复杂度。所以我们不能换TCP/IP。
换句话说,我们可以换网卡、换浏览器,却无法更换TCP/IP,TCP/IP是我们唯一的选择。
TCP/IP起到一个承上启下的中枢作用,向下可以工作在任何数据链路层协议,如 Ethernet / HDLC/ PPP/ ATM / Frame Relay;向上可以支持很多种应用层协议,如 HTTP / SMTP / FTP / POP3,以及用户自定义的协议;TCP/IP作为一个协议簇工作在操作系统内核,完成面向连接的可靠传输(Connection-Oriented TCP)或无连接的不保证可靠传输(Connectionless UDP),所以TCP/IP协议是计算机网络的核心引擎。
2. 操作系统眼中的TCP/IP
TCP/IP以独立的进程运行在操作系统的内核,比如TCP进程、IP进程,为了保证IP进程能够正常工作,需要完成IP地址、网络掩码、缺省网关、DNS服务器的初始化工作,这个由DHCP进程来完成,当然也可以用户手工配置以上参数。
DHCP进程会发广播报文,然后从网卡发送出去,如果二层广播域里有DHCP服务器,会分配以上IP参数给用户的DHCP进程,完成IP进程的初始化工作,至此,TCP/IP就可以正常使用。
当小美打开浏览器,就是打开一个用户进程(取名为http进程),然后输入网址 http://www.zhihu.com,会触发一系列动作:
2.1 首先要将网址翻译为IP地址,需要调用DNS进程,DNS进程会发一个请求到DNS服务器,然后得到IP地址A。
2.2 http进程将自己的网页请求组织好,加上http 协议头,类似 http + data ,调用TCP进程,告诉TCP进程要把数据http + data发给A。
2.3 TCP进程会触发与A的三次握手连接,这三次握手是纯TCP报文,不带任何http 数据,三次握手都需要调用IP进程,入口参数为A。
2.4 IP进程以A为输入参数,查询路由表,发现需要发给缺省网关处理,需要知道缺省网关的MAC地址,调用ARP进程请求网关的MAC,入口参数是网关IP。
2.5 ARP进程发广播ARP请求,得到网关MAC,返回给IP进程。
2.6 IP进程调用网卡驱动程序进程,入口参数为网关的MAC,数据为 IP头+ TCP头。
2.7 网卡发送出去,并最终到达服务器,并最终完成了三次握手。
2.8 TCP进程将 TCP头+ http头 + data 调用IP进程,步骤类似2.4 -2.7,不再叙述。
2.9 假定http 进程最后从服务器得到网页返回,将网页显示在浏览器上。
3. OSI眼中的TCP/IP
OSI分七层:
七层:应用层
六层:表示层
五层:会话层
四层:传输层
三层:网络层
二层:链路层
一层:物理层
浏览器对应第七、第六、第五层
TCP/IP对应第四、第三层
TCP层对应第四层,即传输层
IP层对应第三层,即网络层
网卡(驱动程序)对应第二层(链路层)、第一层(物理层)
所以 浏览器 + TCP/IP + 网卡(驱动程序)完美对应OSI参考模型七层。
为何要OSI分层?
那是为了让不同的操作系统、不同的厂商的终端设备能够通信,大家遵循一样的协议标准,好比说同一种语言的人可以自由自在地沟通。
分层还可以让不同的底层网卡可以独立实现自己的功能,对下(物理层)实现相同的编码方式,对上(网络层)提供标准的接口,至于内部如何实现,别人并不care。
对于IP层也是,内部独立完成自己的功能,对上提供标准的接口,对下调用标准的接口,这样开发起来非常便利。