CentOS 7服务器搭建实战(一)

搭建在实战开始前,首先要理清一些理论性的网络基础知识和实用工具,对于服务器涉及的网络知识有很多,自己掌握的也并不是很全面也在不断学习充电当中,但针对本次Linux服务器项目的搭建,所需要的网络基础知识,在本文做一个覆盖,说清,理解,明白。

一、基础知识:TCP/IP协议栈

1.详细七层模型和缩略四层模型映射对应关系

七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

四层模型:网络访问层(数据链路层或网络接口层)、网络层、传输层、应用层

有些地方叫法不一样,实则表达含义是一样的,在TCP/IP 参考模型中,各项通信协议各有归属,像我们在浏览器中常用的:HTTP(超文本传输协议)、DNS(域名系统)、FTP(文件传输协议)、SMTP(简单邮件传输协议等)都是属于应用层协议,而 TCP、UDP 则属于传输层协议,IP 则属于网络层协议

2.完整的一次网络通信过程模拟

为了对HTTP请求的通信过程有一个更好的理解,从TCP/IP四个层次出发,对应各个层次的通信实体,或者媒介(例如浏览器,路由器以及网线等),看各个协议是如何在这些通信实体中发生作用,将一个请求发送到服务器,服务器的响应又是如何赶回来的。

整体来讲,一次完整的通信,很像快递邮递包裹,物品被加上包装,写上地址信息和联系方式,经过一个又一个的快递中转站,到达收货人的位置。在网络请求中,请求的数据就是需要快递的物品,IP地址和MAC地址就是通信的地址,网线和路由器、交换机和集线器等就是运输道路和快递中转站,网络协议则可以看做快递员和快递政策,而和快递类似的是网络通信也会出现丢包(包裹损坏)等情况。所以说,一个简单的HTTP请求,要完整地拿到请求信息,中间有若干操作系统组件、通信协议、通信实体参与,才能保证通信的顺利进行。

那么,这个快递过程,其基本原则是通过分层的顺序,发送端由上往下发送,接收端则由下向上接收。为了保证数据顺利发送到下一个层次,会在发送在其头部加上一些必要的信息,这些信息是为了保证数据的完整和符合需求的约束信息。发送HTTP请求时,经常会设置Request Header,例如 :Content-Type:text/html 是向服务器说明,需要的是 HTML 页面,返回其他东西是不行的。

这些头部信息还可能包含协议信息,请求路径、请求方法等,但这仅仅是发生在应用层,整个通信过程,经过四个层次,会被依次加上 HTTP 请求头,TCP头部、IP头部以及以太网头部。数据加上这些头部信息之后,才会被发往下一层,数据经过重重包装,从电脑网卡出发,穿过若干路由器,网线,交换机,到达目标服务器所在的子网,服务器要做的则是相反的过程,它会根据前面加上的头部信息,层层解析,最后到达服务器被处理(处理就是服务端程序代码的责任),之后再将响应数据返回。整体过程如下图:

数据在各个层次间依次传递,其传递的数据单位可以统一理解为数据包,数据包在不同的层次有不同的称呼,平时熟悉的是其从应用层出发时,将之称为HTTP请求消息(message)或者报文;为其加上消息头之后,发送至传输层,加上TCP头部,叫它报文段(segment);到网络层,加上 IP 头部,成为 IP 数据包;到了最后的网络访问层,其已经套上层层包装,在这里在为其加上以太网首部的同时,还会加上一些尾部信息,摇身变为帧(framing),这个过程叫做封装过程。不管怎么叫,数据在各个层次间,是以数据包的形式传递,当数据量大时,还会出现分包传递的情况。

3.通信过程中每一协议参与流程

假设现对:https://www.google.com/ 进行访问

①.DNS查询解析

URL只是为了更友好识别网络程序而设置的互联网资源的定位标识,浏览器首先会对URL进行解析,获取到请求的协议(https),域名(google.com),路径(/),由于没有其他子域名,也就是查询 google 的默认主页,解析完毕后,DNS开始工作。

DNS,也就是域名查询系统,负责URL对应的IP地址的查询,每个操作系统会内置Socket协议库,协议库中有解析器(resolver)专门负责这个过程,经过 DNS 查询,浏览器拿到了请求资源的IP地址。IP地址,又叫网际协议地址,是分配给网络上设备的数字标识,也就是说,只要联网的设备,例如电脑、手机以及路由器等都是有IP地址的,其是我们的请求数据识别服务器在网络中的位置的必须标识。

②.MAC地址查询

IP地址在网络层使用,但在实际的数据链路上传递数据时,在同一个链路中不同的计算机,其必须要使用另一个地址来识别——Mac地址,又叫做物理地址。通常提到三个地址:IP地址、Mac地址以及端口号,三者分别代表的是:

IP地址:网络中互联的主机和路由器的标识。

Mac 地址:每个网卡硬件的物理地址。

端口号:识别同一个主机上不同的应用程序,也可以理解为程序地址。

所以,在一个网络通信中,需要用到五大识别符:源IP地址、目标IP地址、协议、源端口号和目标端口号。Mac地址是每一个网卡被生产的时候就写死在其中的,所以其是不变且唯一的,紧接着就是要得到服务器的Mac地址,引入一个新的协议——ARP。

ARP,英文全称叫做 Address Resolution Protocol,也就是地址解析协议,其作用是:根据IP地址获取通信设备的物理地址,其工作原理类似于以前我们常见的广播,它会将包发送给同一以太网的所有主机,若目标主机的Mac地址与对应的IP地址吻合,则找到了目标,但是若每次查询都要给所有的主机发送ARP请求,网络中则会出现很多ARP包,因此每个主机都会有一个ARP缓存,里面存放着常用的 MAC地址,主机会优先从缓存中查询是否有需要的信息,如果有就不再发送广播。Mac地址会在网络层加入IP头部发往网络访问层。其实仔细观察会发现,为了提高效率和性能,网络通信中随处可见缓存,HTTP 缓存、DNS缓存以及ARP缓存等。值得了解的是在IPv6中,有一个 NDP(邻居发现协议)替代 ARP 来完成这个工作。

③.套接字数据传输

之前提到操作系统中有一个协议库,负责本机中网络通信的很多功能,在DNS查询的时候,协议栈中的解析器就参与其中,当应用层获取到服务器的IP地址和MAC地址,已经拥有了数据传递的必要条件,接下来浏览器会向操作系统的协议库发出委托指令,调用其中Socket库中的程序组件,建立套接字(socket),套接字的本质可以理解为一个数据通道的出入口,其执行的是一个“打开,读/写,关闭”的流程。

在进行数据传输时,客户端和服务器都会创建一个套接字,之后调用socket库中的connect组件,该组件会依据描述符(套接字的匹配令符,与服务端的套接字的接头暗号),服务器的IP地址和端口号,在浏览器和目标服务器之间建立一个传输通道(实际上并没有真实的通道,中间隔着N多网关、路由器和防火墙,这样讲是为了更好理解),而听的最多的TCP三次握手四次挥手,实际就是发生在这个阶段,稍后作一个详细的说明。

通道建立之后,接下来就是数据的读写操作,程序代码无法直接控制套接字,它依然会委托Socket库中的组件来完成数据的读写(write 和 read),数据传输完成后,服务器会主动执行断开操作,调用Socket库中的close组件断开连接,浏览器发现之后,也会执行断开操作,数据传输完成。可以看到,在应用程序代码的背后,操作系统中内置的组件库和互联网协议互为网络通信的左膀右臂,共同负责整个通信过程,缺一不可。

4.三次握手和四次挥手

TCP和UDP是传输层中的两个主要协议,两者的区别是:前者是面向连接的(实际就是套接字管道)、可靠的流协议;后者则并不可靠,它采取一种“尽最大努力”的传输策略,浏览器、邮件等应用程序一般使用 TCP 传递数据,而像DNS查询等较短的收发则使用UDP。整体来讲,之所以要在发送数据之前建立套接字,正是因为TCP是面向连接的传输协议,在传输协议面前,你发送的内容无关紧要,它们会将之看为一串具有一定长度的数据。为了保证数据传输的可靠,TCP在套接字建立连接时,采用“三次握手”策略传输数据。下面是一张三次握手流程图:

说明:图中的syn是 Synchronize Sequence Numbers 的简写,也就是同步序列编号,拥有数据传输序列的标识;ack是acknowledgement,表示确认。

通俗来讲,是这样一个过程:

第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号),syn=j,其进入SYN_SEND 状态等待服务器确认:我已准备好,随时出发!

第二次握手:服务器接收客户端 syn 包并确认(ack=j+1),同时向客户端发送一个 syn 包(syn=k),也即 syn + ack 包,此时服务器进入SYN_RECV 状态:收到请求,随时接收。

第三次握手:客户端收到服务器的 syn + ack 包,向服务器发送确认包 ack(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成三次握手:OK,我知道了,那我们开始发送数据。

可能会觉得相当麻烦,确认一次就可以为什么需要三次握手呢?其实,为了保证数据传输的绝对可靠,三次确认是最少的次数,试想这样一种情况:在第一次得到确认后,客户端发送数据出去,但是这个数据由于中途网络等问题,迟迟到不了服务端,服务端选择关掉通道,但通道关闭后,刚刚的数据又跑过来了,这时候,服务端会将这个数据视为来自客户端的新的传输请求,同意建立连接,而建立一个新的连接,但是,客户端并没有发送数据,所以,它会忽视服务端的确认,也不会回应给服务端,服务端就在傻傻滴等待,但这种等待是没有结果的,这就造成了服务端资源的浪费。

知乎上有另外一种理解:之所以需要三次握手,本质的原因是:传输信道是不可靠的,你不知道网络会在什么时候出什么样的问题,所以,为了保证传输的确可靠,三次握手是理论上的最小值。

TCP传输数据时,并不是将所有数据一股脑全丢出去,而是会将数据存放在一个的发送缓冲区,并且会等待应用程序的下一段程序到达,之所以这样干,是因为一收到数据立马发送,很可能会造成信道的浪费与闲置,导致网络效率太低,就像明明很宽的马路,非要像过独木桥一样通过。

而TCP如何决定数据什么时候会发送,其拥有一套计算机制,整体来说,是按网络包的长度以及应用程序送包过来的时间,虽然你的数据很小,但你半天不发送,我也不会一直傻等着。

还有一种情况是,当发送过来的数据包很大时,会在缓冲区对包进行拆分发送,拆分的时候,TCP模块会计算好每一块数据的开头和结尾的字节数,并将之写在TCP头部信息中,以待对方确认,根据这些起始序号,接收方可以判断是否有数据遗漏的情况。

每发送一个包,就需要等待ack包的确认,这也是一种资源浪费,所以为了利用等待ack的空闲时间,数据可以不用等待ack直接发送,但是这会出现一种情况,一边一味地发送,但超过了接收方的处理能力,就会出现网络拥堵,得不偿失。为了解决这个问题,TCP 采取了一种滑动窗口的发送策略,它的原理是这样的:

滑动窗口实际上是数据流量控制策略,我们可以将所有的数据想象为一个序列,而窗口则是数据可处理的数据大小,接收方会将窗口的大小写入ack包的头部信息中,告知发送方,发送方会据此动态调整发送的速率,由于传输的持续进行,这个窗口大小会动态变化,因此达到了流量的控制,其本质的目的是,不要发的太快,让接收方处理不过来。

但是在浏览器和服务器之间,可能隔着极多的网关、路由器、交换机等,数据是如何在庞大无比的因特网上找到服务器的呢?这里就涉及到网络层协议了,实际上这一切在请求发送之前已经准备好了,我们使用DNS和ARP等方式,获取到了目标服务器的IP地址和Mac地址,这两个地址引导发送的数据包到达服务器,IP地址用于在网络中的所有主机中匹配通信的目标主机,IP地址包含网络标识和主机标识,前者用于区别不同的网段,后者找到同一网段的不同主机,数据到达路由器时,路由器会根据网络标识将数据转发到相应的网段,到达相应的网段之后,又会根据主机号,到达真正的主机。

记载到这里,可能会碰到一个疑惑,就是既然IP地址都能找到目标服务器,为什么还需要Mac地址?

其实是:在同一个网段内通信时,只用知道Mac地址,就可以精准找到目标,但是互联网上的网络数量无比庞大,网络被各大运营商分割为多个网段,每个网段又有多个子网,如果仅仅知道一个Mac地址,要在所有的网络设备进行匹配,就是相当大的工程了,这时候IP地址的妙用体现出来了,它可以用来找路,这就类似于快递中的省市地区等,而Mac地址可能是唯一的名字,你在全中国找一个小强的人那就太多了,但是你要具体到某一个村或小区,就很简单了。

另外一个原因是:交换机这个东西,只认Mac地址,就如同路由器根据IP地址决定网络请求的转发路线,交换机通过 Mac 地址来确定具体的网卡位置。

路由器、交换机、网线、光纤等正是TCP/IP四层协议的最底层,网络访问层,也就是OSI模型中的数据链路层和物理层,在这一层,数据被加上以太网首部,封装成帧在各个路由器之间转发传送,经常来说,路由器之间的传送又有常用的点对点协议,也就是PPP(Point-To-Point Protocol),这是一个网络访问层协议,PPP会在帧的前后加上帧界定符进行发送。最后,到达服务器所在子网,会将消息转交网络层向上传递。向上传递的过程如前所述,乃是解析头部信息,最终到达服务器的相反过程,不再细述。

这个过程可以在前面的整体过程图清晰看到,请求数据到达服务器所在子网的路由器之后,又是一个由下而上的过程,这与客户端发送数据基本相反,每经过一个层次,都会解析前面添加到请求数据上的多层头部信息,交由上一层处理,在整个TCP/IP协议栈的帮助下,请求数据终于到达了目标服务器,穿过服务器的网卡,服务器操作系统同样有协议栈来负责找到服务端程序对应的端口,将数据交由服务端应用程序处理。

服务器会根据我们的请求头信息,处理返回结果,之后请求响应信息重新出发,再次回到浏览器,浏览器收到请求后,经过解析、渲染过程,页面呈现在我们面前。

二、实用工具:vmware、Xshell(Putty)

1.vmware

vmware虚拟机,用最简单的一句话讲就是一个装载工具(容器),一个壳,它类似于EXSI或者说最近玩的比较火的Docker,简单看一下,这是我本地的一个vmware里面装了一个Ubuntu系统,用于编译路由器的OpenWrt固件所使用的,界面是比较简洁,一般我还常用CentOS 7的系统,目前没有装。

2.Xshell(Putty)

Xshell(Putty)其实就是一个连接工具,目前个人用比较多的就是Xshell,可以连接以Linux操作系统的服务器,现在绝大多数的VPS都会装Linux的CentOS 7的这款发行版,一般的像科学上网的部署,流量的伪装…….,这里不多说,反正有一台Linux的服务器,你可以干很多的事,目前我自己也有很多Linux的小主机服务器,绑定公网IP的要实现穿透技术…..,还是建议自己去买个阿里云、华为云…..这些大厂的云服务器,也简单的看一下吧,这是我连接的自己家一台安装Armbian操作系统的服务器,Armbian系统也是Linux系统的一种,它一般运行在ARM架构处理器的机器上跑。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2019-2024 Carrol Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信