[TOC] # TCP/IP协议族的基本知识 >想要学习`HTTP协议`知识么?怎么讨论`TCP/IP协议族`了? 别急着学习`HTTP协议`,如果你没有`计算机网络`的基本知识功底,还是乖乖的继续往下学习,否则`举步维艰`描述的就是将来的你。 >一名游走于**江湖**的虫师,怎么能对`计算机网络`毫无所知?匪夷所思!匪夷所思!啊! ## 理解协议分层原因 理解计算机网络的第一个知识点是 **网络通信模型分层的产生原因** ,我们要从两个故事开始: ### 故事一:单层结构通信 `玛利亚`和`安`两个人是邻居并且都有同样的兴趣爱好,两人语言不通,`玛利亚`只会说`西班牙语`而`安`只会说`英语`,但是都学习过手语,因此两人可以通过手语面对面的交流想法和观点。 ![](https://img.kancloud.cn/e4/70/e4709dd8bf75b8e1b23ccef40e11d08b_854x110.png) ### 故事二:多层结构通信 由于工作原因,`安`搬离了另外的城市居住,两人分开前很伤心,但是`安`送给`玛利亚`一个翻译机,可以将`西班牙语`的文字翻译成`密码`,也可以将`密码`翻译成`西班牙语`文字, 而`安`自己也有一个翻译机,可以将`英语`文字翻译成`密码`,也可以将`密码`翻译成`英文`文字,两人通过`邮局`将文字转换成的密码内容传递给对方,再通过`翻译机`来解密获得自己认识的文字内容, 这样两人又可以互相通信了。 ![](https://img.kancloud.cn/ea/4e/ea4edcb8ed95e47b95207d212f3781b6_940x367.png) ### 网络协议分层 > 计算机网络的通信就如同`玛利亚`与`安`之间的通信一样,需要跨越很多物理硬件的差异才能与另外一台主机通信。 一种新技术的诞生,通常需要提前制定好实现的标准规范,这样才能保证不同的人实现的结果就有一致性,比如通信模型,这种一致性的好处就是虽然实现方式不同,但是结果是二者可以互相正确通信。 试想一下,我们生活中的电源插座、`USB`插座或者手机充电接口都是同样的道理。 再比如`苹果`手机的充电接口和`Android`的充电接口的不一致,其实是有意为之,带来的结果**不兼容!不兼容!不兼容!** , 生活中遇见不兼容的问题是多磨让人头疼的事情!看看下面这些USB接口吧。 ![USB_types_2.jpg](https://img.kancloud.cn/64/08/64081be9099a447910acb390f73d1f01_1497x696.jpg =540x) 为了解决**不兼容**等一切网络通信问题,达到让所有计算机可以在网络中相互通信, 一个叫做`OSI`模型的网络通信模型诞生了,这个模型是由国际标准化组织(ISO)召集了大约全世界四分之三的国家代表参与下共同制定的(1984年发布了著名的ISO/IEC 7498标准)。 当时的网络通信参考模型并不是只有一种,在`OSI`参考模型之前已经有了`TCP/IP`参考模型(也被称为互联网协议套件或TCP/IP协议族)。 根据维基百科资料,1983年1月1日,互联网前身ARPA网中的通信方式换成了`TCPIP模型`,并且在现在的互联网中经受住了竞争的考研也就是说`TCPIP模型`在`OSI`参考模型指定前就已经被实现并应用了,而且通信模型相对更加容易实现。 最终历史并没有给`OSI`模型表现的机会,`OSI`参考模型只是作为学习研究的参考模型。 ## TCP/IP协议族 翻一翻《计算机网络》书中的这张图,大家可以参考了解下。 `OSI`模型: 七层协议栈 `TCPIP`模型: 四层协议栈 `教科书`模型: 五层协议栈,这是结合了二者模型的学习参考模型。《TCPIP协议栈》教材也是按照五层讲解每层协议的。 ![TCP/IP协议栈](https://img.kancloud.cn/57/04/5704a3237ae7756d83eb5bc226b4f21c_1099x555.png) ### `TCP/IP协议栈`的体系结构(以五层为例) > 七层OSI结构为理论学习使用,四层结构为现在计算机实际应用结构,而五层体系结构为教科使用 - `物理层`:直接对接网络物理硬件(例如:网线、光纤等),保证数字信号与电信号在物理硬件上的正确传输,例如低成本的集线器就是工作在物理层,发送数据时都是没有针对性的,而是采用广播方式发送给连接在集线器上的所有主机。 - `数据链路层`:负责`相邻节点`之间的点对点帧(frame)数据传输,通信的地址为物理网卡的MAC地址,例如家用的交换机就是在这一层工作,它可以根据目标MAC地址有针对的发送到特定端口,而不必广播给所有接入主机。 - `网络层`:负责为分组交换网络上的不同主机提供通信服务,使用的IP协议将`IP数据报`传输到目标主机上,IP地址的目的是识别主机的网络位置。例如路由器也是工作在这一层的。 - `传输层`: 知道主机位置了,那是什么应用服务之间在通信呢,传输层就是为两个主机之间进程通信提供服务的。服务的标识为端口号,协议主要包含`TCP`、`UDP`协议。例如网络硬件负载均衡设备是工作在这一层完成服务的负载均衡的。 - `应用层`: 知道两个主机是哪个进程在通信了还不够,还要知道他们是使用什么协议在通信的,这个协议的实现就是应用层提供的服务,比如 `HTTP、FTP、SSH、SMTP` 等等协议。 **主机之间的网络通信依赖于每一层的协议,这一系列的协议就是按照`TCP/IP协议族`中协议规范实现的。** 下图为实际两台主机之间的网络交互过程描述: ![主机之间的网络交互过程](https://img.kancloud.cn/70/a1/70a120d184eb9f2d87a016b5f8a07d35_935x499.png) 下图为Wireshark工具下分析消息包的层次结构(每层都对应着一种协议格式): ![Wireshark工具下分析消息包的层次结构](https://img.kancloud.cn/36/0b/360b290d7b8054b30f3dd3ef24633fb8_826x109.png) 数据通过这种协议栈的层层包裹与解析,可以清晰无误的传达需要传达的数据,不会因为协议在中途解析识别错误而丢失的情况,如果数据因为某种原因无法传达到目的地,也会有对应的协议保证可以及时发现汇报。 ### RFC文档 >每一种协议的实现都是有个标准规范,比如我们都要实现一个FTP协议,那么大家都按同一个标准规范来做才能保证不同人的实现功能保证一致,彼此才能正确通信。 每种协议都对应着一个或多个RFC规范文档,例如: `FTP`协议规范文档有`RFC959`、`RFC1579`、`RFC2228`等。 `HTTP`协议规范文档有`RFC2616`、`RFC7540`。 想要阅读RFC文档内容可以从这里下载获取:[RFC文档下载地址](https://tools.ietf.org/html/) 我们也可以通过查看 [RFC索引文档](https://tools.ietf.org/rfc/index) 了解搜索关键词找到与之相关的所有的RFC文档简要信息。