原文链接:
(互联网协议入门 _ 阮一峰的网络日志)
http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.htm
声明:这篇博客是对原文的摘录,没有原文详细,只是在我忘记这些知识的时候可以回顾的一种方式.所以还是建议看原文.原文地址已粘贴.
互联网的实现大致分为5层:实体层,链接层,传输层,网络层,应用层.
每一层都为了实现一种功能,为了实现这些功能,就需要都遵循一个共同的规则,大家都遵循的规则就叫做协议.
要让电脑形成一个网络,就需要将电脑给连接起来,连接方法可以用:光缆,电缆,双绞线,无线电波等.
所谓"实体层"就是:将电脑连接起来的物理手段.(实体:实现世界中的物体)
实体层主要规定了网络的一些电器特性,作用是负责传送0和1的电信号.
单纯传输过来的0和1没有任何意义,因此必须规定它的解读方式.
链路层的功能就是确定0和1的分组方式.
以太网协议规定,一组电信号构造一个数据包,叫做帧.每一帧分成两个部分:标头(Head)和数据(Data).
"标头"包含数据包的一些说明项,比如发送者,接收者,数据类型等.
"数据"则是数据包的具体内容.
"标头"的长度,固定为18个字节."数据"的长度,最短为46字节,最长为1500字节.因此,整个"帧"最短为64字节,最长 为"1518"字节. 如果数据很长,则需要分割成多个帧进行发送.
上面提到,以太网数据包的标头包含了发送者和接收者的信息,那么,发送者和接收者是如何标识的呢?
以太网规定,连入网络的所有设备,都必须具有"网卡"接口,数据包必须是从一块网卡传送到另一块网卡.网卡的地址就是数据包的发送地址和接受地址,叫做MAC地址.
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址(其实,MAC地址不是世界独一无二的,只不过遇到重复MAC
地址几率很小很小罢鸟),长度是48个二进制,通常用12个十六进制数表示.
有了MAC地址就可以定位网卡和数据包的路径了.
引出两个问题:
1.一块网卡怎么知道另外一块网卡的MAC地址
ARP协议(后面介绍)
2.就算有了MAC地址,系统到底是如何准确将数据包送到接收方计算机的?
以太网采用广播机制来进行数据包发送.它不是把数据包准确发送到接收方计算机,而是向本网络中所有计算机发送,
让计算机自己判断是否为接收方.
有了数据包的定义(一组电信号为一个数据包,叫做帧.每一帧分为标头和数据,标头包含数据的说明项,如接收者,发送者,
数据类型等,数据则是数据包的具体数据),网卡的MAC地址(每一块网卡在出产之后都有一个唯一的MAC地址),广播的发
送方式(向整个子网络中的所有计算机发送一个数据,计算机自己判断是否为接收方),"链接层"就可以在多台计算机之间
传递数据了.
以太网协议,依靠MAC地址发送数据.理论上,单单依靠MAC地址,长沙的网卡就可以找到洛杉矶的网卡了,技术上是可以
实现的.
但是这样做有几个重大的缺陷:
1.以太网采用广播的方式发送数据,如果在一个子网络中有很多很多计算机的话,那么每一台计算机要一一进行MAC地
址的匹配,这样做的话效率很低.
2.数据的方式和接受都只是在子网络中进行.也就是说如果两台计算机不再同一个子网络,广播是传送不过去的. 这样的
设计是合理的,否则,如果互联网上每一台计算机都会收到整个互联网计算机所发送的包的话,那会引起灾难的.(以后有
可能实现吗?)
由于效率低和只能在同一个子网络中进行传送这两个缺陷,因此需要找到一种方法能够区分哪些MAC地址属于同一个
子网络,哪些不是.如果是同一个子网络则采用广播方式发送,不是,则采用路由方式发送.
MAC地址不能做到上面所说的这点(原因是,MAC地址的定义是厂商定义的,网卡被制作出来后就有MAC地址了,之后被
销往世界各地).这就导致"网络层"的诞生.
网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络.这套地址叫做"网络
地址",简称"网址".
网络地址出现之后,计算机就拥有两种地址,一种是MAC地址,一种是网络地址. 两种地址之间没有任何关系,MAC地址绑
定在网卡上,网络地址则是手动分配.
网络地址帮助我们确定计算机所处的子网络,MAC地址则将数据传送到子网络中的目标网卡.因此,从逻辑上可以
推断,必定是先处理网络地址,再处理MAC地址(先定位,再传送,这个很重要,要记住是先定位,再传送,先解析IP地址,
再解析MAC地址).
2.IP地址
规定网络地址就使用到了IP协议,IP协议所定义的地址就称为IP地址.
目前,广泛采用的是IP协议的第四版,也就是IPv4.这个版本规定,网络地址由32个二进制组成.
例如: 172.16.154.1(10101100.00010000.11111110.00000001)
习惯上,我们分成四段的十进制表示IP地址.从0.0.0.0 到 255.255.255.255.互联网上每一台计算机都会分配到一个IP地
址.
这个地址分成两部分,一部分代表网络,一部分代表主机.
比如,IP地址172.16.25.1 ,这是一个32位的地址,假定它的网络部分是前24位(172.16.25),那么主机部分就是后8位( .1).
处于同一个子网络中的电脑,它们IP地址的网络部分必定是相同的,也就是说 172.16.25.1 应该与 172.16.25.2处在
同一个子网络中.
但是,问题在于单单从IP地址,我们是无法判断网络部分的.无法判断网络部分,就无法判断是否处于同一个子网络中. 例
如,172.16.25.1 这个IP地址,它的网络部分到底是前16位(172.16) 还是前24位(172.16.25)呢? 这个从IP地址上是无法确认
的.
因此,引入了另外一种地址, 这种地址的名称叫"子网掩码"(subnet mask).
所谓的"子网掩码",就是表示网络特征的一个参数. 它在形式上等同于IP地址,也是一个32位的二进制,它的网络部分全
部为1(二进制8个1就是255),主机部分全部为0.
比如,IP地址172.16.25.1 ,如果已知网络部分是前24位,主机部分是后8位,那么子网掩码就是11111111.11111111.1111111
1.00000000,写成十进制就是255.255.255.0
知道了子网掩码,就能判断任意两个IP地址是否处于同一个子网络中.
总结一下:
IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络中.
3.IP数据包
根据IP协议发送的数据叫做IP数据包,在IP数据包中包含IP地址信息.
在发送以太网数据包的时候将IP数据包加入其中.
具体来说IP数据包也分为"标头"和"数据"两个部分:
Head Data
标头部分主要包括版本,长度,IP地址等信息,数据部分则是IP数据包的具体内容.它放进以太网数据包后,以太网数据包就成了这个样子:
Head Head Data
IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度为65535字节.因此,理论上,一个IP数据包的"数据"部分,最长为65515.前面说过,以太网数据包的"数据"部分,最长只有1500字节.因此,如果IP数据包超过1500字节,它就需要分
割成几个以太网数据包,分开发送了.
4.ARP协议
因为IP数据包是放在以太网数据包中发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,一个是对方的IP
地址.通常情况下,对方的IP地址是已知的,MAC地址是未知的(这个原因是不是因为应用层?应用层知道具体需要发
送到哪个计算机上,并且知道这台计算的IP地址?????).
所以我们需要一种机制,能够从IP地址中得到MAC地址.
这里又可以分成两种情况.
第一种情况:如果两台主机不在同一个子网络,那么事实上就没法得到对方的MAC地址(因为以太网数据包是在子网络中
以广播的方式发送的,如果没在同一个子网络,则接受不到广播,也就得不到以太网数据包,也就得不到MAC地址),这种情
况,只能把数据包传送到两个子网络连接处的网关,让网关处理.
第二种情况,如果两台主机在同一个子网络,那么就可以用ARP协议得到对方的MAC地址.
ARP协议也是一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方MAC地址这一栏,填
写的是FF:FF:FF:FF:FF:FF,表示这是一个广播地址.它所在子网络的每一台主机都会收到这个数据包,从中取出IP
地址,与自身的IP地址进行比较.如果两者相同,就做出响应,向对方报告自己的MAC地址,否则丢弃这个包.
有了ARP协议之后,就可以得到一个子网络内的主机的MAC地址,可以把数据发送到任意一台主机之上了.
有了MAC地址,就可以在互联网上任意两台主机建立通信了.
但是,同一台主机上的许多程序都用到网络,当一个数据包从互联网上发来的时候,你知道怎么它表示的是什么程序的数
据?(例如网页和QQ消息)
这时,就引出了"端口"(port)概念,端口是一个参数,表示这个数据包到底是给哪个程序的.
端口其实是对使用了网卡的程序的一个编号.当每个数据包都发送到了主机的特定端口,不同的程序就能获取到自己所需要的数据了.
"端口"是0到65535之间的一个整数,正好是16个二进制. 0 到 1023的端口被系统占用,用户只能选择大于1023的端口.不
管是浏览器还是QQ聊天,应用程序都会随机选用一个端口,然后与服务器的相应端口联系.
"传输层"功能是建立"端口到端口"的通信. 相比之下,"网络层"的功能是建立"主机到主机"的通信.只要确定主机和端口,
我们就能实现程序之间的交流.
Unix系统把主机+端口叫做"套接字"(Socket).有了它,就可以进行网络应用程序开发了.
2.UDP协议
现在,我们必须在数据包中加入端口信息,这就需要新的协议.最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号.
UDP数据包,也由"标头"和"数据"两部分组成.
"标头"部分主要定义了发出端口和接受端口,"数据"部分就是具体的内容.然后把整个UDP数据包放入IP数据包的"数据"部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成这个样子:
HeadHeadHead Data
UDP数据包非常简单,"标头"部分一共只有8个字节,总长度不超过65535字节,正好放进一个数据包中.
3.TCP协议
UDP协议特点是比较简单,容易实现,可靠性差,一旦数据包发出,无法知道对方是否收到.
为了提高网络可靠性,TCP就诞生鸟.这个协议非常复杂,但是可以近似认为,它就是有确认机制的UDP协议,每发出一个数
据包都要求确认.如果一个数据包丢失,就收不到确认,发出方就知道有必要重新发这个数据包了.
因此,TCP协议能够确保数据不会遗失.它的缺点是过程复杂,实现困难,消耗较多的资源.
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分.TCP数据包没有长度限制,理论上可以无限长,但是为
了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,已确保单个TCP数据包不必再分隔.
应用程序收到"传输层"的数据,接下来就要进行解读.由于互联网是开放架构,数据来源五花八门,必须实现规定好格式,否则根本无法解读.
"应用层"的作用就是规定应用程序的数据格式.
举例来说,TCP协议可以为各种各样的程序传递数据,比如Email,WWW,FTP等等. 那么,必须有不同协议规定电子邮件,网 页,FTP数据的格式,这些应用程序协议就构成了"应用层".
这是最高的一层,直接面对用户.他的数据就放在TCP数据包的"数据部分".因此,现在的以太网数据包就变成了下面这样.
Head Head Head Data
<-------> <------> <------> <------------------->
以太网 IP TCP 应用层
标头 标头 标头 数据包