三种模型
计算机网络是物理计算机连接起来成的系统,以及工作于系统上的协议。
网络协议分层方式常见有三种,一种是OSI七层模型,一种是TCP/IP四层模型,一种是五层模型。
五层模型的数据封装
物理层:比特传输
把电脑通过电缆、光缆连接起来,主要规定了网络的一些电气特性,负责传送0和1的电信号。
数据链路层:相邻网络元素(主机、交换机、路由器等)的数据传输
电脑连接起来后,就可以传送高低电位了,但是单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有什么意义?
以太网协议
规定一组电信号构成一个数据包,叫做“帧”,每一帧分为两部分:标头(Head)和数据(Data)。
“标头”包含数据包的一些说明项,比如发送者(源物理地址)、接收者、数据类型、CRC校验码等。“数据”则是数据包的具体内容。具体的帧结构如下所示:
“标头”的长度固定为18个字节(6+6+2+4=18),“数据”的长度,最短为46字节,最长为1500字节(MTU,最大传输单元)。因此整个帧最短为64字节、最长为1518字节。如果数据很长就必须分割成多个帧进行发送。
MAC地址:
标头标识了发送者和接收者,即源物理地址和目的物理地址的信息,其实这就是我们常说的MAC地址。以太网规定连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡传送到另一块网卡,网卡的地址就是数据包的发送和接收地址,这叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是6个字节,即48个二进制位。通常用12个十六进制数表示,前六个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。
广播:
可是我的网卡怎么知道你网卡的MAC地址呢?有一种ARP协议可以解决这个问题。
其次,就算有了MAC地址,系统怎样才能把数据包准确地送到接收方,也就是怎么发给接收方?以太网采用一种很原始地方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
上图中1号机器向2号发送数据包,同一个子网络地3、4、5号机器都会收到这个包,它们读取这个包的“标头”,找到接收方的MAC地址,然后与自身的MAC地址相比较,如果相同就接收这个包,并做进一步处理,否则就丢弃这个包。这种发送方式就叫做“广播”(broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,“链路层”就可以在多台计算机之间传送数据了。
网络层:源主机到目的主机的数据分组路由与转发
通过链路层,我们其实可以实现全世界范围内的计算机互相通信。但是有重大的缺点,以太网采用广播的方式发送数据包,不仅效率低,而且局限于发送者所在的子网络。如果两台计算机不在同一个子网络内,广播是发不过去的。这种设计是合理的,假设我们把全世界的计算机都连接起来,两两通信那么所有机器都会收到,这会造成极大的资源浪费。
互联网是由无数子网络共同组成的一个巨型网络,西安和洛杉矶是不会在同一子网络的。
因此必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是,如果是同一个子网络,就采用广播的方式发送,否则就采用“路由”方式发送(“路由”的意思,就是指如何向不同的子网络分发数据包)。遗憾的是,MAC地址本身无法做到这一点,它只与厂商有关,与所处网络无关。
这就导致了“网络层”的产生,它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,简称“网址”。
“网络层”出现后,每台计算机就有了两个地址,一个是MAC地址,一个是网络地址,两者没有任何联系,MAC地址是绑定在网卡上的,网址是管理员分配的,它们只是随机组合的,网址可以改变。
网址帮助我们确定计算机所在的子网络,MAC地址则将数据包发送到该子网络中的目标网卡。So,从逻辑上看必定是先处理网址,再处理MAC地址。
IP协议:
规定网络地址的协议,叫做IP协议。它所定义的地址就被成为IP地址。
目前广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制组成。我们习惯分成四段的十进制数表示IP地址,从0.0.0.0—255.255.255.255。
互联网上的每一台计算机都会分配到一个IP地址,这个IP地址分成两个部分,前一部分代表网络,后一部分代表主机。比如172.16.254.1,假设前24位(172.16.254)是网络部分,那么后8位(1)就是主机部分。处于同一子网络的电脑,IP地址的网络部分相同。
那么问题来了,给我们一个IP地址,那么它的网络部分到底是前24位,还是前16位,甚至是其他的等等,我们无法判断网络部分,那么怎样从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数“子网掩码”。
子网掩码:
所谓子网掩码就是表示子网络特征的一个参数,作用是将某个IP地址划分成网络地址和主机地址两部分。它在形式上等同于IP地址,也就是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网掩码就是11111111.11111111.11111111.00000000,写成十进制255.255.255.0。
知道子网掩码,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行与运算,然后比较结果是否相同,如果相同,就表明在同一子网络。
总结一下,IP协议的作用:为每台计算机分配IP地址,确定哪些地址在同一个子网络。
IP数据包:
根据IP协议发送的数据,就叫IP数据包。我们刚开始讲的物理帧的结构并没有IP地址,现在MAC地址和IP地址随机的结合在一起,网络通信的数据包需要有IP地址,那么是否需要修改数据定义,再添加一个栏位呢?
答案是不需要,我们可以直接把IP数据包直接放进以太网数据包的“数据”部分。这就是互联网分层结构的好处:上层变动不涉及下层的结构。IP数据包也分为“标头”和“数据”两部分,
“标头”主要包括版本、长度、IP地址等信息,“数据”则是IP数据包的具体内容。IP数据包的“标头”部分的长度为20到60字节,整个数据包的总长度最大为65535字节,因此理论上,最长为65515(65535-20)字节。前面说过,以太网数据包的“数据”部分,最长只有1500(MTU)字节。因此如果IP数据包超过了1500字节,它就要分割成几个以太网数据包,分开发送。把IP数据包方进以太网数据包后就变成了这样:
上面红色的是IP数据包的内容,它又作为了以太网数据包的数据部分。上层的数据包作为下层的数据部分,下层加入自己的包头组成自己本层完成的数据包,这样再往下层传递,直到数据链路层的帧,最后被转换为高低电位发送。
IP数据包的头部结构:
1.来看看每个字段的具体含义:
● 版本号 占4位,指IP协议的版本。IPv4的值为 4
● 头部长度 占4位,标识有多少个32bit字(4字节),4位最大为1111,能表示15,因此IP头部最长为15*4=60字节。
● 服务类型 占8位,可以设置不同的服务功能,例如小延迟和大吞吐量。
● 数据报总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
● 序列号 占16位。能唯一标识主机发送的每一个数据报。
● 分片标志 三个bit位。第一位保留,未使用。第二位是DF(Don’t Fragment),如果为1,表示未发生分片。第三位是MF(More Fragment),如果为1,表示发生了分片,并且除了分片出的最后一个报文中此标志为0,其余报文中此标志均为1。
● 偏移量 占13位。分片相对于原始IP数据报开始处的偏移。
● 生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。每经过一个路由器时,就把 TTL值减1。当TTL值为0时,就丢弃这个数据报。
● 上层协议 占8位,协议字段指出此数据报携带的数据是使用何种上层协议,以便使目的主机的IP层知道应将数据部分上交给上层哪个处理过程。
● 首部检验和 占16位。由发送端填充,接收端对其CRC检验以确定头部是否损坏。
● 源IP地址 占32位。标识源IP。
● 目的IP地址 占32位。标识目的IP。
2.ARP协议
上面我们提问到如何得到对方的MAC地址,通常情况下对方的IP地址是已知的,这时候就需要一种机制,能够从IP地址得到MAC地址。
分为两种情况,第一种两台计算机不在同一局域网内,事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的“网关“,让网关去处理。
第二种情况,如果两台计算机在同一子网络,那么我们可以用ARP协议,得到对方的MAC地址。
ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址一栏,填FF:FF:FF:FF:FF:FF,表示这是一个“广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址与自身的IP地址进行比对,如果相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
传输层:进程-进程的数据传输
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如一边浏览网页,一边聊天,当一个数据包发来时,怎么知道它是表示网页的内容还是聊天的内容?此时,我们还需要一个参数来表示这个数据包到底供哪个程序(进程)使用。这个参数叫“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发送到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口”是0到65535之间的整数,16个二进制位,0到1023的端口被系统占用,用户只能选择大于2013的端口。
“传输层”的功能就是建立“端口到端口”的通信,相比之下,网络层是“主机到主机”的通信,只要确定了主机和端口,就能实现程序之间的交流。Unix系统就把主机+端口,叫做套接字,来开发网络应用程序。
传输层主要是UDP/TCP协议,后面章节会详细讲。
应用层:支持各种网络应用
“应用层”的作用,就是规定应用程序的数据格式,比如TCP协议可以为各种各样的程序传递数据,比如Email、WWW等等,那么必须有不同协议规定Email、网页数据的格式,这些应用程序协议就构成了“应用层”,它的数据就放在TCP数据包的“数据”部分。因此下面以太网的数据包就变成了这样:
用户上网设置:
一般需要 本机的IP地址、子网掩码、网关的IP地址、DNS的IP地址。
静态IP地址上网
它们是给定的,计算机每次开机都会分到同样的IP地址,所以这种情况被称作“静态IP地址上网”。
动态IP地址上网
计算机开机后,会自动分配到一个IP地址,不用人为设定,它使用DHCP协议(Dynamic host configuration Protocol ,动态主机配置协议),这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”,新计算机加入网络,必须向“DHCP服务器”发送一个“DHCP请求”数据包,申请IP地址和相关的网络参数。但新加入的计算机不知道"DHCP服务器"的MAC地址和IP地址,怎么发送数据包呢?
DHCP协议
它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样:
(1)以太网标头:设置本机MAC地址和接收方(DHCP服务器)MAC地址,前者就是本机网卡的MAC地址,后者不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
(2)IP标头:设置本机IP地址和接收方IP地址,两者都不知道。于是,发送方的IP地址就设置为0.0.0.0,接收方的IP地址就设为255.255.255.255。
(3)UDP标头:设置发送方和接收方的端口,这是DHCP协议规定好的,发出方是68端口,接收方是67端口。
数据包构造完成后,就可以发送了。以太网是广播发送,同一子网络内每台计算机都能收到这个包,因为接收方的MAC地址是广播地址FF-FF-FF-FF-FF-FF-FF,看不出发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,看是不是发给自己的。当看到发出方的IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道这个包是发给我的,而其他计算机就丢弃这个包。
DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个“DHCP”响应数据包,以太网标头是双方MAC地址,IP标头是DHCP服务器的IP地址和255.255.255.255(接收方),UDP端口是67(发送方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。
一个HTTP请求访问google.com
(1)我们目前只知道网址,不知道它的IP地址,DNS协议帮助我们将网址转换成IP地址。这样我们拿到Google的IP地址
(2)接下来判断和这个IP地址是不是在同一个子网络,这就要用子网掩码,分别与子网掩码做与运算后,发现并不相等,得出不在同一个子网络。因此,我们要通过网关转发,也就是说接收方的MAC地址为网关的MAC地址。
(3)应用层是HTTP协议,数据包的构造如下:
假设HTTP数据包的长度为4960字节,然后嵌入TCP数据包中
(4)TCP协议,TCP数据包设置端口,接收方的HTTP端口默认是80,本机随机生成一个,TCP标头长度为20字节,加上嵌入的HTTP的数据包,总长度变为4980字节。
(5)IP协议:TCP数据包再嵌入IP数据包,双方IP都是已知的,IP数据包的标头长度为20字节,总长度变为5000字节
(6)以太网协议:设置双方MAC地址,其中接收方为网关的MAC地址。将IP数据包嵌入以太网数据包的数据部分,以太网数据包的数据部分最大长度为1500字节,而现在的IP数据包长度为500字节,因此IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个IP数据包的长度分别为1500、1500、1500、560
(7)Google服务器收到这四个以太网数据包后,按照IP标头的序号将这四个包拼起来,取出完整的TCP数据包,读出请求再做出响应。
Web与HTTP
超文本传输协议
C/S结构
客户---Browser:请求、接受、、展示Web对象
服务器--Web Server:响应客户的请求,发送对象
使用TCP传输服务
无服务:服务器不维护任何有关客户端过去所发请求的信息,不记录,要就发
HTTP连接的类型
非持久性连接:每个TCP连接最多允许传输一个对象,HTTP服务器发过去对象后,关闭TCP连接。
操作系统需要为每个TCP连接开销资源
持久性连接:每个TCP连接允许传输多个对象
发送响应后,服务器保持TCP连接的打开,后续的HTTP消息可以通过这个连接发送
无流水的持久性连接:客户端只有收到前一个响应后才发送新的请求
带有流水机制的持久性连接:HTTP1.1的默认选项,客户端只要遇到一个引用对象就尽快发出请求
HTTP消息类型
请求消息:
ASCII:人直接可读
响应消息:
响应状态代码:200 OK 404 Not Found……
为什么需要cookie?
HTTP协议无状态,但是很多应用需要服务器掌握客户端的状态。
某些网站为了辩证用户身份、进行session跟踪而储存在用户本地终端上的数据。
Cookie的组件
HTTP响应消息的cookie头部行
HTTP请求消息的cookie头部行
保存在客户端主机上的cookie文件,由浏览器管理
Web服务器端的后台数据库
Cookie最大的问题:隐私问题
Web缓存/代理服务器技术
在不访问服务器的前提下满足客户端的HTTP请求
缩短客户请求的响应时间
减少机构/组织的流量
在大范围内实现有效的内容分发(CDN)
浏览器向缓存/代理服务器发送所有的HTTP请求,如果所请求对象在缓存中,缓存返回对象;否则,缓存服务器向原始服务器发送HTTP请求,获取对象,然后返回给客户端并保存该对象。
问题:缓存服务器是否与原服务器上的内容同步一致?
解决:条件性GET方法
DNS应用
域名和主机之间如何映射? 域名系统DNS:用于TCP/IP应用程序的分布式数据库。
在应用层实现,不像TCP/IP协议栈在内核实现。
分布式层次式数据库
DNS根域名服务器
本地域名服务器无法解析域名时,访问根域名服务器
全球有13个根域名服务器
顶级域名服务器
com、org、net、edu等和国家顶级域名cn等
权威域名服务器
组织的域名解析服务器,比如某大学
本地域名服务器
每个ISP有一个本地域名服务器,默认域名服务器
主机进行DNS查询时,查询被发送到本地域名服务器
DNS查询示例
1.迭代查询
“我不认识这个域名,但是你可以问这个服务器”
2.递归查询
DNS记录缓存和更新
只要域名服务器获得域名--IP映射,即缓存这一映射
一段时间后,缓存条目失效
本地域名服务器一般会缓存顶级域名服务器的映射(根域名服务器不经常被访问)
下一篇:计算机网络之TCP连接的建立和终止