计算机网络

1.互联网协议入门

我们每天使用互联网,你是否想过,它是如何实现的?

  全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?

  互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。

  下面就是我的学习笔记。因为这些协议实在太复杂、太庞大,我想整理一个简洁的框架,帮助自己从总体上把握它们。为了保证简单易懂,我做了大量的简化,有些地方并不全面和精确,但是应该能够说清楚互联网的原理。

=================================================

互联网协议入门

  作者:阮一峰

一、概述

1. 1 五层模型

  互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。

  用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。

  如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释。

  如上图所示,最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做"应用层"(Application Layer),中间的三层(自下而上)分别是"链接层"(Link Layer)、"网络层"(Network Layer)和"传输层"(Transport Layer)。越下面的层,越靠近硬件;越上面的层,越靠近用户。

  它们叫什么名字,其实并不重要。只需要知道,互联网分成若干层就可以了。

1. 2 层与协议

  每一层都是为了完成一种功能。为了实现这些功能,就需要大家都遵守共同的规则。

  大家都遵守的规则,就叫做"协议"(protocol)。

  互联网的每一层,都定义了很多协议。这些协议的总称,就叫做"互联网协议"(Internet Protocol Suite)。它们是互联网的核心,下面介绍每一层的功能,主要就是介绍每一层的主要协议。

二、实体层

  我们从最底下的一层开始。

  电脑要组网,第一件事要干什么?当然是先把电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式。

这就叫做"实体层",它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送 0 和 1 的电信号。

三、链接层

3. 1 定义

  单纯的 0 和 1 没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?

这就是"链接层"的功能,它在"实体层"的上方,确定了 0 和 1 的分组方式。

3. 2 以太网协议

  早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做"以太网"(Ethernet)的协议,占据了主导地位。

  以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。

"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;"数据"则是数据包的具体内容。

"标头"的长度,固定为 18 字节。"数据"的长度,最短为 46 字节,最长为 1500 字节。因此,整个"帧"最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。

3. 3 MAC 地址

  上面提到,以太网数据包的"标头",包含了发送者和接受者的信息。那么,发送者和接受者是如何标识呢?

  以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做 MAC 地址。

  每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。

  前 6 个十六进制数是厂商编号,后 6 个是该厂商的网卡流水号。有了 MAC 地址,就可以定位网卡和数据包的路径了。

3. 4 广播

  定义地址只是第一步,后面还有更多的步骤。

  首先,一块网卡怎么会知道另一块网卡的 MAC 地址?

  回答是有一种 ARP 协议,可以解决这个问题。这个留到后面介绍,这里只需要知道,以太网数据包必须知道接收方的 MAC 地址,然后才能发送。

  其次,就算有了 MAC 地址,系统怎样才能把数据包准确送到接收方?

  回答是以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。

  上图中,1号计算机向 2 号计算机发送一个数据包,同一个子网络的 3 号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的 MAC 地址,然后与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。

  有了数据包的定义、网卡的 MAC 地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

四、网络层

4. 1 网络层的由来

  以太网协议,依靠 MAC 地址发送数据。理论上,单单依靠 MAC 地址,上海的网卡就可以找到洛杉矶的网卡了,技术上是可以实现的。

  但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一"包",不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。

  互联网是无数子网络共同组成的一个巨型网络,很像想象上海和洛杉矶的电脑会在同一个子网络,这几乎是不可能的。

  因此,必须找到一种方法,能够区分哪些 MAC 地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。("路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC 地址本身无法做到这一点。它只与厂商有关,与所处网络无关。

这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。

  于是,"网络层"出现以后,每台计算机有了两种地址,一种是 MAC 地址,另一种是网络地址。两种地址之间没有任何联系,MAC 地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

  网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。

4. 2 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 地址,另一个是确定哪些地址在同一个子网络。

4. 3 IP 数据包

  根据 IP 协议发送的数据,就叫做 IP 数据包。不难想象,其中必定包括 IP 地址信息。

  但是前面说过,以太网数据包只包含 MAC 地址,并没有 IP 地址的栏位。那么是否需要修改数据定义,再添加一个栏位呢?

  回答是不需要,我们可以把 IP 数据包直接放进以太网数据包的"数据"部分,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。

  具体来说,IP 数据包也分为"标头"和"数据"两个部分。

"标头"部分主要包括版本、长度、IP 地址等信息,"数据"部分则是 IP 数据包的具体内容。它放进以太网数据包后,以太网数据包就变成了下面这样。

IP 数据包的"标头"部分的长度为 20 到 60 字节,整个数据包的总长度最大为 65,535字节。因此,理论上,一个 IP 数据包的"数据"部分,最长为 65,515字节。前面说过,以太网数据包的"数据"部分,最长只有 1500 字节。因此,如果 IP 数据包超过了 1500 字节,它就需要分割成几个以太网数据包,分开发送了。

4. 4 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 地址,可以把数据包发送到任意一台主机之上了。

五、传输层

5. 1 传输层的由来

  有了 MAC 地址和 IP 地址,我们已经可以在互联网上任意两台主机上建立通信。

  接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

  也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

"端口"是 0 到 65535 之间的一个整数,正好 16 个二进制位。0到 1023 的端口被系统占用,用户只能选用大于 1023 的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix 系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

5. 2 UDP 协议

  现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做 UDP 协议,它的格式几乎就是在数据前面,加上端口号。

UDP 数据包,也是由"标头"和"数据"两部分组成。

"标头"部分主要定义了发出端口和接收端口,"数据"部分就是具体的内容。然后,把整个 UDP 数据包放入 IP 数据包的"数据"部分,而前面说过,IP 数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

UDP 数据包非常简单,"标头"部分一共只有 8 个字节,总长度不超过 65,535字节,正好放进一个 IP 数据包。

5. 3 TCP 协议

UDP 协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。

  为了解决这个问题,提高网络可靠性,TCP 协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的 UDP 协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

  因此,TCP 协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。

TCP 数据包和 UDP 数据包一样,都是内嵌在 IP 数据包的"数据"部分。TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。

六、应用层

  应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。

"应用层"的作用,就是规定应用程序的数据格式。

  举例来说,TCP 协议可以为各种各样的程序传递数据,比如 Email、WWW、FTP 等等。那么,必须有不同协议规定电子邮件、网页、FTP 数据的格式,这些应用程序协议就构成了"应用层"。

  这是最高的一层,直接面对用户。它的数据就放在 TCP 数据包的"数据"部分。因此,现在的以太网的数据包就变成下面这样。

  至此,整个互联网的五层结构,自下而上全部讲完了。这是从系统的角度,解释互联网是如何构成的。下一次,我反过来,从用户的角度,自上而下看看这个结构是如何发挥作用,完成一次网络数据交换的。

七、一个小结

  先对前面的内容,做一个小结。

  我们已经知道,网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:

  发送这个包,需要知道两个地址:

对方的 MAC 地址

对方的 IP 地址

  有了这两个地址,数据包才能准确送到接收者手中。但是,前面说过,MAC 地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的 MAC 地址,必须通过网关(gateway)转发。

  上图中,1号电脑要向 4 号电脑发送一个数据包。它先判断 4 号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现 4 号电脑位于子网络B,又把数据包发给网关B,网关B再转发到 4 号电脑。

1号电脑把数据包发到网关A,必须知道网关A的 MAC 地址。所以,数据包的目标地址,实际上分成两种情况:

场景

数据包地址

同一个子网络

对方的 MAC 地址,对方的 IP 地址

非同一个子网络

网关的 MAC 地址,对方的 IP 地址

  发送数据包之前,电脑必须判断对方是否在同一个子网络,然后选择相应的 MAC 地址。接下来,我们就来看,实际使用中,这个过程是怎么完成的。

八、用户的上网设置

8. 1 静态 IP 地址

  你买了一台新电脑,插上网线,开机,这时电脑能够上网吗?

  通常你必须做一些设置。有时,管理员(或者 ISP)会告诉你下面四个参数,你把它们填入操作系统,计算机就能连上网了:

本机的 IP 地址

子网掩码

网关的 IP 地址

DNS 的 IP 地址

  下图是 Windows 系统的设置窗口。

  这四个参数缺一不可,后文会解释为什么需要知道它们才能上网。由于它们是给定的,计算机每次开机,都会分到同样的 IP 地址,所以这种情况被称作"静态 IP 地址上网"。

  但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的 IP 地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用"动态 IP 地址上网"。

8. 2 动态 IP 地址

  所谓"动态 IP 地址",指计算机开机后,会自动分配到一个 IP 地址,不用人为设定。它使用的协议叫做 DHCP 协议。

  这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有 IP 地址,它叫做"DHCP 服务器"。新的计算机加入网络,必须向"DHCP 服务器"发送一个"DHCP 请求"数据包,申请 IP 地址和相关的网络参数。

  前面说过,如果两台计算机在同一个子网络,必须知道对方的 MAC 地址和 IP 地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP 协议做了一些巧妙的规定。

8. 3 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,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的 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 服务器等等参数。

8. 4 上网设置:小结

  这个部分,需要记住的就是一点:不管是"静态 IP 地址"还是"动态 IP 地址",电脑上网的首要步骤,是确定四个参数。这四个值很重要,值得重复一遍:

本机的 IP 地址

子网掩码

网关的 IP 地址

DNS 的 IP 地址

  有了这几个数值,电脑就可以上网"冲浪"了。接下来,我们来看一个实例,当用户访问网页的时候,互联网协议是怎么运作的。

九、一个实例:访问网页

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 发送一个网页请求的数据包。

9. 2 DNS 协议

  我们知道,发送数据包,必须要知道对方的 IP 地址。但是,现在,我们只知道网址 www.google.com,不知道它的 IP 地址。

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,否则为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 部分的内容,类似于下面这样:

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 数据包之中。

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 协议得到)。

  以太网数据包的数据部分,最大长度为 1500 字节,而现在的 IP 数据包长度为 5000 字节。因此,IP 数据包必须分割成四个包。因为每个包都有自己的 IP 标头(20字节),所以四个包的 IP 数据包的长度分别为 1500、1500、1500、560。

9. 8 服务器端响应

  经过多个网关的转发,Google 的服务器 172.194.72.105,收到了这四个以太网数据包。

  根据 IP 标头的序号,Google 将四个包拼起来,取出完整的 TCP 数据包,然后读出里面的"HTTP 请求",接着做出"HTTP 响应",再用 TCP 协议发回来。

  本机收到 HTTP 响应以后,就可以将网页显示出来,完成一次网络通信。

  这个例子就到此为止,虽然经过了简化,但它大致上反映了互联网协议的整个通信过程。

2.计算机网络

接下来,我们介绍一些基础网络知识。

OSI参考模型

  一上来就是OSI七层参考模型,是不是有点晕?如果是,那先阅读文章开头推荐的那两篇文章吧!

  第7层:应用层(ApplicationLayer)

  应用层能与应用程序界面沟通,以达到展示给用户的目的。在此常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。

  第6层:表示层(PresentationLayer)

  表示层能为不同的客户端提供数据和信息的语法转换内码,使系统能解读成正确的数据。同时,也能提供压缩解压、加密解密。

  第5层:会话层(SessionLayer)

  会话层用于为通信双方制定通信方式,并创建、注销会话(双方通信)。

  第4层:传输层(TransportLayer)

  传输层用于控制数据流量,并且进行调试及错误处理,以确保通信顺利。而发送端的传输层会为分组加上序号,方便接收端把分组重组为有用的数据或文件。

  第3层:网络层(NetworkLayer)

  网络层的作用是决定如何将发送方的数据传到接收方。该层通过考虑网络拥塞程度、服务质量、发送优先权、每次路由的耗费来决定节点X到节点Y的最佳路径。我们熟知的路由器就工作在这一层,通过不断的接收与传送数据使得网络变得相互联通。

  第2层:数据链路层(DatalinkLayer)

  首先数据链路层的功能在于管理第一层的比特数据,并且将正确的数据发送到没有传输错误的路线中。创建还有辨认数据开始以及退出的位置同时予以标记。另外,就是处理由数据受损、丢失甚至重复传输错误的问题,使后续的层级不会受到影响,所以它运行数据的调试、重传或修正,还有决定设备何时进行传输。设备有:Bridge桥接器switch交换器

  第1层:物理层(PhysicalLayer)

  物理层定义了所有电子及物理设备的规范。其中特别定义了设备与物理媒介之间的关系,这包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器(在SAN中使用的主机适配器)以及其他的设备的设计定义。因为物理层传送的是原始的比特数据流,即设计的目的是为了保证当发送时的信号为二进制“1”时,对方接收到的也是二进制“1”而不是二进制“0”。因而就需要定义哪个设备有几个针脚,其中哪个针脚发送的多少电压代表二进制“1”或二进制“0”,还有例如一个bit需要持续几微秒,传输信号是否在双向上同时进行,最初的连接如何创建和最终如何终止等问题。

  为了更好理解物理层与数据链路层之间的区别,可以把物理层认为是主要的,是与某个单一设备与传输媒介之间的交互有关,而数据链路层则更多地关注使用同一个通讯媒介的多个设备(例如,至少两个设备)之间的互动。物理层的作用是告诉某个设备如何传送信号至一个通讯媒介,以及另外一个设备如何接收这个信号(大多数情况下它并不会告诉设备如何与通讯媒介相连接)。有些过时的物理层标准如RS-232倒是的确使用物理线缆来控制通讯媒介的接入。

  物理层的主要功能和提供的服务如下:

· 在设备与传输媒介之间创建及终止连接。

· 参与通讯过程使得资源可以在共享的多用户中有效分配。例如,冲突解决机制和流量控制。

· 对信号进行调制或转换使得用户设备中的数字信号定义能与信道上实际传送的数字信号相匹配。这些信号可以经由物理线缆(例如铜缆和光缆)或是无线信道传送。

TCP/IP的5层模型

  相比于OSI的七层模型,更常用的是TCP/IP的5层模型。TCP/IP的5层模型是将ISO的七层模型的应用层、表示层、会话层合并为应用层,得到如下图所示的五层模型:

TCP/IP通信的三次握手、四次挥手

  三次握手:

  第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

  第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

  与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。

  第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

  第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
  第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
  第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

  戏说TCP/IP状态转化图

TCP/IP协议是计算机网络中的一个协议族,也是网络编程中的重头戏!理解TCP/IP状态转化图,对理解TCP/IP协议的工作过程异常重要。

  如下图所示,描述了一个状态机到另一个状态机的转变,已经触发这种状态转变的条件。

  状态图详细说明如下:

1.CLOSED:起始点,在超时或者连接关闭时候进入此状态。

2.LISTEN:svr端在等待连接过来时候的状态,svr端为此要调用socket,bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。

3.SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接,则直接进入CLOSED状态。

4.SYN_RCVD:跟3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN_RCVD状态。同时服务器端要回应一个ACK,同时发送一个SYN给客户端;另外一种情况,客户端在发起SYN的同时接收到服务器端得SYN请求,客户端就会由SYN_SENT到SYN_RCVD状态。

5.ESTABLISHED:服务器端和客户端在完成3次握手进入状态,说明已经可以开始传输数据了。

  以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了,如果你对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。

  下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行4次双方的交互,还包括要处理一些善后工作(TIME_WAIT状态),注意,这里主动关闭的一方或被动关闭的一方不是指特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:

6.FIN_WAIT_1:主动关闭的一方,由状态5进入此状态。具体的动作是发送FIN给对方。

7.FIN_WAIT_2:主动关闭的一方,接收到对方的FIN-ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据。

8.CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作是接收到FIN,同时发送ACK。

9.LAST_ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作是发送FIN给对方,同时在接收到ACK时进入CLOSED状态。

10.CLOSING:两边同时发起关闭请求时,会由FIN_WAIT_1进入此状态。具体动作是接收到FIN请求,同时响应一个ACK。

11.TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有3个状态可以转化成它,我们一一来分析:

a.由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。

b.由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。

c.由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与b的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而b是FIN先到达。这种情况概率最小。

  关闭的4次连接最难理解的状态是TIME_WAIT,存在TIME_WAIT的2个理由:

1.可靠地实现TCP全双工连接的终止。

2.允许老的重复分节在网络中消逝。

MAC地址的概念及其作用

MAC地址(MediaAccessControlAddress),媒体访问控制地址,或称为物理地址,是用来定义网络设备的位置的。在OSI模型中,第三层网络层负责IP地址,第二层数据链结层则负责MAC地址。一个主机会有一个IP地址,而每个网络位置会有一个专属于它的MAC地址。

ARP协议的用途及其工作原理

  地址解析协议AddressResolutionProtocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。

  在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的,如下表所示。

主机名称

IP地址

MAC地址

A

192.168.38.10

00-AA-00-62-D2-02

B

192.168.38.11

00-BB-00-62-C2-02

C

192.168.38.12

00-CC-00-62-C2-02

D

192.168.38.13

00-DD-00-62-C2-02

E

192.168.38.14

00-EE-00-62-C2-02

  以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址为(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播(ARPrequest),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应(ARPresponse):“192.168.38.11的MAC地址是(00-BB-00-62-C2-02)”。

  这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

  了解交换机、路由器、网关的概念,并知道各自的用途

1)交换机

  在计算机网络系统中,交换机是针对共享工作模式的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条背部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口。目的MAC若不存在,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。

  交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。

  交换机被广泛应用于二层网络交换,俗称“二层交换机”。

  交换机的种类有:二层交换机、三层交换机、四层交换机、七层交换机分别工作在OSI七层模型中的第二层、第三层、第四层盒第七层,并因此而得名。

2)路由器

  路由器Router)是一种计算机网络设备,提供了路由与转送两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在OSI模型的第三层——即网络层,例如网际协议。

  路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。

3)网关

  网关(Gateway),网关顾名思义就是连接两个网络的设备,区别于路由器(由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器(Router)称为网关,在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP),经常在家庭中或者小型企业网络中使用,用于连接局域网和Internet。网关也经常指把一种协议转成另一种协议的设备,比如语音网关。

  在传统TCP/IP术语中,网络设备只分成两种,一种为网关(gateway),另一种为主机(host)。网关能在网络间转递数据包,但主机不能转送数据包。在主机(又称终端系统,endsystem)中,数据包需经过TCP/IP四层协议处理,但是在网关(又称中介系统,intermediatesystem)只需要到达网际层(Internetlayer),决定路径之后就可以转送。在当时,网关(gateway)与路由器(router)还没有区别。

  在现代网络术语中,网关(gateway)与路由器(router)的定义不同。网关(gateway)能在不同协议间移动数据,而路由器(router)是在不同网络间移动数据,相当于传统所说的IP网关(IPgateway)。

网关是连接两个网络的设备,对于语音网关来说,他可以连接PSTN网络和以太网,这就相当于VOIP,把不同电话中的模拟信号通过网关而转换成数字信号,而且加入协议再去传输。在到了接收端的时候再通过网关还原成模拟的电话信号,最后才能在电话机上听到。

  对于以太网中的网关只能转发三层以上数据包,这一点和路由是一样的。而不同的是网关中并没有路由表,他只能按照预先设定的不同网段来进行转发。网关最重要的一点就是端口映射,子网内用户在外网看来只是外网的IP地址对应着不同的端口,这样看来就会保护子网内的用户。

  初识路由表

  路由表(routingtable)或称路由择域信息库(、RoutingInformationBase),是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。

  路由表使用了和利用地图投递包裹相似的思想。只要网络上的一个节点需要发送数据给网络上的另一个节点,它就必须要知道把数据发送到哪。设备不可能直接连接到目的节点,它需要找到另一个方式去发送数据包。在局域网中,节点也不知道如何发送IP包到网关。将数据包发到正确的地址是一个复杂的任务,网关需要记录发送数据包的路径信息。路由表就存储着这样的路径信息,就如地图一样,是一个记录路径信息,并为需要这些信息的节点提供服务的数据库。

  如下图所示为一张路由表:

  路由表参数说明:

Destination:目的网段
mask:子网掩码
interface:到达该目的地的本路由器的出口ip
gateway:下一跳路由器入口的ip,路由器通过interface和gateway定义一调到下一个路由器的链路,通常情况下,interface和gateway是同一网段的
metric:跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由

MTU

  最大传输单元(MaximumTransmissionUnit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

  因特网协议允许IP分片,这样就可以将数据包分成足够小的片段以通过那些最大传输单元小于该数据包原始大小的链路了。这一分片过程发生在网络层(OSI模型的第三层),第四层为传输层,传输层是OSI模型中最重要的一层,这里是根据窗口控制传输,而非MTU。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。

  除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如,以太网无法接收大于1500字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组,该过程即被称为排序。它使用的是将分组发送到链路上的网络接口的最大传输单元的值。

  以太网MTU值为1500字节

RIP、OSPF、BGP认识

  路由信息协议(RoutingInformationProtocol,RIP)是一种使用最广泛的内部网关协议(IGP)。(IGP)是在内部网络上使用的路由协议(在少数情形下,也可以用于连接到因特网的网络),它可以通过不断的交换信息让路由器动态的适应网络连接的变化,这些信息包括每个路由器可以到达哪些网络,这些网络有多远等,RIP属于网络层。

  开放式最短路径优先(OpenShortestPathFirst,OSPF)是对链路状态路由协议的一种实现,是大中型网络上使用最为广泛的IGP(InteriorGatewayProtocol)协议,运作于自治系统内部。著名的迪克斯加算法被用来计算最短路径树。它使用“代价(Cost)”作为路由度量。链路状态数据库(LSDB)用来保存当前网络拓扑结构,它在同一区域中的所有路由器上是相同的。

BGP(边界网关协议,BorderGatewayProtocol)是自治系统之间的路由选择协议,是互联网上一个核心的去中心化自治路由协议。

BGP是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。BGP构建在EGP的经验之上。BGP系统的主要功能是和其他的BGP系统交换网络可达信息。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了AS互联的拓朴图并由此清除了路由环路,同时在AS级别上可实施策略决策。

DNS

DNS(DomainNameSystem,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

TCP、UDP和HTTP区别于联系

TCP/IP协议是一个协议簇,这个协议簇中包含了很多种协议,TCP、UDP和HTTP只是TCP/IP协议簇的成员。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。

1)TCP/IP协议簇,大致可分为三个层次:网络层、传输层和应用层。
  在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
  在传输层中有TCP协议与UDP协议。
  在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
HTTP也是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

2)HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。
  另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。

3)虽然HTTP本身是一个协议,但其最终还是基于TCP的。目前,有人正在研究基于TCP+UDP混合的HTTP协议。

  在浏览器中输入一个网站后,都发生了什么

  详细参见:互联网协议入门(二)

  以上讲述了一些计算机网络相关的术语,概念,当然,一切才刚刚开始。

  如果,你需要了解更多。我可以很负责任的告诉你:以下链接是你更深入的了解计算机网络工作机制的最佳资源,是被奉为圣经的《TCP-IP详解-卷I》一书的精华内容,出自vamei君。

TCP-IP协议详解(1)邮差与邮局 (网络协议概观)

TCP-IP协议详解(2) 小喇叭开始广播 (以太网与WiFi协议)

TCP-IP协议详解(3) IP接力赛(IP, ARP, RIP和BGP协议)

TCP-IP协议详解(4)地址耗尽危机(IPv4与IPv6地址)

TCP-IP协议详解(5) 我尽力(IP协议详解)

TCP-IP协议详解(6) 瑞士军刀 (ICMP协议)

TCP-IP协议详解(7) 傀儡(UDP协议)

TCP-IP协议详解(8) 不放弃 (TCP协议与流通信)

TCP-IP协议详解(9) 爱的传声筒(TCP连接)

TCP-IP协议详解(10) 魔鬼细节 (TCP滑窗管理)

TCP-IP协议详解(11) 涅槃 (TCP重新发送)

TCP-IP协议详解(12) 天下为公(TCP堵塞控制)

TCP-IP协议详解(13) 9527(DNS协议)

TCP-IP协议详解(14) 逆袭(CIDR与NAT)

TCP-IP协议详解(15) 先生,要点单吗?(HTTP协议概览)

  如果上述文章的知识都有所了解,那么原理性的东西我们差不多都似懂非懂了。接下来,我们需要的是实战。恩,接下来实现一下如下的网络程序吧。

1、实现一个简单的一问一答的服务器/客户机模型。

2、用多进程/线程的方式实现一个服务器同时为多个客户端服务的程序(阻塞式的网络程序)。

3、实现一个基于事件驱动的服务器网络程序(如Linux epoll)(异步非阻塞网络程序)。

  如果以上事情都做完了,接下来,精彩继续!在Nginx风靡全球之际,每个人都难免好奇,去一探究竟。下面是几个相当好的学习Nginx的精华文章汇总!

Nginx学习资源汇总

  最后,计算机网络相关的两篇不该错过的好文章:

TCP 的那些事儿(上)

TCP 的那些事儿(下)

一个文档读懂计算机网络相关推荐

  1. 一文深入浅出读懂NoSQL

    一文深入浅出读懂NoSQL 2016-11-25 Runoot.com ICT架构师技术交流 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".在现 ...

  2. 阿里某员工哀叹:头条的文档太混乱!阿里的文档读起来舒服!

    又到了一年一度的毕业季,大家都准备好了吗? 一位实习生说:在头条和阿里都实习了一段时间,最大的感受是头条的文档太混乱,对新人属实不太友好.而阿里的中间件团队是真的牛逼,文档读起来很舒服,不但告诉你怎么 ...

  3. 一文彻底读懂物联网关键技术之——ZigBee!

    一文彻底读懂物联网关键技术之--ZigBee! 本文采用问答形式向你详细地介绍了方方面面,不夸口的说,你所需要知道的关于 ZigBee的一切,在这里基本可以了解到! 在智能硬件和物联网领域,时下大名鼎 ...

  4. 从一个文档复制粘贴到另一个文档时把ndnote插入的参考文献也复制过去

    从一个文档复制粘贴到另一个文档时把endnote插入的参考文献也复制过去 之前我因为自己已经写好一小篇文章,想把部分内容直接复制粘贴到自己的论文中去,结果发现参考文献没有跟着进去,就在网上找了各种方法 ...

  5. HTTP/1.1规范[RFC文档(2616)]【计算机网络】

    转自:http://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善. ...

  6. Java:多个文档合并输出到一个文档

    多个文档合并输出到一个文档 方法:Java NIO package First;import java.io.File; import java.io.FileInputStream; import ...

  7. SAP CV02N 审批一个文档

    SAP CV02N 审批一个文档 在质量通知单里,我们有一个ZN1 type 的附件文档10000000000002284. 根据系统设置,该文档需要经过审批.在SAP系统上审批一个附件文档,需要使用 ...

  8. WORD2007只可以打开一个文档,且打开后文本有时出现不可 编辑情况

    Word2007打开一个文档后,想再打开另一个文档,你双击它却没反应,打不开,也就是说只能打开一个文档,第二个是打不开了,而且有时鼠标不能对文档中文本进行选中编辑操作 卸载过原来的版本,重新安装,问题 ...

  9. ElasticSearch什么是文档?索引一个文档

    什么是文档? 程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串.数字.布尔类型.另一个对象. ...

最新文章

  1. Python开发编码规范(转)
  2. (数据结构与算法)递归及一些经典递归问题
  3. 【Python】这10个Python性能调优的小技巧,你知道几个?
  4. Set的常用实现类HashSet和TreeSet
  5. count函数里加函数_PHP count()函数与示例
  6. tensorflow2.0 图像处理项目_航天泰坦丨国产自主遥感图像处理软件当自强
  7. 《Unity虚拟现实开发实战》——第1章,第1.1节虚拟现实对你来说意味着什么
  8. 单元在整体坐标系下的刚度矩阵
  9. Pygame教程系列一:快速入门篇
  10. python教程视频全套下载-Python爬虫视频教程全集下载
  11. 计算机开机后无法正常显示桌面图标,电脑开机后不显示桌面图标怎么办
  12. 洛谷-3803 【模板】多项式乘法(FFT,NNT)
  13. 微信小程序getUserInfo返回拼音的解决办法
  14. 各主板黑苹果dsdt补丁_关于B75主板的DSDT警告修改和睡眠相关修改
  15. 关于Android import-module 和NDK_MODULE_PATH
  16. 每日一问-ChapGPT-20221231-关于中医的各国看法
  17. linux信号11sigtstp,Linux信号(signal)机制
  18. Node 之 nvm 下载、安装、使用,以及node 、nrm 的相关使用
  19. xss-labs通关大详解
  20. 关于CentOS7搭建ELK集群遇到的问题及解决办法

热门文章

  1. PIC单片机延时问题
  2. suparc服务器没信号,SupARC对战平台新手上手教程
  3. Office系列版本安装包下载
  4. ViewPager 添加广告页面小圆点指示器效果
  5. 泉州php编程学校,泉州五中校园网络平台【Moodle平台与校园网络整合】...
  6. 把荷花照片调成古典工笔画的PS方法
  7. 期货十三篇 第七篇 平仓篇
  8. 中国图书分类号-自动化_计算机
  9. Jetson Nano主板的五种联网方法
  10. 使用字典统计不同班级的成绩(d.get()函数的灵活应用)