互联网协议整理笔记(2)
这是从设计者的角度看问题,从系统的角度,解释互联网是如何构成的。
互联网协议:一系列针对电脑如何链接和组网做出的详尽的规定的协议。理解这些协议既理解了互联网的原理。
1.1五层模型:应用层、传输层、网络层、链接层、实体层。
//互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。越下面的层,越靠近硬件;越上面的层,越靠近用户。
1.2协议:每一层都是为了完成一种功能,实现这些功能则需要大家遵守共同的规则,这种规则就叫协议。
2.1实体层:即“物理层”,将电脑连接起来的物理手段。规定了网络的一些电气特性,作用是负责传送0、1的电信号。
3.1链接层:确定了0、1的分组方式。
//单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?
3.2以太网协议:一组电信号构成一个数据包,叫做“帧”(frame),每一帧分成:标头和数据。以太网数据包包含MAC地址。
![]()
//早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做"以太网"(Ethernet)的协议,占据了主导地位。
标头:包含了数据包的一些说明项,比如发送者、接受者、数据类型等等;长度固定为18bytes。
数据:数据包的具体内容;长度46bytes~1500bytes。
整个帧长度为64bytes~1518bytes,若数据过长则须分割成多个帧进行发送。
3.3MAC地址:以太网规定连入网络的所有设备都必须具有“网卡”接口,数据包必须从一块网卡传送到另一块网卡。网卡的地址就是数据包的发送地址和接受地址,叫做MAC地址。
//每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址就可以定位网卡和数据包的路径了。
3.4广播:
//首先,一块网卡怎么会知道另一块网卡的MAC地址?
回答是有一种ARP协议,可以解决这个问题。这个留到后面介绍!这里只需要知道,以太网数据包必须知道接收方的MAC地址,然后才能发送。其次,就算有了MAC地址,系统怎样才能把数据包准确送到接收方?
回答是以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
//举个例子:1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。

4.1网络层:作用是引进了一套新的地址使我们能够区分不同的计算机是否属于同一个子网络,这套地址就叫做“网络地址”,即“网址”。
//以太网协议,依靠MAC地址发送数据。理论上,单单依靠MAC地址,上海的网卡就可以找到洛杉矶的网卡了,技术上是可以实现的。但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一"包",不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。
互联网是无数子网络共同组成的一个巨型网络,很像想象上海和洛杉矶的电脑会在同一个子网络,这几乎是不可能的。因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。("路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。
//"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。
4.2 IP协议:规定网络地址的协议叫做IP协议。它所定义的地址叫做IP地址。
//目前采用IP协议第四版,简称IPv4。规定网络地址由32个二进制位组成。eg:192.168.1.104;习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
//互联网上的每台电脑都会分配到一个IP地址:网络地址+主机地址。
//子网掩码:表示子网络特征的一个参数,形式上等于IP地址,也是32位二进制数字,网络部分为1,主机部分为0.
eg:192.168.1.104
子网掩码:11111111.11111111.11111111.00000000
写成十进制:255.255.255.0
利用子网掩码 可以从IP地址判断两台计算机是否属于同一子网络:方法是将两个IP地址与子网掩码分别进行位AND运算,若结果相同则在同一个子网络。
//IP协议的作用:一是为每一台计算机分配IP地址;另一是确定哪些地址在同一个子网络。
4.3 IP数据包:根据IP协议发送的数据叫做IP数据包。其中包括IP地址信息。
//我们可以把IP数据包直接放进以太网数据包的"数据"部分,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。
//IP数据包也分为"标头"和"数据"两个部分:
“标头”:主要包括版本、长度、IP地址等信息;长度为20~60bytes
“数据”:IP数据包的具体内容;长度最大为65515bytes


前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。
4.4ARP协议:从IP地址得到MAC地址的一种机制。可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。
//因为IP数据包是放在以太网数据包里发送的,故我们必须同时知道这两个地址:对方MAC地址和对方IP地址:
(1)、若两台主机不在同一子网络则无法得到对方MAC地址,只能把数据包传送到两个子网络连接处的“网关”,让网关处理;
(2)、若两台主机在同一子网络则可以利用ARP协议而得到对方MAC地址。ARP协议也是发送一个数据包(包含在以太网数据包中),其中包含所要查询主机的IP地址,在对方的MAC地址填写FF:FF:FF:FF:FF:FF表示是一个“广播”地址,它所在子网络的每一台主机都会收到这个数据包,从中取出IP地址与自身IP地址进行对比,若两者相同则做出回复,向对方报告自己的MAC地址,否则就丢弃这个包
5.1传输层:建立“端口到端口”的通信。相比之下,网络层是建立“主机到主机”的通信。确定了主机和端口就可以实现程序之间的交流。
//UNIX系统把 主机+端口 的模式叫做“套接字”socket,有了它就可以进行网络应用程序开发。
//有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口”是0~65535之间的一个整数,正好16个二进制位;0~1023被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口然后与服务器的相应端口联系。
5.2UDP协议:在IP数据包中加入端口信息需要新的协议,最简单的实现叫做UDP协议,格式是:数据前加端口号。
UDP数据包,也是由"标头"和"数据"两部分组成:
"标头"部分:主要定义了发出端口和接收端口;
"数据"部分:就是具体的内容;
然后,把整个UDP数据包放入IP数据包的"数据"部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:


//UDP协议的优点:比较简单,容易实现;缺点:可靠性较差,一旦数据包发出,无法知道对方是否收到。
//UDP数据包非常简单,“标头”部分共8bytes,总长度不超过65535bytes,正好放进一个IP数据包。
5.3TCP协议:这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
//为了解决UDP协议缺点,提高网络可靠性而诞生的。
//TCP协议优点:能够确保数据可靠不会遗失;缺点:过程复杂、实现困难、消耗较多的资源。
//TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
6.1应用层:作用是规定应用程序的数据格式。
//比如:TCP协议可以为各种各样的程序传递数据,eg:Email、WWW、FTP等等。则必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了“应用层”。
//这是最高一层,直接面对用户。其数据就放在TCP数据包的“数据”部分。此刻,以太网的数据就变成了下面图所示:

--------------------------------------------------------------------------------------------------------------------------
现在切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。
7 小结:
//网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是上面的样子。

//发送以上这个包需要知道两个地址:
对方的MAC地址和对方的IP地址
有了这两个地址数据包才能准确的送到接受者手里。但是MAC地址有局限性,若两台电脑不在同一个子网络就无法知道对方的MAC地址,必须通过网关转发。

//上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑。
1号电脑把数据包发到网关A,必须知道网关A的MAC地址。所以,数据包的目标地址,实际上分成两种情况:
场景 数据包地址
同一个子网络 对方的MAC地址,对方的IP地址
非同一个子网络 网关的MAC地址,对方的IP地址
发送数据包之前,电脑必须判断对方是否在同一个子网络,然后选择相应的MAC地址。接下来,我们就来看,实际使用中,这个过程是怎么完成的。
8用户上网设置
8.1静态IP地址:上网提前给定的IP地址,每次开机都会分到同样的IP地址,该情况也叫做“静态IP地址上网”
//新电脑上网需要设置:
(1)、本机的IP地址
(2)、子网掩码
(3)、网关的IP地址
(4)、DNS的IP地址
8.2动态IP地址:计算机开机后会自动分配到一个IP地址,不用人为设定。使用的协议叫做DHCP协议。
8.3DHCP协议:一种应用层协议,建立在UDP协议之上。规定每一个子网络中有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”,新的计算机加入网络必须向“DHCP服务器”发送一个“DHCP请求”数据包,申请IP地址和相关的网络参数。

//(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,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的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服务器等等参数。
9 实例:访问网页
9.1 设置好自己的本机参数:
* 本机的IP地址:192.168.1.100
* 子网掩码:255.255.255.0
* 网关的IP地址:192.168.1.1
* DNS的IP地址:8.8.8.8
然后他打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。这意味着,浏览器要向Google发送一个网页请求的数据包。比如,只知道网址www.google.com,不知道它的IP地址。
9.2 DNS协议:帮助我们将网址转换成IP地址。
已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口)。然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105.于是我们知道了对方的IP地址。

9.3 子网掩码
接下来,我们要判断该IP地址是不是在同一个子网络,就用到了子网掩码。
//已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算(两个数位都为1,结果为1,否则为0),计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。
因此,要向Google发送数据包必须通过网关192.168.1.1转发。即接收方的MAC地址将是网关的MAC地址。
9.4 应用层协议
浏览网页用的是HTTP协议,整个数据包构造为:

HTTP部分的内容,类似于下面这样:
我们假定这个部分的长度为4960bytes,它会被嵌在TCP数据包之中。
9.5 TCP协议
TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)端口是一个随机数生成的1024~65535之间的整数,假定为51775。
TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。
9.6 IP协议
然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。
IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。
9.7 以太网协议
最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。
以太网数据包的数据部分最大长度为1500bytes,而现在的IP数据包长度为5000bytes。因此,IP数据包必须分隔成四个包,每个包都有自己的IP标头(20bytes),所以四个包的IP数据包长度分别为1500,1500,1500,560。

9.8 服务器端响应
经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。
根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。
本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。
这个例子就到此为止,虽然经过了简化,但它大致上反映了互联网协议的整个通信过程。
参考网络基础知识:
http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html
浙公网安备 33010602011771号