csdn_spider/blog/ds19991999/转载-- 互联网协议入门.md

181 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 转载
互联网协议入门
# 互联网协议入门
互联网的核心是一系列协议总称为”互联网协议”Internet Protocol Suite。它们对电脑如何连接和组网做出了详尽的规定。理解了这些协议就理解了互联网的原理。
### 概述
#### 五层模型
互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。
用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。
如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释。 <br/> <img alt="" src="https://raw.githubusercontent.com/ds19991999/githubimg/master/picgo/20180821220910.png" title=""/> <br/> 如上图所示最底下的一层叫做”实体层”Physical Layer最上面的一层叫做”应用层”Application Layer中间的三层自下而上分别是”链接层”Link Layer、”网络层”Network Layer和”传输层”Transport Layer。越下面的层越靠近硬件越上面的层越靠近用户。
#### 层与协议
每一层都是为了完成一种功能。为了实现这些功能就需要大家都遵守共同的规则。大家都遵守的规则就叫做”协议”protocol
互联网的每一层都定义了很多协议。这些协议的总称就叫做”互联网协议”Internet Protocol Suite。它们是互联网的核心下面介绍每一层的功能主要就是介绍每一层的主要协议。
### 实体层(物理层)
电脑要组网,第一件事要干什么?当然是先把电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式。
这就叫做”实体层”它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性作用是负责传送0和1的电信号。
### 链接层
#### 定义
单纯的0和1没有任何意义必须规定解读方式多少个电信号算一组每个信号位有何意义这就是”链接层”的功能它在”实体层”的上方确定了0和1的**分组方式。**
#### 以太网协议
早期的时候每家公司都有自己的电信号分组方式。逐渐地一种叫做”以太网”Ethernet的协议占据了主导地位。
以太网规定一组电信号构成一个数据包叫做”帧”Frame。每一帧分成两个部分标头Head和数据Data
“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容。
“标头”的长度固定为18字节。”数据”的长度最短为46字节最长为1500字节。因此整个”帧”最短为64字节最长为1518字节。如果数据很长就必须分割成多个帧进行发送。
#### MAC地址
上面提到,以太网数据包的”标头”,包含了发送者和接受者的信息。那么,发送者和接受者是如何标识呢?
以太网规定,连入网络的所有设备,都必须具有**“网卡”接口**。数据包必须是从一块网卡,传送到另一块网卡。**网卡的地址就是数据包的发送地址和接收地址这叫做MAC地址。**
每块网卡出厂的时候,都有一个**全世界独一无二的MAC地址**长度是48个二进制位通常用**12个十六进制数表示**。
**前6个十六进制数是厂商编号后6个是该厂商的网卡流水号。有了MAC地址就可以定位网卡和数据包的路径了。**
#### 广播
定义地址只是第一步,后面还有更多的步骤。
首先一块网卡怎么会知道另一块网卡的MAC地址
回答是有一种ARP协议可以解决这个问题。以太网数据包必须知道接收方的MAC地址然后才能发送。
其次就算有了MAC地址系统怎样才能把数据包准确送到接收方
回答是以太网采用了一种很”原始”的方式,**它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。**
上图中1号计算机向2号计算机发送一个数据包同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的”标头”找到接收方的MAC地址然后与自身的MAC地址相比较如果两者相同就接受这个包做进一步处理否则就丢弃这个包。这种发送方式就叫做”广播”broadcasting
有了**数据包的定义、网卡的MAC地址、广播的发送方式**,”链接层”就可以在多台计算机之间传送数据了。
### 网络层
#### 网络层的由来
以太网协议依靠MAC地址发送数据。理论上单单依靠MAC地址上海的网卡就可以找到洛杉矶的网卡了技术上是可以实现的。
但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一”包”,不仅效率低,而且局限在发送者所在的子网络。**也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。**
因此必须找到一种方法能够区分哪些MAC地址属于同一个子网络哪些不是。**如果是同一个子网络,就采用广播方式发送,否则就采用”路由”方式发送。**(”路由”的意思,就是指**如何向不同的子网络分发数据包**遗憾的是MAC地址本身无法做到这一点。它只与厂商有关与所处网络无关。
这就导致了”网络层”的诞生。它的作用是**引进一套新的地址**,使得我们能够区分不同的计算机是否属于同一个子网络。**这套地址就叫做”网络地址”,简称”网址”。**
于是”网络层”出现以后每台计算机有了两种地址一种是MAC地址另一种是网络地址。两种地址之间没有任何联系MAC地址是绑定在网卡上的网络地址则是管理员分配的它们只是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络MAC地址则将数据包送到该子网络中的目标网卡。因此从逻辑上可以推断必定是先处理网络地址然后再处理MAC地址。
#### IP协议
**规定网络地址的协议叫做IP协议**。它所定义的地址就被称为IP地址。
目前广泛采用的是IP协议第四版简称IPv4。这个版本规定网络地址由**32个二进制位组成。**
习惯上,我们用分成**四段的十进制数表示IP地址**从0.0.0.0一直到255.255.255.255。
互联网上的每一台计算机都会分配到一个IP地址。这个地址分成两个部分**前一部分代表网络,后一部分代表主机。**比如IP地址172.16.254.1这是一个32位的地址假定它的网络部分是**前24位172.16.254那么主机部分就是后8位最后的那个1**。处于同一个子网络的电脑它们IP地址的网络部分必定是相同的也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。
但是,问题在于**单单从IP地址我们无法判断网络部分**。还是以172.16.254.1为例它的网络部分到底是前24位还是前16位甚至前28位从IP地址上是看不出来的。
那么怎样才能从IP地址判断两台计算机是否属于同一个子网络呢这就要用到另一个参数**“子网掩码”subnet mask**。
所谓”子网掩码”,就是**表示子网络特征的一个参数**。它在形式上等同于IP地址也是一个32位二进制数字它的网络部分全部为1主机部分全部为0。比如IP地址172.16.254.1如果已知网络部分是前24位主机部分是后8位那么子网络掩码就是11111111.11111111.11111111.00000000写成十进制就是255.255.255.0。
知道”子网掩码”我们就能判断任意两个IP地址是否处在同一个子网络。方法是将**两个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协议发送的数据就叫做IP数据包。不难想象其中必定包括IP地址信息。
但是前面说过以太网数据包只包含MAC地址并没有IP地址的栏位。那么是否需要修改数据定义再添加一个栏位呢
回答是不需要,我们可以把**IP数据包直接放进以太网数据包的”数据”部分**,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。
具体来说IP数据包也分为”标头”和”数据”两个部分。
**“标头”部分主要包括版本、长度、IP地址等信息”数据”部分则是IP数据包的具体内容。**它放进以太网数据包后,以太网数据包就变成了下面这样。
#### ARP协议
因为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地址可以把数据包发送到任意一台主机之上了。**
#### 传输层
#### 传输层的由来
有了MAC地址和IP地址我们已经可以在互联网上任意两台主机上建立通信。
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?
也就是说,我们还**需要一个参数表示这个数据包到底供哪个程序进程使用。这个参数就叫做”端口”port**,它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口”是0到65535之间的一个整数正好**16个二进制位。0到1023的端口被系统占用用户只能选用大于1023的端口**。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
“传输层”的功能,就是建立**“端口到端口”的通信**。相比之下,”网络层”的功能是建立**“主机到主机”的通信**。只要确定主机和端口我们就能实现程序之间的交流。因此Unix系统就把**主机+端口叫做”套接字”socket**。有了它,就可以进行网络应用程序开发了。
#### UDP协议
现在我们必须在数据包中加入端口信息这就需要新的协议。最简单的实现叫做UDP协议它的格式几乎就是在数据前面加上端口号。
UDP数据包也是由”标头”和”数据”两部分组成。
“标头”部分主要定义了发出端口和接收端口”数据”部分就是具体的内容。然后把整个UDP数据包放入IP数据包的**“数据”部分**而前面说过IP数据包又是放在以太网数据包之中的所以整个以太网数据包现在变成了下面这样
UDP数据包非常简单”标头”部分一共只有8个字节总长度不超过65,535字节正好放进一个IP数据包。
#### TCP协议
UDP协议的优点是比较简单容易实现但是缺点是可靠性较差一旦数据包发出无法知道对方是否收到。
为了解决这个问题提高网络可靠性TCP协议就诞生了。这个协议非常复杂但可以近似认为它就是有确认机制的UDP协议每发出一个数据包都要求确认。如果有一个数据包遗失就收不到确认发出方就知道有必要重发这个数据包了。
因此TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样都是内嵌在IP数据包的”数据”部分。TCP数据包没有长度限制理论上可以无限长但是为了保证网络的效率通常TCP数据包的长度不会超过IP数据包的长度以确保单个TCP数据包不必再分割。
### 应用层
应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。
**“应用层”的作用,就是规定应用程序的数据格式。**
举例来说TCP协议可以为各种各样的程序传递数据比如Email、WWW、FTP等等。那么必须有不同协议规定电子邮件、网页、FTP数据的格式这些应用程序协议就构成了”应用层”。
这是最高的一层直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此现在的以太网的数据包就变成下面这样。
>
来源:[互联网入门协议](https://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)