转载大佬文章
我们每天使用互联网,本质上是在传输/接收各种数据,具体如何传输则是按照一系列互联网协议进行的。我们常说的网络七层模型,五层模型,四层模型都是对数据传输过程做了细化的分层。
按照五层模型比较好理解,并且理解每一层的功能主要是理解每一层的协议,如图是从【客户端】发送数据,经过应用层–》传输层–》网络层–》数据链路层–》物理层这 五层协议的处理,转化为物理的光电信号传输。【服务端】接收到之后再逆向顺序按照每层的协议逆向分析出数据。
分层的意义是为了封装,每一层都有自己特有的功能,上层协议可以使用下层协议的功能,上层的变动完全不涉及下层的结构。
将计算机用物理设备链接,使用网络物理方式传输0/1 序列,其中物理设备主要包含光缆、电缆、双绞线、无线电波等。
最终数据是按照0/1 序列进行传输的,0/1序列如何解读和分组,就是『数据链路层』的功能。
作用于该层功能的协议:以太网协议
每个计算机接入网络后都分配一个 IP 地址,我们如何找到具体的计算机节点就是『网络层』的功能。
作用于该层功能的协议:IP 协议、ARP协议、ICMP协议
每个计算机上都运行着多个程序,每个程序都有唯一的端口号,我们如何找到具体某个程序来接收和发送数据就是『传输层』的功能。
作用于该层功能的协议:TCP 协议、UDP协议
用户唯一能接触到的一层,应用之间的数据链接协议,规定应用程序的数据格式就是『应用层』的功能。例如浏览器向服务发送HTTP请求时,就必须按照Http 协议规定的格式发送数据。
作用于该层功能的协议:HTTP 协议、DHCP协议、FTP协议、SMTP协议
将计算机用物理设备链接,使用网络物理方式传输0/1 序列。
其中物理设备主要包含光缆、电缆、双绞线、无线电波等。也是我们物理上能观察到的。
『数据链路层』的功能就是针对 0/1序列解读和分组。
以太网规定:一组0/1电信号构成一个数据包,叫做帧,每一帧包含标头(Head)和数据体(Data)
标头包含了数据类型,发送者和接受者等信息。
"标头"的长度,固定为18字节,"数据"的长度,最短为46字节,最长为1500字节,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送
。
上面提到数据包标头中包含了发送者和接受者信息,发送和接受的设备都有其唯一标识(网卡地址,MAC地址),每块网卡出厂的时候,都有唯一的MAC地址,长度是48个二进制位,通常用12个十六进制数表示,就可以定位网卡和数据包的路径了。
如果都知道了发送和接受设备的MAC地址了,如何做到一对一准确传输呢?
以太网采用一种很"原始"的方式,他会向子网内
的所有设备进行广播,接收的机器判断自己的 MAC 地址和标头中的 MAC 地址是否相等,相等则接收数据,否则丢弃数据。
上面广播方式时默认了发送者是知道接收者的MAC地址的。那如何获取接受者的 MAC 地址呢?这个是根据网络层的ARP 协议获取的。
数据链路层中以太网以广播的形式传输,如果北京和巴黎两台计算机处于同一子网内时,两者进行通信时,如果还是采用这种广播的方式,那就造成资源浪费和十分低效,所以两者肯定不能存在同一子网范围内
(只是包含了附近少量的设备)。那么如何区分多个设备是属于同一子网内呢?
我们知道,MAC 地址只与物理设备有关,与网络无关,所以这是网络层的功能。
网络层引进一套新的地址,使我们能够区分两台设备是否处于同一子网络,这个地址简称 『网络地址』。
IP 协议功能是为每一个计算机分配网络地址,并且判断哪些网络地址属于同一子网络
。 它所定义分配的地址,就被称为IP地址。(注意:IP 地址是IP 协议定义的网络地址的称呼,IP 协议则是一套协议)。
IPv4规定,网络地址由32个二进制位组成,从0.0.0.0一直到255.255.255.255,互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机,如何区分哪部分是主机部分,需要用到另一个参数"子网掩码",形式上等同于IP地址,网络部分全部为1,主机部分全部为0,将两个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 数据包,IP数据包也分为"标头"和"数据"两个部分。数据部分直接放进以太网数据包的"数据"部分 ,标头部分增加IP地址信息(完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构)。
ARP 协议(地址解析协议)主要负责 IP 地址和 MAC 地址的映射关系解析。
ARP协议也是发出一个数据包(包含在以太网数据包中,这里也体现了:上层协议可以使用下层协议的功能),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
但是每个计算机上都运行着多个程序,还需要一个参数表示每个程序的唯一性。这个参数就叫做"端口"(port)。
"端口"是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
“网络层"的功能是建立"主机到主机"的通信,“传输层"的功能是建立"端口到端口"的通信。
那么如何将端口信息加到数据报中呢,使用了下面的协议。
用户数据报协议,也是由"标头"和"数据"两部分组成,"标头"部分主要定义了发出端口和接收端口。"数据"部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的"数据"部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样。
传输控制协议。
对比UDP协议,TCP 协议提供了建立连接的可靠传输,可靠性强,实现复杂。
详细内容后面讲。
应用层主要功能就是规定应用程序的数据格式。
举例来说,TCP协议可以为各种各样的程序传递数据,比如 Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。
计算机每次开机都会动态分配一个 IP 地址,DHCP 协议就是实现这个过程的(动态主机分配协议)。
该协议规定,子网内有一台计算机专门负责管理本网络的IP地址,这台主机称为 DHCP 服务器,每台计算机开始接入网络时,回动态的向服务器发送一个『DHCP数据包』来申请IP地址和相关的网络参数。
DHCP 协议是基于UDP协议的应用层协议
,其『DHCP数据包』 格式如上:
(1)以太网标头中存放本机MAC 地址、DHCP服务器 MAC 地址(此时还不知道,设置为广播地址:FF-FF-FF-FF-FF-FF)
(2)IP 标头中存放发出方和接收方的 IP 地址,两者都不知,前者:0:0:0:0,后者:255:255:255:255
(3)UDP标头中存放发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口
以太网是广播发送的,每台计算机都收到请求,拿到广播的 MAC 地址时,都不确定。所以必须要解析 IP地址,当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发给我的",而其他计算机就可以丢弃这个包。
接下来,DHCP服务器解析这个包的数据,发送回去一个"DHCP响应"数据包,以同样的格式,分配的 IP 和网络信息都在 DATA 中。至此,新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。
HTTP协议是基于 TCP 的应用层协议。
HTTP格式如下:
GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) …
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …
我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。