劳于读书,逸于做文。html
原文地址:internet协议入门git
博主博客地址:Damonare的我的博客github
博主以前写过一篇博客:网络协议分析,在这篇博客里经过抓包,具体的分析了不一样网络协议的传送的数据和传送的方式。而此篇博客则用来做为一个大纲式的内容,按照层级划分,逐步介绍各层级的协议以及他们所起的做用。如有错误之处,欢迎批评指正。数据库
互联网的实现,分红好几层。每一层都有本身的功能,就像建筑物同样,每一层都靠下一层支持。api
首先咱们须要明白的事互联网的实现是分层级的,那么这个层级的划分根据不一样的模型又有一些不一样。其中又有两个模型的划分是咱们最多见到的,一个是OSI七层划分,另外一个是TCP/IP五层划分。他们分别把互联网分红了七层和五层。服务器
OSI和TCP/IP模型是很基础但又很是重要的网络基础知识微信
OSI七层模型网络
OSI的层 | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示层 | 数据格式化,代码转换,数据加密 | 没有协议 |
会话层 | 解除或创建与别的接点的联系 | 没有协议 |
传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110,IEEE802,IEEE802.2 |
每一层都是为了完成一种功能。为了实现这些功能,就须要你们都遵照共同的规则。
你们都遵照的规则,就叫作"协议"(protocol)。
这个协议就是咱们所说的互联网协议
(internet protocol),每一层都有若干个协议,他们共同构成了咱们所要讲的互联网协议。
由以上表格咱们能够看出,在OSI七层协议
模型里会话层和表示层是没有协议的,这里咱们取的是TCP/IP
模型,分红五层也比较容易解释。
那么这五层又都是什么呢?从上到下分别是:架构
层级 | 网络设备 |
---|---|
应用层 | 也就是用户使用的应用了。 |
传输层 | 四层交换机、也有工做在四层的路由器 |
网络层 | 路由器、三层交换机 |
数据链路层 | 网桥(现已不多使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工做在物理层、一半工做在数据链路层) |
物理层 | 网卡,光纤,CAT-5线,中继器、集线器、还有咱们一般说的双绞线也工做在物理层 |
如上表格所示,最底下的一层叫作物理层
(Physical Layer),最上面的一层叫作应用层
(Application Layer),中间的三层(自下而上)分别是数据链路层
(Data Link Layer)、网络层
(Network Layer)和传输层
(Transport Layer)。越下面的层,越靠近硬件;越上面的层,越靠近用户。下面来介绍每一层的功能,着重介绍每一层的主要协议socket
物理层规定:为传输数据所须要的物理链路建立、维持、拆除,而提供具备机械的,电子的,功能的和规范的特性 ——物理层(维基百科)
上面维基百科对于物理层的解释说白了就是要把电脑连在一块,方法呢,能够用光缆、电缆、双绞线、无线电波等方式。
物理层
就是把电脑链接起来的物理手段。它主要规定了网络的一些电气特性,做用是负责传送0和1的电信号。
在两个网络实体之间提供数据链路链接的建立、维持和释放管理。构成数据链路数据单元(frame:数据帧或帧),并对帧定界、同步、收发顺序的控制。 ——数据链路层(维基百科)
上面说的网络实体也就是咱们平常用到的手机电脑等联网设备了,咱们刚刚了解到不一样网络实体之间经过一些物理手段(光缆,双绞线,无线电波等)链接在了一块儿,来进行传输0和1电信号。单纯的传输0和1没有任何意义,确定是要规定电信号的解读方式,多少个电信号是一组?每一组表明的意义又是什么?
这就是数据链路层的功能,规定这些电信号的分组方式。
刚刚开始的时候,每一家公司都有本身的一套对于电信号的解读方式,后来随着时间的推移,一种叫作以太网
(Ethernet)的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫作"帧"(Frame)。每一帧分红两个部分:标头(Head)和数据(Data)。
标头
包含数据包的一些说明项,好比发送者、接受者、数据类型等等;数据
则是数据包的具体内容。
标头
的长度,固定为18字节。数据
的长度,最短为46字节,最长为1500字节。所以,整个帧
最短为64字节,最长为1518字节。若是数据很长,就必须分割成多个帧
进行发送。
我想在平常上网过程当中,最为熟悉的就是用一根网线链接端口和电脑了吧,网线链接电脑其实是链接的这个玩意儿:
上面就是咱们所说的网卡了,它在物理层和数据链路层两个层级工做,正所谓能力越大责任越大,网卡的重要性天然不言而喻了。前面说,以太网规定每个数据包都有一个标头
(Head)来讲明发送者,接受者信息,数据类型等信息。而网卡就是以太网规定的来标明发送者和接受者信息的工具。
网卡的地址,就是数据包的发送地址和接收地址,这叫作MAC地址。
这个Mac地址天然就是发送者,接受者信息的了,经过这个每台电脑独一无二的地址计算机就能经过一些方式找到另外一台电脑了。每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,一般用12个十六进制数表示。有了MAC地址,就能够定位网卡和数据包的路径了。
咱们如今有了网卡,也知道每一块网卡都有一个世界上独一无二的Mac地址,那发送者应该怎么去找接受者这台设备呢,换句话说发送者怎么才能知道接受者的Mac地址呢?这就须要另外一个协议了叫作ARP协议,这个协议留在后面介绍。这里咱们只须要知道,发送者必需要知道接受者的Mac地址才能准确的发送数据。
以太网采用了一种广撒网的方式,发送者发送的数据包会发送给本网络内全部的计算机,而后由接收到数据包的计算机来判断本身是否是接收方。
图片来自维基百科广播),如图所示,红色主机是发送方,绿色某一台是接收方,数据包会发送给同一个子网络的全部绿色主机,而后由绿色主机根据数据包的标头来判断本身是否是接收方。若是是,就接受这个包,不是则丢弃。这种发送数据的方式就是广播
。
综上,有了对于数据包的定义,网卡的Mac地址,广播的发送方式,数据链路层基本就算完整了,而后不一样计算机之间就能够传送数据了。
网络层使两终端系统可以互连且决定最佳路径,并具备必定的拥塞控制和流量控制的能力。 ——网络层(维基百科)
走到这里咱们实现的只是在一个子网络里传送数据。但咱们知道,互联网其实是由大大小小的子网络组成的:
大到一个ISP(因特网服务提供商,国内较大的好比移动电信等),小到一个公司的局域网,正事这些大大小小的子网络组成了庞大的互联网体系。但实际上,广播的方式只能在子网络内进行,不一样子网络之间广播方式是行不通的。
所以咱们须要一种方法可以判断两台主机是否在同一个子网络以内,若是在同一个子网络就以广播的方式传输数据,若是不在同一个子网络就以路由
的方式传输(路由是个比较大的概念,本文不涉及),关于路由协议的了解戳这里,MAC地址作不到这一点,它只和厂商有关,和计算机所处的网络并无关系。
这就致使了"网络层"的诞生。它的做用是引进一套新的地址,使得咱们可以区分不一样的计算机是否属于同一个子网络。这套地址就叫作"网络地址",简称"网址"。
网址的出现,使得每台计算机都有了两个地址,一个是出生就带着不会改变的Mac地址,一个是后期网络管理员分配的可变的网络地址。网址判断两台计算机是否在同一个子网络,Mac地址则是将数据准确的传递到目标计算机中。所以逻辑上能够判断一定是先处理网络地址,再处理Mac地址。
规定网络地址的协议,叫作IP协议。它所定义的地址,就被称为IP地址。
如今普遍采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成,IPV6则是64个二进制组成。
因为IPV6尚未普遍应用,这里仍是用IPV4讲解。通常咱们用分红四段(IPV6分红八段)的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。这个地址分红两部分,前一部分是网络部分,后一部分表明主机。But!!!网络部分具体是前16位仍是前24位,咱们无法从IP地址进行判断,这是咱们就须要另外一参数叫作子网掩码
。
所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于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地址放在哪里存储呢?是的,咱们能够直接存储在前面提到的以太网数据包的Data部分。
IP地址长这样:
"标头"部分主要包括版本、长度、IP地址等信息,"数据"部分则是IP数据包的具体内容。
如今把它加到以太网数据包里面:
IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。所以,理论上,一个IP数据包的"数据"部分,最长为65,515字节。前面说过,以太网数据包的"数据"部分,最长只有1500字节。所以,若是IP数据包超过了1500字节,它就须要分割成几个以太网数据包,分开发送了。
如今为止咱们必须知道两个地址,一个是IP地址,一个是Mac地址才能把数据发送到目标主机,那么IP地址是已知的(后文解释),MAC地址怎么获取呢?
咱们须要一种能经过IP地址得知MAC地址的机制,这个极致就是ARP协议。
那么,这里又分红两种状况,一种是两台计算机在同一个子网络,那么咱们能够用ARP协议,获得对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。若是二者相同,都作出回复,向对方报告本身的MAC地址,不然就丢弃这个包。
另外一种状况是两台计算机不在同一个子网络,
那么事实上没有办法获得对方的MAC地址,只能把数据包传送到两个子网络链接处的"网关"(gateway),让网关(后文解释)去处理。
这一层为止,若是目标主机和本机在同一个子网络,咱们经过IP地址,子网掩码比较得出在同一个子网络的结果,在经过ARP协议获得目标主机的Mac地址,发送!Success!
若是目标主机和本机不在同一个子网络,咱们经过IP地址,子网掩码比较得出在同一个子网络的结果,而后交给本网络的网关A处理,网关A根据路由协议获得目标主机所在子网络的网关B,网关B再经过IP地址判断得出和目标主机在同一个子网络,而后再经过ARP协议获取Mac地址,发送!Success!
该层的协议为应用进程提供端到端的通讯服务。它提供面向链接的数据流支持、可靠性、流量控制、多路复用等服务。——传输层(维基百科)
咱们如今成功的实现了主机和主机之间的通讯,那么问题又来了,主机之间不一样的程序该怎么区分这个数据是否是发送给本身的呢。要知道,当你正在QQ聊天的时候,微信发送过来的消息内容呈如今了QQ界面,这会让计算机懵逼的!太混乱了!
这个时候咱们就须要一个新的参数了!这个参数就是端口
。
可链接两个或两个以上不一样之电路装置使之可以传递电子或任何形式讯号之装置.——端口(维基百科)
它实际上是每个使用网卡的程序的编号。每一个数据包都发到主机的特定端口,因此不一样的程序就能取到本身所须要的数据。
不一样的程序在计算机中所占用的端口是不一样的,确切的说是不能相同的,不然就混乱了。好比,HTTP所占用的端口通常是80,HTTPS所占用的端口通常是443。
端口
是0到65535之间的一个整数,正好16个二进制位。0到1023的端口
被系统占用,用户只能选用大于1023的端口
。无论是浏览网页仍是在线聊天,应用程序会随机选用一个端口
,而后与服务器的相应端口
联系。
确切的说,传输层实现的是端对端的服务,网络层实现的仅仅是主机到主机之间的服务。只要肯定主机和端口,咱们就能实现程序之间的交流。所以,Unix系统就把主机+端口,叫作"套接字"(socket)。
如今又出了一个新的数据,就是端口信息。如今以太网数据包里已经包括发送者,接受者信息,数据类型,IP地址数据包,UDp数据包。
UDP数据包一样是由标头和数据组成:
标头
部分主要定义了发出端口和接收端口,数据
部分定义了具体的内容。而后把它放在IP地址数据包的数据部分,前面咱们说过IP数据包是放在以太网数据包的数据里面的,那么如今整个以太网数据包就成了这样:
UDP数据包很是简单,"标头"部分一共只有8个字节,总长度不超过65,535字节,一个IP数据包正好能够容纳。
为了解决这个问题,提升网络可靠性,TCP协议就诞生了。这个协议很是复杂,但能够近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。若是有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
所以,TCP协议可以确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包同样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上能够无限长,可是为了保证网络的效率,一般TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包没必要再分割。
关于TCP协议的三次握手和四次挥手过程博主在网络协议分析这篇博客里有较为详细的说明。
应用层直接和应用程序接口并提供常见的网络应用服务。 ——应用层(维基百科)
应用程序收到"传输层"的数据,接下来就要进行解读。因为互联网是开放架构,数据来源五花八门,必须事先规定好格式,不然根本没法解读。
"应用层"的做用,就是规定应用程序的数据格式。
举例来讲,TCP协议能够为各类各样的程序传递数据,好比Email、WWW、FTP等等。那么,必须有不一样协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。
这是最高的一层,直接面对用户。它的数据就放在TCP数据包的"数据"部分。所以,如今的以太网的数据包就变成下面这样:
上面买的坑改填了,咱们前面说过,咱们对于目标主机的IP地址确定知道的,为何呢?还有就是当两台计算机不在同一个子网络的时候,咱们须要经过本机所在子网络的网关A,再经过路由协议获得目标主机子网络的网关B,由网关B将咱们要发送给目标主机的数据包发送给目标主机。那么,网关又是什么呢?
咱们都知道因为IP地址不方便记忆,咱们创造了域名这个概念。
DNS(网域名称系统,Domain Name System,有时也简称为域名)是因特网的一项核心服务,它做为能够将域名和IP地址相互映射的一个分布式数据库,可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的IP地址数串。
例如,damonare.cn是一个域名,和IP地址119.29.180.47相对应。DNS就像是一个自动的电话号码簿,咱们能够直接拨打damonare的名字来代替电话号码(IP地址)。咱们直接调用网站的名字之后,DNS就会将便于人类使用的名字(如 damonare.cn)转化成便于机器识别的IP地址(如119.29.180.47)。
已知DNS服务器为8.8.8.8(这个和IP地址同样管理员告知或是经过自行设置的),因而咱们向这个地址发送一个DNS数据包(53端口):
DNS服务器作出响应,告诉咱们Google的IP地址是172.194.72.105。因而,咱们知道了对方的IP地址。
网关要区别于路由器(因为历史的缘由,许多有关TCP/IP的文献曾经把网络层使用的路由器(英语:Router)称为网关,在今天不少局域网采用都是路由来接入网络,所以如今一般指的网关就是路由器的IP),常常在家庭中或者小型企业网络中使用,用于链接局域网和Internet。
前面咱们已经说过发送以太网数据包,须要知道两个地址:
有了这两个地址,数据包才能准确送到接收者手中。可是,前面说过,MAC地址有局限性,若是两台电脑不在同一个子网络,就没法知道对方的MAC地址,必须经过网关(gateway)转发。
上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),因而就把这个数据包发到网关A。网关A经过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑。
新买的电脑一般你必须作一些设置,才能上网,有时,管理员(或者ISP)会告诉你下面四个参数,你把它们填入操做系统,计算机就能连上网了:
因为它们是给定的,计算机每次开机,都会分到一样的IP地址,因此这种状况被称做"静态IP地址上网"。以下图Window静态IP上网设置界面:
这样的设置很专业,但普通用户望而生畏,并且若是一台电脑的IP地址保持不变,其余电脑就不能使用这个地址,不够灵活。出于这两个缘由,大多数用户使用"动态IP地址上网"。
动态IP地址上网使用的协议就是DHCP协议
,这个协议规定,每个子网络中,有一台计算机负责管理本网络的全部IP地址,它叫作"DHCP服务器"。新的计算机加入网络,必须向"DHCP服务器"发送一个"DHCP请求"数据包,申请IP地址和相关的网络参数。
前面说过,若是两台计算机在同一个子网络,必须知道对方的MAC地址
和IP地址
,才能发送数据包。可是,新加入的计算机不知道这两个地址,怎么发送数据包呢?
DHCP协议
作了一些巧妙的规定。
首先DHCP协议是创建在UDP协议之上,因此整个数据包是这样的:
这个数据包构造完成后,就能够发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。由于接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,因此每台收到这个包的计算机,还必须分析这个包的IP地址,才能肯定是否是发给本身的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,因而DHCP服务器知道"这个包是发给个人",而其余计算机就能够丢弃这个包。
接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是相似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
新加入的计算机收到这个响应包,因而就知道了本身的IP地址、子网掩码、网关地址、DNS服务器等等参数。
应用层比较重要的协议还有大名鼎鼎的HTTP协议,这个在博主的网络协议分析这篇博客里对于TCP/HTTP协议有较为详细的分析,在这里就很少作介绍了。
经过整篇博客分析,我想整个互联网的层级划分就很清楚了,也应该明白了数据是如何发送的,大概的过程就是如此,但互联网协议浩如烟海究极一辈子可能也没法真正理解。此篇博客仅仅做为一个入门,也算是一个大体的思路。关于数据包数据具体的形式,路由,以及其余协议就须要读者本身去进一步发掘理解了。
参考文章: