网络基础之协议栈
在计算机网络里,数据传输的流程大致可分为以下几步:
1、应用程序原始数据被拆解并编码,转化成电信号或光信号;
2、电信号或光信号通过物理介质传输;
3、传输完成后电信号或光信号还原成应用程序数据被接收;
整个流程,都是通过计算机网络协议栈完成的。
而现在的互联网采用就是基于OSI七层模型的TCP/IP协议栈,主要包括五层,即应用层、传输层、网络层、数据链路层和物理层,如下图所示;其中数据链路层又可以分为两个子层,即LLC(逻辑链路控制层)和MAC(介质访问控制层)。
应用层:为应用程序提供数据传输的网络接口,常见的是HTTP、Telnet、FTP等协议都工作在这一层;
传输层:传输层提供端到端的连接,例如让A主机上的程序小红找到B主机上的应用程序小明。TCP和UDP都工作在这一层,端口号的定义也在这一层;
网络层:用于寻址,它能让互联网的两台主机在互联网的茫茫”机海“中找到彼此;
数据链路层:网卡就工作这一层,负责将数据信号转化成光信号或者电信号,供物理层传输;
物理层:物理层是信号传输的物理通道,网线和配套的接口都属于物理层。
应用程序数据,经过这五层协议自上往下逐层分解,最终变成可供物理介质可传输的信号,当达到目的地主机后,再自下而上还原成应用程序数据。
image那么,为什么不能把应用程序数据直接转化成物理信号,其实是因为网络栈分层后使得一些特殊功能的网络设备可以只实现协议栈的子集,我想言下之意应该是说,让所有的设备功能都可以解耦单独完成自己的工作就可以了。如路由器,只要实现网络层、数据链路层和物理层的功能就可以了。这样就保证了每一层都可以单独设计,只要保证上下两层的接口保持一致就可以了。
互联网是如何提供服务的
互联网上的主流应用,如浏览器、在线视频、社交游戏等类型很多,但其本质都是下载。作者举例说,我们想象用户将一根水管插到水桶里,水经过水管流出,我们可以用来做饭(听歌)、洗手(看视频)、洗菜(浏览网页),这些水(资源)被下载到本地后,应用程序就会按照开发者的设计,将数据进行存储,和使用。所以,在C++、Java等大量编程语言中,流叫做stream,被用来形容一个地方从另外一个地方不间断地获取数据。
用户打开网站时,浏览器会根据网址与服务器建立连接,从而建立流。网页的数据通过这个管道不断地流向用户的浏览器,浏览器得到这些数据后,立即进行解析、排版、绘制,经过整个渲染过程,用户看到了呈现在浏览器窗口内的网页。
IP地址
IP地址相当于接入互联网的所有主机对应的门牌号,这个门牌号在互联网上是独一无二的,否则发送给指定主机的数据就会走错门。
我们可以用通过系统属性或网站提供的服务页面查询本机的IP地址,尝试如下图。
image image每一台连接到网络的中的网卡,都有一个IP地址,用来在网络中收发信息。在IP地址库中,有三类地址被定义为”私有地址“,如下表所示:
image私有地址,就是指这些地址只允许被用在私有网络中,不能作为互联网接入地址使用,如果某台PC接入家庭网络或者公司的局域网,他的IP肯定会落到上表中的地址段中。但如果私有网络中的设备,要访问互联网上的内容,就需要用到NAT(Network Address Translation,网络地址转换)技术。
NAT转换技术,主要有三中实现方式:
1、静态转换(Static NAT)
内网地址与外网地址是一一对应关系,如果内网中有10台主机需要访问外部网络,就需要有10个外网IP地址做映射,而且这10个内网IP和10个外网IP是固定的映射关系。如果需要内部网络的一台主机作为外网的服务器,就需要用到静态转换。
2、动态转换(Dynamic NAT)
动态转换与静态转换类似,但内网IP与外网IP不是一一对应关系,一般ISP会使用这种方式为接入用户提供访问外网的能力。
3、端口多路复用(Overload)
这种方式,就是一个外网的IP可以被内网多个IP同步共享,与前两个方式的区别在于讲端口作为一个映射的维度,家用路由器一般都是通过端口多路复用来实现NAT的。
那么为什么同一台设备有两个不同的IP地址呢,其实网络上查询的IP是经过NAT转化之后的了,详细流程参见下图:
imagePING和网关
PING(Packet Internet Groper)是网络诊断工具,意为互联网包探测器。PING是TCP/IP协议簇中的一部分,其原理是向目标IP地址发送一个数据包,如果对方返回一个同样大小的数据包,则证明联通,并且整个过程能测试时延。
网关,就是两个网络之间的门,在物理上网关是一个网络设备,拥有IP地址,在家庭网络里通常就是路由器的IP地址。网关具有转接和过滤的功能。
端口
端口是终端留给外部的接口,是不同设备之间通信的桥梁,物理设备是通过物理端口实现沟通的,比如网口、USB等都是物理端口或接口。计算机内部有很多数据服务都是要通过一个物理端口与其他设备产生联系的,外部的数据包也是需要通过物理端口反馈回来的,但是计算机内部各种各种的服务数以万计,每个服务怎么知道回来的数据包是自己需要的,这样便有了”虚拟端口“,一个服务想和外界联系就要绑定一个端口号,同时制定目标服务的端口号,这个端口便是虚拟端口,这样便把相应的服务数据包放在对应服务生命端口的缓冲区中,等待服务取走自己的数据包。
另外,还有一个概念,就是服务进程拿了一部分数据后开始处理,但是还没有处理完又有新的数据来了,当缓冲区数据过多,可能就会造成数据溢出丢失。解决办法就是在进程中设计了一个特殊的监听线程负责监听绑定的端口,如果有数据过来,监听线程就会把这个数据从缓冲区取走,让其他的线程处理。作者给的例子非常显浅易懂,比如把公司比作是一个进程,前台比作一个监控线程,而其他的人则可比做处理数据包的其他线程,当快递源源不断的寄到公司的时候,监控线程是可以随时通知其他线程来拿走数据包进行处理的,而不用等到一个完成才能叫下一个线程。
TCP和UDP
TCP(Transmission Control Protocol)即传输控制协议,IP(Internet Protocol)即因特网互联协议。TCP/IP是一个协议簇,也就是许多协议的集合,包含了很多不同的协议,并定义好了整个互联网连接和协商的最基础原则。
TCP和UDP处于整个网络协议栈的应用层,是两个不同的通信协议,其作用都是传输数据,常见的网络数据都是基于这两种协议进行传输的。
TCP是应答式通信方式,UDP是只管发送而不管是否接收成功的通信方式。TCP的数据传输需要一个逻辑上的私有通道,当连接两端成功后,所有的数据都在这条通道上传输,发送方也会收到数据被成功接收的回执。另外,为保证这条通道的正确建立,客户端和服务端需要进行”三次握手<传输两端需要三次确认,才能开始通信>“,保证了数据的可靠性,但是降低的效率。
TCP保证可靠性的手段:顺序编号、确认机制和超时重传。
UDP则比较简单粗暴,不管对方的状态,直接发送数据不需要建立通道,所以保障的数据传输的效率,但是丢失了可靠性。
但是每种场景应用哪一种传输协议,应结合实际情况考虑,不能一概而论。
反向代理
一般意义上的代理,都是指客户端向外界发送请求时,并不直接与目标服务器连接,而是将所有的请求交给一个代理服务器,他负责对外连接外界的目标服务器。同时,外界从服务器返回的数据也是先经过代理服务器返回客户端。在外界看来,所有的客户端都隐藏在代理服务器后面,起到了保护客户端的作用。
反向代理,则恰好相反,是针对服务器的一种代理技术,可以接受客户端的请求,然后把他们分发给被代理的后端服务器上,等这些服务器处理完请求后,再将结果转发给客户端,他是将服务器都隐藏在身后,对客户端来说也许只有一台服务器,但是反代理服务器也许服务了成千上外台的后端服务器。
那么,反向代理服务器的意义则是实现了负载均衡,因为会有很多台服务器提供服务,但是每一台服务器的负荷可能不一样,如果请求被发送到负荷较高的服务器,他的处理时间可能较长,但是客户端不知道那台服务器比较清闲,而反向代理服务器知道每台服务器的负载量,会将请求转发到相对空闲的服务器。
同时,反向代理服务器还可以减轻后端服务器的压力,比如一些静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求放到后端服务器,这样就可以直接服务前台应用了。反向代理服务器还能为后端服务器阻挡一些网络攻击,提升后台服务器的安全性,反向代理服务器对于后端服务器而言,如同产品经理和研发同学,能过滤掉不必要的需求,减轻工程师的对接压力。
网友评论