互联网TCP/IP五层模型(一)
转载自:阮一峰
我们每天使用互联网。你是否想过,它是怎样实现的?
全世界几十亿台电脑,连接在一起,两两通信。
上海的某一块网卡送出信号,洛杉矶的还有一块网卡竟然就收到了。两者实际上根本不知道对方的物理位置。你不认为这是非常奇妙的事情吗?
互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite)。
它们对电脑怎样连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。
以下就是我的学习笔记。由于这些协议实在太复杂、太庞大,我想整理一个简洁的框架,帮助自己从整体上把握它们。为了保证简单易懂,我做了大量的简化,有些地方并不全面和精确,可是应该可以说清楚互联网的原理。
=================================================
互联网协议入门
作者:阮一峰
一、概述
1.1 五层模型
互联网的实现,分成好几层。
每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。
用户接触到的,仅仅是最上面的一层。根本没有感觉到以下的层。
要理解互联网,必须从最下层開始。自下而上理解每一层的功能。
怎样分层有不同的模型,有的模型分七层,有的分四层。我认为。把互联网分成五层,比較easy解释。
如上图所看到的。最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做"应用层"(Application Layer),中间的三层(自下而上)各自是"链接层"(Link Layer)、"网络层"(Network Layer)和"传输层"(Transport Layer)。越以下的层,越靠近硬件;越上面的层。越靠近用户。
它们叫什么名字,事实上并不重要。
仅仅须要知道,互联网分成若干层就能够了。
1.2 层与协议
每一层都是为了完毕一种功能。为了实现这些功能。就须要大家都遵守共同的规则。
大家都遵守的规则。就叫做"协议"(protocol)。
互联网的每一层,都定义了非常多协议。这些协议的总称。就叫做"互联网协议"(Internet Protocol Suite)。它们是互联网的核心,以下介绍每一层的功能。主要就是介绍每一层的主要协议。
二、实体层
我们从最底下的一层開始。
电脑要组网,第一件事要干什么?当然是先把电脑连起来,能够用光缆、电缆、双绞线、无线电波等方式。
这就叫做"实体层",它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。
三、链接层
3.1 定义
单纯的0和1没有不论什么意义,必须规定解读方式:多少个电信号算一组?每一个信号位有何意义?
这就是"链接层"的功能,它在"实体层"的上方,确定了0和1的分组方式。
3.2 以太网协议
早期的时候。每家公司都有自己的电信号分组方式。逐渐地,一种叫做"以太网"(Ethernet)的协议,占领了主导地位。
以太网规定。一组电信号构成一个数据包。叫做"帧"(Frame)。
每一帧分成两个部分:标头(Head)和数据(Data)。
"标头"包括数据包的一些说明项。比方发送者、接受者、数据类型等等。"数据"则是数据包的详细内容。
"标头"的长度。固定为18字节。
"数据"的长度。最短为46字节。最长为1500字节。因此,整个"帧"最短为64字节。最长为1518字节。假设数据非常长,就必须切割成多个帧进行发送。
3.3 MAC地址
上面提到。以太网数据包的"标头",包括了发送者和接受者的信息。
那么。发送者和接受者是怎样标识呢?
以太网规定。连入网络的全部设备。都必须具有"网卡"接口。数据包必须是从一块网卡,传送到还有一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通经常使用12个十六进制数表示。
前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就能够定位网卡和数据包的路径了。
3.4 广播
定义地址仅仅是第一步,后面还有很多其它的步骤。
首先,一块网卡怎么会知道还有一块网卡的MAC地址?
回答是有一种ARP协议,能够解决问题。这个留到后面介绍,这里仅仅须要知道,以太网数据包必须知道接收方的MAC地址,然后才干发送。
其次,就算有了MAC地址。系统如何才干把数据包准确送到接收方?
回答是以太网採用了一种非常"原始"的方式。它不是把数据包准确送到接收方,而是向本网络内全部计算机发送,让每台计算机自己推断。是否为接收方。
上图中。1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比較,假设两者同样,就接受这个包,做进一步处理。否则就丢弃这个包。
这样的发送方式就叫做"广播"(broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就能够在多台计算机之间传送数据了。
四、网络层
4.1 网络层的由来
以太网协议,依靠MAC地址发送数据。
理论上,单单依靠MAC地址。上海的网卡就能够找到洛杉矶的网卡了。技术上是能够实现的。
可是,这样做有一个重大的缺点。
以太网採用广播方式发送数据包,全部成员人手一"包"。不仅效率低,并且局限在发送者所在的子网络。也就是说,假设两台计算机不在同一个子网络,广播是传只是去的。这样的设计是合理的。否则互联网上每一台计算机都会收到全部包,那会引起灾难。
互联网是无数子网络共同组成的一个巨型网络。非常像想象上海和洛杉矶的电脑会在同一个子网络,这差点儿是不可能的。
因此,必须找到一种方法。可以区分哪些MAC地址属于同一个子网络。哪些不是。假设是同一个子网络,就採用广播方式发送。否则就採用"路由"方式发送。
("路由"的意思。就是指怎样向不同的子网络分发数据包。这是一个非常大的主题。本文不涉及。
)遗憾的是,MAC地址本身无法做到这一点。
它仅仅与厂商有关。与所处网络无关。
这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们可以区分不同的计算机是否属于同一个子网络。
这套地址就叫做"网络地址",简称"网址"。
于是。"网络层"出现以后。每台计算机有了两种地址。一种是MAC地址,还有一种是网络地址。两种地址之间没有不论什么联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们仅仅是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络。MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上能够判断。必然是先处理网络地址。然后再处理MAC地址。
4.2 IP协议
规定网络地址的协议。叫做IP协议。它所定义的地址,就被称为IP地址。
眼下,广泛採用的是IP协议第四版。简称IPv4。
这个版本号规定,网络地址由32个二进制位组成。
习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
互联网上的每一台计算机。都会分配到一个IP地址。
这个地址分成两个部分。前一部分代表网络。后一部分代表主机。
比方,IP地址172.16.254.1。这是一个32位的地址。假定它的网络部分是前24位(172.16.254)。那么主机部分就是后8位(最后的那个1)。
处于同一个子网络的电脑,它们IP地址的网络部分必然是同样的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。
可是,问题在于单单从IP地址,我们无法推断网络部分。还是以172.16.254.1为例,它的网络部分。究竟是前24位,还是前16位,甚至前28位。从IP地址上是看不出来的。
那么,如何才干从IP地址。推断两台计算机是否属于同一个子网络呢?这就要用到还有一个參数"子网掩码"(subnet mask)。
所谓"子网掩码",就是表示子网络特征的一个參数。
它在形式上等同于IP地址,也是一个32位二进制数字。它的网络部分所有为1,主机部分所有为0。
比方。IP地址172.16.254.1,假设已知网络部分是前24位。主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道"子网掩码"。我们就能推断,随意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0)。然后比較结果是否同样。假设是的话,就表明它们在同一个子网络中。否则就不是。
比方,已知IP地址172.16.254.1和172.16.254.233的子网掩码都是255.255.255.0。请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算。结果都是172.16.254.0。因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址。还有一个是确定哪些地址在同一个子网络。
4.3 IP数据包
依据IP协议发送的数据,就叫做IP数据包。不难想象。当中必然包含IP地址信息。
可是前面说过,以太网数据包仅仅包括MAC地址。并没有IP地址的栏位。
那么是否须要改动数据定义。再加入一个栏位呢?
回答是不须要。我们能够把IP数据包直接放进以太网数据包的"数据"部分。因此全然不用改动以太网的规格。
这就是互联网分层结构的优点:上层的变动全然不涉及下层的结构。
详细来说,IP数据包也分为"标头"和"数据"两个部分。
"标头"部分主要包含版本号、长度、IP地址等信息,"数据"部分则是IP数据包的详细内容。它放进以太网数据包后,以太网数据包就变成了以下这样。
IP数据包的"标头"部分的长度为20到60字节。整个数据包的总长度最大为65,535字节。因此,理论上。一个IP数据包的"数据"部分,最长为65,515字节。前面说过,以太网数据包的"数据"部分,最长仅仅有1500字节。因此,假设IP数据包超过了1500字节,它就须要切割成几个以太网数据包。分开发送了。
4.4 ARP协议
关于"网络层"。还有最后一点须要说明。
由于IP数据包是放在以太网数据包里发送的,所以我们必须同一时候知道两个地址,一个是对方的MAC地址,还有一个是对方的IP地址。
通常情况下。对方的IP地址是已知的(后文会解释),可是我们不知道它的MAC地址。
所以。我们须要一种机制。可以从IP地址得到MAC地址。
这里又能够分成两种情况。
第一种情况。假设两台主机不在同一个子网络,那么其实没有办法得到对方的MAC地址,仅仅能把数据包传送到两个子网络连接处的"网关"(gateway)。让网关去处理。
另外一种情况。假设两台主机在同一个子网络。那么我们能够用ARP协议,得到对方的MAC地址。
ARP协议也是发出一个数据包(包括在以太网数据包中),当中包括它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址。与自身的IP地址进行比較。
假设两者同样,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
总之,有了ARP协议之后,我们就能够得到同一个子网络内的主机MAC地址。能够把数据包发送到随意一台主机之上了。
五、传输层
5.1 传输层的由来
有了MAC地址和IP地址,我们已经能够在互联网上随意两台主机上建立通信。
接下来的问题是,同一台主机上有很多程序都须要用到网络。比方,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道。它是表示网页的内容。还是表示在线聊天的内容?
也就是说。我们还须要一个參数,表示这个数据包究竟供哪个程序(进程)使用。这个參数就叫做"port"(port),它事实上是每个使用网卡的程序的编号。每个数据包都发到主机的特定port。所以不同的程序就能取到自己所须要的数据。
"port"是0到65535之间的一个整数,正好16个二进制位。0到1023的port被系统占用。用户仅仅能选用大于1023的port。无论是浏览网页还是在线聊天。应用程序会随机选用一个port,然后与server的对应port联系。
"传输层"的功能,就是建立"port到port"的通信。
相比之下,"网络层"的功能是建立"主机到主机"的通信。仅仅要确定主机和port,我们就能实现程序之间的交流。
因此,Unix系统就把主机+port。叫做"套接字"(socket)。有了它,就能够进行网络应用程序开发了。
5.2 UDP协议
如今。我们必须在数据包中增加port信息,这就须要新的协议。最简单的实现叫做UDP协议,它的格式差点儿就是在数据前面。加上port号。
UDP数据包。也是由"标头"和"数据"两部分组成。
"标头"部分主要定义了发出port和接收port,"数据"部分就是详细的内容。然后,把整个UDP数据包放入IP数据包的"数据"部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包如今变成了以下这样:
UDP数据包很easy。"标头"部分一共仅仅有8个字节,总长度不超过65,535字节。正好放进一个IP数据包。
5.3 TCP协议
UDP协议的长处是比較简单,easy实现。可是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决问题,提高网络可靠性,TCP协议就诞生了。这个协议很复杂。但能够近似觉得,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。
假设有一个数据包遗失。就收不到确认,发出方就知道有必要重发这个数据包了。
因此,TCP协议可以确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样。都是内嵌在IP数据包的"数据"部分。
TCP数据包没有长度限制,理论上能够无限长,可是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度。以确保单个TCP数据包不必再切割。
六、应用层
应用程序收到"传输层"的数据,接下来就要进行解读。因为互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。
"应用层"的作用,就是规定应用程序的数据格式。
举例来说,TCP协议能够为各种各样的程序传递数据,比方Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。
这是最高的一层。直接面对用户。它的数据就放在TCP数据包的"数据"部分。因此,如今的以太网的数据包就变成以下这样。
至此,整个互联网的五层结构,自下而上所有讲完了。这是从系统的角度,解释互联网是怎样构成的。下一篇,我反过来,从用户的角度,自上而下看看这个结构是怎样发挥作用,完毕一次网络数据交换的。
互联网TCP/IP五层模型(一)的更多相关文章
- TCP/IP五层模型
(2)TCP/IP五层模型的协议 应用层 传输层 网络层 数据链路层 物理层 物理层:中继器.集线器.还有我们通常说的双绞线也工作在物理层 数据链路层:网桥(现已很少使用).以太网交换机(二层 ...
- OSI七层模型与TCP/IP五层模型
博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术.下面就开始搞了. 一.OSI参考模型 今天我们先 ...
- 简述osi七层模型和TCP/IP五层模型
OSI七层模型 OSI七层模型的划分 应用层(Application).表示层(presentation).会话层(session).传输层(Transport).网络层(Network).数据链路层 ...
- OSI七层模型与TCP/IP五层模型(转)
reference:https://www.cnblogs.com/qishui/p/5428938.html 博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能 ...
- python记录_day27 tcp/ip五层模型
## 网络协议按照不同的功能分为多层,目前存在的模型有osi七层模型.tcp/ip五层和tcp/ip四层模型 我们主要用的是tcp/ip五层模型 那么每层的作用是什么呢,现在就从设计者的角度自下到上逐 ...
- OSI七层模型与TCP/IP五层模型详解
博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术.下面就开始搞了. 一.OSI参考模型 今天我 ...
- 001-OSI七层模型,TCP/IP五层模型
一.概述 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型. OSI/ ...
- OSI七层模型和TCP/IP五层模型详解
OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范.OSI模型有7层结构,每层都可以有几个子层. OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 ...
- 网络基础——TCP/IP五层模型
TCP/IP五层模型 TCP/IP五层协议和OSI的七层协议对应关系如下 在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的. 在每一层实现的协议也各不 ...
- 【网络协议】OSI七层模型 和TCP/IP五层模型
OSI(Open System Interconnection)七层模型 TCP/IP 五层模型
随机推荐
- Java字符串学习
Java中字符串是String类的实例,字符串也是对象,所以 Java将字符串作为对象进行管理 Java使用java.lang 包中的String类来创建字符串. 1.定义字符串: 使用 " ...
- PhotoSwipe.js 相册展示插件学习
PhotoSwipe.js官网:http://photoswipe.com/,在这个网站上可以下载到PhotoSwipe的文件以及相关的例子. 这个组件主要是用来展示图片.相册用的,还是很实用的. 一 ...
- RabbitMQ笔记
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...
- 登录远程SQL服务器
一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务 ...
- jQuery常用特效插件汇总
jquery的CDN引用及下载地址 http://www.bootcdn.cn/jquery/ 1:semantictabs.js可以简单地制作Tabs菜单2:tabBox.js可以非常简单方便地 ...
- c++ explicit
C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...
- AlgorithmsI Programming Assignment 1: Percolation
3种版本的答案,第一种使用virtual top and bottom site, 但有backwash的问题,解决这个问题有两种方法: 1. 使用2个WQUUF, 但会增加memory. One f ...
- 【转】 Android的NDK开发(1)————Android JNI简介与调用流程
原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...
- 树状数组(二维):COGS 1532 [IOI2001]移动电话
1532. [IOI2001]移动电话 ★☆ 输入文件:mobilephones.in 输出文件:mobilephones.out 简单对比 时间限制:5 s 内存限制:256 MB ...
- Count Complete Tree Nodes ——LeetCode
Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...