互联网的实现,分为好几层,每一层都有本身特有的功能,并且每一层都靠下一层支持。用户接触到的,只是最上面的一层,咱们称为应用层,要理解互联网,必须从最下层开始,自下而上的理解每一层的功能。html
咱们常见的网络模型,有如下三种:编程
OSI七层模型缓存
理论五层模型安全
TCP/IP四层模型服务器
它们之间的关系以下图所示 markdown
其中,理论五层模型
是综合OSI七层
和TCP/IP四层
的优势,采用的一种原理体系结构。咱们接下来的探讨也是基于理论五层模型
来展开的。网络
理论五层模型
的结构以下图 架构
各层的做用以下:socket
HTTP、HTTPS、SMTP、TELNET
等端到端
服务,使它们看不到传输层如下的数据通讯的细节。端到端
意思是数据来自某个端口
,再传送给指定的端口
端口
:一个0到65535间的整数,用来指定特定应用程序TCP、UDP
等IP
协议帧
,肯定电信号的数据包格式。以太网
协议0和1
的电信号进行传输的。简单说,越下面的层,越靠近硬件;越上面的层,越靠近用户。oop
每一层都是为了完成某一种功能。为了实现这些功能,须要遵照一些共同的规则,这些规则就是协议(protocol)
。
互联网的每一层,都定义了不少协议。这些协议的总称,叫作互联网协议(Internet Protocol Suite)
,它们是互联网的核心。
下面的内容中,咱们经过每一层的功能的介绍,对每一层中的主要协议所起做用进行讲解。
电脑要进行联网,须要把电脑经过各类设备链接进网络,设备有光缆、电缆、双绞线、无限电波等方式。 这就是
物理层
,它就是把电脑链接起来的物理手段,它主要规定了网络的一些电气特性,做用是传输0和1
的电信号。
物理层是用于传输信号的介质,它传输的是0和1
的电信号。可是关于电信号如何分组,每一个信号位有何意义并无规定。
这就是数据链路层
的功能,它在物理层
的上方,肯定了0和1的分组方式,用于两个设备(同一种数据链路结点)之间进行信息传递。
早期的时候,每家公司都有本身的电信号分组方式。逐渐地,一种叫作以太网(Ethernet)
的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫作帧(frame)
,每一帧分为两个部分:标头(Head)
和数据(Data)
。
标头
的长度,固定为18字节
;数据
的长度,最短为46字节
,最长为1500字节
。所以,整个帧
最短为64字节
,最长为1518字节
。若是数据很长,就必须分割成多个帧发送。MTU是链路层对物理层的限制。
最大值1500字节
称为以太网的最大传输单元(MTU),不一样的网络类型有不一样的MTU。因为链路层存在MTU的限制,致使网络层的报文若是超过1500字节,就必要要对其进行分片发送。
IP协议头
的3
位标志字段中, 第2
位MF置为0
, 表示容许分片
, 第3
位DF来表示结束标记
(当前是不是后一个小包, 是的话置为1, 不然置为0)。任意一个小包丢失
,接收端的重组就会失败
,可是IP层不会负责从新传输数据。1472(1500 - 20(IP首部) - 8(UDP首部))
,那么就会在网络层分红多个IP数据报
。任意一个丢失
,都会引发接收端网络层重组失败
。那么这就意味着,若是UDP数据报在网络层被分片,整个数据被丢失的几率就大大增长。局域网环境下
,建议UDP数据控制在1472字节如下
;在Internet环境下
,建议将UDP数据控制在548字节如下
。MSS(Max Segment Size)
。链接
时,首先会和对方协商MSS
的大小(也只能在三次握手时协商,不然就是默认值536字节)。理想的状况下,MSS的值正好是在IP不会被分片处理的大长度(这个长度仍然是受制于数据链路层的MTU)选择较小的做为最终的MSS
。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。MSS = MTU - TCP首部 - IP首部
,既TCP报文的数据长度。上面咱们提到,以太网数据包的标头
,包含了发送者和接受者的信息。那么,发送者和接受者是如何标识呢?
以太网规定,连入网络的全部设备,都必须具备网卡
接口。数据包必须是从一块网卡,传送到另外一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫作MAC地址
。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址
,长度是48个二进制位
,一般用12个十六进制数
表示。
前6个十六进制数是厂商编号,后6个十六进制数是该厂商的网卡流水号。有了MAC地址,就能够定位网卡和数据包的路径了。
定义地址只是第一步,后面还有更多的步骤:
1)首先:一块网卡怎么会知道另外一块网卡的MAC地址?
回答是有一种ARP协议
,能够解决这个问题。这个在本文网络层中介绍,这里只须要知道,以太网数据包必须知道接收方的MAC地址,而后才能发送。
2)其次:就算有了MAC地址,系统怎样才能把数据包准确送到接收方?
回答是以太网采用了一种很原始的方式,它不是把数据包准确送到接收方,而是向本网络内全部计算机发送
,让每台计算机本身判断,是否为接收方。
上图中,5号计算机向3号计算机发送一个数据包
,同一个子网络的1号、2号、3号、4号、6号计算机都会收到
这个包。它们读取这个包的标头
,找到接收方的MAC地址
,而后与自身的
MAC地址相比较
,若是二者相同
,就接收这个包
,作进一步处理,不然就丢弃
这个包。这种发送方式就叫作广播
(broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,"连接层"就能够在多台计算机之间传送数据了。
以太网协议,依靠MAC地址发送数据。理论上,单单依靠MAC地址,成都的网卡就能够找到休斯顿的网卡了,技术上是能够实现的。
可是,这样作有一个重大的缺点。以太网
采用广播
方式发送数据包
,全部成员人手一包,不只效率低
,并且局限在发送者所在的子网络
。也就是说,若是两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,不然互联网上每一台计算机都会收到全部包,那会引发灾难。
互联网是无数子网络共同组成的一个巨型网络,很像想象成都和休斯顿的电脑会在同一个子网络,这几乎是不可能的。
所以,必须找到一种方法,可以区分哪些MAC地址属于同一个子网络,哪些不是。若是是同一个子网络
,就采用广播
方式发送,不然
就采用路由
方式发送。(路由
的意思,就是指如何向不一样的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC地址自己没法作到这一点。它只与厂商有关,与所处网络无关。
这就致使了网络层
的诞生。它的做用是引进一套新的地址
,使得咱们可以区分
不一样的计算机是否属于同一个子网络
。这套地址就叫作网络地址
,简称网址
。
因而,网络层
出现之后,每台计算机有了两种地址
,一种是MAC地址
,另外一种是网络地址
。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一块儿。
网络地址帮助咱们肯定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。所以,从逻辑上能够推断,一定是先处理网络地址,而后再处理MAC地址。
规定网络地址的协议,叫作IP协议
。它所定义的地址,就被称为IP地址
。目前,普遍采用的是IP协议的第四版和第六版,分别称为IPv4和IPv6。
32个二进制位
组成;分红四段的十进制数
表示IP地址,从0.0.0.0一直到255.255.255.255。互联网上的每一台计算机,都会分配到一个IP地址。这个地址分红两个部分
,前一部分表明网络,后一部分表明主机
。好比,IP地址14.215.177.39,这是一个32位的地址,假定它的网络部分是前24位(14.215.177),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分一定是相同的,也就是说14.215.177.2应该与14.215.177.1处在同一个子网络。
可是,问题在于单单从IP地址,咱们没法判断网络部分。仍是以14.215.177.39为例,它的网络部分,究竟是前24位,仍是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另外一个参数子网掩码
(subnet mask)。
子网掩码:
按位与
运算(两个数位都为1,运算结果为1,不然为0),而后比较结果是否相同,若是是的话,就代表它们在同一个子网络中,不然就不是。咱们知道,IPv4的地址只有32位,地球上网民数量已经远远超出这个数字,那么,为啥至今还没出现地址枯竭呢?
由于咱们还有一些技术,能够变相的缓解地址不足,好比NAT技术。
NAT(Network Address Translation,网络地址转换)
八组、每组四位16进制数字
组成,每组之间由:
来分隔
。压缩前导零
的表示方法,如图中的地址可写为:2001:D12:0:0:2AA:987:FE29:9871连续几段数值0的位段
时,这些段能够压缩为双冒号(::)
的表示,因此咱们获得了最终的简化格式:2001:D12::2AA:987:FE29:9871IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分。
IPv6地址结构以下图
例如RFC4291中定义了n=48, m=16,也就是子网和接口ID与各占64位。
IPv6没有子网掩码mask的概念,它支持的是子网前缀标识方法
。
使用IPv6地址/前缀长度
表示方法,例如:
能够看到,一个IPv6的地址有子网前缀+接口ID构成,子网前缀由地址分配和管理机构定义和分配,而接口ID能够由各操做系统实现生成。
IPv6是用来解决IPv4地址枯竭
问题的,IPv4地址为32位,而IPv6地址为128位
除了地址数量之外,IPv6还有不少优势,例如:
IPv6
数据链路层的type字段标识为0x86dd
,IPv4
数据链路层的type字段标识为:0x0800
IPv6报文头
部固定为40字节
,IPv4报文头
部是20到60字节
。这个意味着,写代码处理IPv6数据报文的效率会提升不少取消了校验和字段
,提升了路由器的转发效率。不过,值得一提的是,在IPv6协议下,传输层协议UDP、TCP是强制须要进行校验和的(IPv4是可选的)ICMPv六、TCP、UDP
等的时候,Next Heade
r的值分别为5八、六、17
,这个时候和IPv4报文头部中的Protocol字段很相似扩展头部
。扩展头部是IPv6引入的一个新的概念,每一个IPv6的数据报文能够承载0个或多个扩展头部,扩展头部经过链表的形式组织起来。当IPv6数据报文承载着扩展头部的时候,Next Header的数值为扩展头部的类型值。为何要引入扩展头部这个概念,这里也是IPv6对IPv4改进的一个方面,用扩展头部取代了IPv4的可选项信息,精简了IPv6的头部,加强了IPv6的扩展性。当发送一个分片IPv6数据报文的时候,IPv6使用的是扩展头部的形式组织各个分片的信息,如图IPv6报文头部Next Header字段值为44表示存在扩展头部,扩展头部是IPv6分片数据信息。对比IPv4,分片信息
是记录在IPv4报文头部
的分片字段
中。如上所述,IP协议的做用主要有两个:
根据IP协议发送的数据,就叫作IP数据包
。咱们直接把IP数据包直接放进以太网数据包的"数据"部分,不用修改以太网的规格。这就是互联网分层结构的好处:上层的变更彻底不涉及下层的结构。
具体来讲,IP数据包也分为标头
和数据
两个部分: 其中,标头
范围为20-60字节
(IPv6固定为40字节
),整个
数据包的总长度最大为65535字节
。所以,理论上
,一个IP数据包的数据部分
,最长为65515字节
。
如图所示,标头中20字节是固定不变的
,它包含了版本、长度、IP地址等信息,另外还有可变部分的标头可选。而数据则是IP数据包的具体内容。
将它放入以太网数据包后,以太网数据包就变成了下面这样:
在以太网协议中,以太网数据包的数据部分,最长只有1500字节。所以,若是IP数据包超过了1500字节,它就须要分割成几个以太网数据包,分开发送了。
关于网络层,还有最后一点须要说明。由于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地址,能够把数据包发送到任意一台主机之上了。
ARP攻击是利用ARP协议设计时缺少安全验证漏洞来实现的,经过伪造ARP数据包来窃取合法用户的通讯数据,形成影响网络传输速率和盗取用户隐私信息等严重危害。
ARP攻击主要是存在于局域网网络中,局域网中如有一台计算机感染ARP木马,则感染该ARP木马的系统将会试图经过“ARP欺骗”手段截获所在网络内其它计算机的通讯信息,并所以形成网内其它计算机的通讯故障。
局域网中比较常见的ARP攻击包括:上网时断时续,拷贝文件没法完成,局域网内的ARP包激增。出现不正常的MAC地址,MAC地址对应多个IP地址,网络数据发不出去了,网上发送信息被窃取,我的PC中毒局域网内MAC地址泛洪使MAC地址缓存表溢出等问题。据包的协议地址不匹配,从而在网络中产生大量的ARP。
在局域网环境中,ARP攻击是主要的安全威胁,在传统网络中主要是经过静态绑定的方式来解决,可是这种方式限制了网络扩展的易用性。
有了MAC地址和IP地址,咱们已经能够在互联网上任意两台主机上创建通讯。
接下来的问题是,同一台主机上有许多程序都须要用到网络,好比,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,仍是表示在线聊天的内容?
也就是说,咱们还须要一个参数,表示这个数据包到底供哪一个程序(进程)
使用。这个参数就叫作端口
(port),它实际上是每个使用网卡的程序的编号。每一个数据包都发到主机的特定端口,因此不一样的程序就能取到本身所须要的数据。
**端口是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。**无论是浏览网页仍是在线聊天,应用程序会随机选用一个端口,而后与服务器的相应端口联系。
传输层
的功能,就是创建端口到端口
的通讯。相比之下,网络层
的功能是创建主机到主机
的通讯。只要肯定主机和端口,咱们就能实现程序之间的交流。所以,Unix系统就把主机+端口,叫作套接字
(socket)。有了它,就能够进行网络应用程序开发了。
如今,咱们必须在数据包中加入端口信息,这就须要新的协议。最简单的实现叫作UDP协议,它的格式几乎就是在数据前面,加上端口号。
UDP数据包,也是由标头和数据两部分组成: 如图所示,UDP的标头固定为
8字节
,包含了16位源端口和16位目的端口,以及16位的UDP长度和16位的UDP检验和。而后,把整个UDP数据包放入IP数据包的数据部分,而前面说过,IP数据包又是放在以太网数据包之中的,因此整个以太网数据包如今变成了下面这样:
UDP数据包很是简单,标头部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
局域网环境下,建议将UDP数据控制在1472字节如下
以太网
(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节
被称为链路层的MTU(最大传输单元)。但这并非指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18个字节。
因此,事实上这个1500字节就是网络层IP数据报的长度限制。由于IP数据报的首部最小为20字节,因此IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。
又由于UDP数据报的首部8字节
,因此UDP数据报
的数据区最大长度为1472字节
。这个1472字节就是咱们可使用的字节数。
当咱们发送的UDP数据大于1472的时候会怎样呢? 这也就是说IP数据报大于1500字节,大于MTU,这个时候发送方IP层就须要分片(fragmentation)。把数据报分红若干片,使每一片都小于MTU,而接收方IP层则须要进行数据报的重组。这样就会多作许多事情,而更严重的是,因为UDP的特性,当某一片数据传送中丢失时,接收方没法重组数据报,将致使丢弃整个UDP数据报。
所以,在普通的局域网环境下,我建议将UDP的数据控制在1472字节如下为好。
Internet编程时,建议将UDP数据控制在548字节如下
进行Internet编程时则不一样,由于Internet上的路由器可能会将MTU设为不一样的值。若是咱们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报可以顺利到达目的地,这样就会作许多没必要要的操做。
鉴于Internet上的标准MTU值为576字节
,因此我建议在进行Internet的UDP编程时, 最好将UDP的数据长度控件在548字节(576-8-20)
之内。
ps:这句话貌似有问题,unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!因此,建议udp包不要超过这个大小,而不是由于internet的标准MTU是576!
UDP协议的优势是比较简单,容易实现,可是缺点是可靠性较差,一旦数据包发出,没法知道对方是否收到。为了解决这个问题,提升网络可靠性,TCP协议就诞生了。这个协议很是复杂,但能够近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。若是有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
所以,TCP协议可以确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。 如图所示,TCP标头在20-60字节之间,除了源端口号和目的端口号以外,还包含了序号、确认号等各类信息,用于保证可靠链接与数据重发。
TCP数据包和UDP数据包同样,都是内嵌在IP数据包的数据部分。TCP数据包没有长度限制,理论上能够无限长
,可是为了保证网络的效率,一般
TCP数据包的长度不会超过IP数据包的长度
,以确保单个TCP数据包没必要再分割。
应用程序收到传输层的数据,接下来就要进行解读。因为互联网是开放架构,数据来源五花八门,必须事先规定好格式,不然根本没法解读。应用层的做用,就是规定应用程序的数据格式。
举例来讲,TCP协议能够为各类各样的程序传递数据,好比Email、WWW、FTP等等。那么,必须有不一样协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了应用层。这是最高的一层,直接面对用户。它的数据就放在TCP数据包的数据部分。
所以,如今的以太网的数据包就变成下面这样: