分布式专题(1)- 计算机网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/HelloWorld_In_Java/article/details/93394999

本篇一句话总结:计算机网络中的七层模型分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。


正文开始: 

如果你有一定的工作经验,去面试的话,面试官大概率会问你:

说一下从输入网址到获得页面的过程是怎样的?

有一定开发经验的同学都知道,有如下几个过程:

(1). 浏览器对输入的域名进行解析,获取域名对应的IP地址;

(2). 浏览器获得IP地址后,浏览器向服务器请求建立TCP链接;

(3). 链接建立后,浏览器向服务器发送HTTP请求;

(4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,一般处理就是执行controller里面的方法,并将处理结果及相应的视图返回给浏览器;

(5). 浏览器根据其请求到的视图、数据渲染页面,显示给用户。

(虽然你可能还不知道域名如何解析成IP,也不知道什么是TCP链接,也不知道HTTP请求具体是什么个概念,但先照着标准答案回答了先)

三次握手

你回答了之后,然后面试官可能会继续问你,浏览器向服务器发起请求时,是怎样建立TCP链接的?

这时候对计算机网络不太了解的同学可能就懵逼了,答不上来,然后面试官可能就会觉得,这个人连这个问题都不知道,行不行啊。了解一点计算机网络的同学就知道,就是三次握手嘛。为什么是三次而不是两次四次,不了解的同学可以看这里

一般面试官听到三次握手也就满意了,但是你如果去阿里腾讯这些大公司去面试的话,他们肯定会追问说:“嗯,那你再说一下OSI七层模型吧?”  或者会问:“那你知道TCP/IP五层模型吗?” 。如果你这个问题答上来并说清楚了,面试官绝对眼前一亮,对你的印象分蹭蹭蹭地涨,离拿到offer就不远了。

所以我们非常有必要清楚,什么是OSI七层模型,和TCP/IP五层模型。

OSI七层模型、TCP/IP五层模型

OSI定义了网络互连的七层框架,分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP五层模型是把上三层都归为应用层,其原理还是跟OSI七层一样。

如下图:

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。共23个字,但它在计算机界的地位,就跟我们5000字的道德经在中国的地位一样。小兵我大学的时候就学过计算机网络这门课,但说来惭愧,那时候吊儿郎当地没听过几节,工作后得重新学习时才发现,卧槽,好像错过了一个亿。这时候想学也没老师教了,只能自己找找资料自己领悟了。在费了不少时间后,小兵我终于对这个模型有了更深刻的认识。然后觉得,好像不是错过了一个亿,是错过了两个亿!!发现它就是我们现今很多技术的总纲!!可以说没有它分布式相关的技术就无从谈起!! 下面小兵我就来说一下我是怎么认识这个两个亿的模型的。

以需求为源头

我是先从需求角度,再从实现的角度去理解这个模型的,

就是为什么人们要提出这个模型?基于什么样的需求才提出的这个模型?如果叫我实现那我如何实现?

然后我们很容易得出答案,需求就是:实现两台计算机通信。

我们先看一下两个主机H1、H2通信的总图,见下图左。图是从网上随便找的,有点模糊,内容好像很多,可能会觉得看不懂,但那都没关系,如果你是第一次看这张图,只要清楚一个事情,那就是数据是从主机H1的应用层产生的,最终会发送到主机H2的应用层。也就是说

数据从一台计算机的应用层,发送到目标计算机的应用层,就实现了两台计算机通信。

而且数据在应用层产生后,并不是变魔术变到了目标计算机的应用层,而是走了长长的一条路,

是从应用层 -> 传输层 -> 网络层 -> 链路层 -> 物理层,中间又经过了N个路由器的物理层链路层网络层,才最终到达目标计算机的应用层。

然后从下图右我们可以看到,我们在应用层产生的数据,到了传输层之后就改叫为【报文】,到了传输层之后就成为【包】,到了数据链路层后就称为【帧】了,到了物理层,就是比特流【bit】了。名字不同,证明数据一路传输下去,每层都对数据做了一些其它的处理,具体什么处理呢,一两句话还真讲不清,我们在后面讲解每层的作用时会说到。

即我们在浏览器输入baidu.com,就是数据baidu.com在应用层产生,然后这条数据进入传输层,网络层,链路层,物理层,经路由转发,最终到达百度服务器,也就是目标计算机的应用层。这就实现了计算机的通信了。然后目标应用层收到这条数据后,会对你的数据进行解析,解析后发现,它需要把百度首页返回给你,然后它就返回了一个html文件给你的浏览器,返回的时候就是要走一条相反的路,从服务器本机的应用层走到物理层,然后中间也是要各路由转发,最终达到你的浏览器,你的浏览器收到这个html之后就可以展示出百度首页了。这就是实现了两台计算机的通信,浏览器、服务器的相互通信也就是HTTP协议的内容了。

上面说了一堆,终于要开始讲到各层的扮演的角色,各层的作用了。讲之前我再次总结一下上面那一大对废话:

总结1:数据从应用层产生

总结2:应用层的数据,发送到目标计算机的应用层,就是实现了两台计算机通信

总结3:应用层的数据,发送到目标计算机的应用层,中间要走很长的一段路

有了三面的三点总结,其实你已经可以回答面试官了,什么是OSI七层模型、TCP/IP五层模型?

你可以回答说:“OSI七层模型,和TCP/IP五层模型,说的就是数据怎么从一台计算机的应用层,发送到另目标计算机应用层的过程。就是我们从应用层产生的数据,会从应用层传输到传输层、网络层、数据链路层、物理层,经过路由转发,最终到达目标计算机应用层,实现计算机通信的过程。”

如果面试官不想深挖的话,能答出上面那句你已经过关了,他会转到其它问题。

如果他继续深挖的话,会继续问你,能简单说一下每一层的作用吗?你知道哪些协议,比如http协议,tcp/ip协议?

这时候就是体现功力的时候了,如果你能够不慌不忙地,用自己的语言把每一层的理解说出来的话,我敢保证,你这个offer,稳了。

下面,小兵要开始讲每层的内容了。我会尽量讲得比较的通俗易懂,让人能够理解,便于记忆。

 

物理层

        两个通信终端需要交流,必须要有介质来传播。像两个人说话需要空气作为介质,电话交流需要电话线作为介质,所以要实现两个计算机通信,也需要东西作为通信的介质,于是我们发明了网线(双绞线)。两台电脑用网线一连,好,有通信通道了,A可以通过网线给B发消息了。物理层就对应我们生活中的网线、光纤等。物理层中的数据形式是二进制比特流,二进制比特流通过一些物理设备转换为脉冲信号,也就是网线中的信号,即一切数据最终都是通过这些具体的物理介质来传输。我们国家信息化进步得这么快,就是因为国家出大力气铺设了大量网线大量光纤,使信息能在我国广袤的土地上飞速传输。

 

        另外,在网线传输信号的过程中,信号可能会衰减,所以物理层对应的设备还有中继器、集线器(HUB,也就是多口中继器)。中继器就是连在两根网线之间的一个设备,能对网线中的信号进行放大,但它对信号不做任何逻辑处理,即透明传输比特流。中继器有两个重要的概念需要了解一下,就是广播域冲突域

      冲突域:该域当中的任何时刻,只能有一台设备发送数据,否则会有冲突。冲突后两台设备都必须重新发送数据包。

      广播域:该域当中的任何一个设备发送信息,其它设备都能“知道”这个信息。

      先大概了解冲突域和广播域的基本概念,后面会用得上。

HUB:域可以看做一间办公室。大家把网线连到了同一个HUB,就相当于处于同一个域,就是说大家就会处在冲突域和广播域中。

冲突域可以理解为,办公室的门很小,一次只能过一个人,如果小王、小李、小兵都想出门(发送数据),那就都挤在门口了,即发生冲突。这时候大家就得都退一步,重新一个个出门(重新发送数据)。

广播域可以理解为,办公室门的上装有语音播报系统,有人进出门(发送、收到数据)的时候,办公室都会响起一阵声音:【小兵要出门去找小芳了】、【隔壁小花来找小兵了】,即整个办公室的人都能知道这些信息(广播)。

一句话总结物理层就是:物理层为物理设备间提供了通信通道,实现了数据传输。

数据链路层

        物理层为物理设备间提供了通信通道,实现了数据传输。但这个传输是透明的,即传输过程网线本身不会对你的数据进行任何逻辑处理,理论上你如果传的是10010,目标计算机收到的时候也是10010。但物理传输毕竟是不可靠的,信号在传输过程中,可能衰减衰减着就没了,或者受到干扰变成了11111,这是我们不希望看到的。所以呢,

数据链路层的功能就是:通过一些数据链路层协议和差错检验机制,让数据在不太可靠的物理链路上能够进行可靠的传输

简单概括就是,数据链路层实现数据的可靠传输。

下面我们就看看,数据链路层具体是怎样工作的。

在了解数据链路层如何工作前,我们要先了解几个概念,即以太网、MAC地址、帧

数据链路层之:以太网

百度百科的解释是:以太网(Ethernet)是一种计算机局域网组网技术。IEEE制定的IEEE 802.3标准给出了以太网的技术标准。它规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用最普遍的局域网技术。

也就是说以太网就是局域网的一种。我们知道,不同网段的ip相互之间是不能直接访问的,因为网段不同,证明他们连的不是同一根网线。但是接入网桥、交换机(多个网桥)等设备后,就能够跨网段访问了。网桥网桥,就是网络之间的桥,有桥梁了,自然就能互相访问了。交换机,也就是多个网桥,就相当于多条通路。大部分学校,实验室,办公大楼都有自己的局域网,也就是我们所谓的内网(不知道你们有没有试过封闭式开发时只有内网可以访问的体验,U盘不能插入电脑,手机不能做出对着屏幕拍照的姿态,以防资料外泄...)。我们常见的局域网如下。

思考问题:还记得大明湖畔,不,我们物理层中的中继器、集线器吗? 现在数据链路层又出现了网桥、交换机。是不是傻傻分不清楚了?他们有什么功能,有什么区别呢? 一两句话还真说不明白,所以还是附个传送门:

史上最通俗的集线器、交换机、路由器功能原理入门

数据链路层之:MAC地址

我们每个人都有自己唯一的身份证号,计算机也需要一个类似身份证号的东西来做唯一区分,那就是计算机的MAC地址,MAC集成在计算机的网卡,由计算机厂商生产计算机时指定,它一定是全球唯一的。

PS:我们可以通过 ipconfig /all命令来查看本机的物理地址。如下图。

数据链路层之:帧

了解了以太网和MAC地址的概念后,我们可以看看,在以太网(即局域网)下,数据链路层是怎么工作的。我把第一张图片又拿了出来:

从上面的图片我们可以看到,数据链路层的基本单位是(frame)。那么我们可以先想象一下,帧中应该包含哪些数据?比方说小兵用QQ给小花发了一条消息“hello”,这条消息从应用层,到传输层,网络层,然后到数据链路层后,就被称为帧了。那么我原始的消息“hello”肯定也应该还在帧里面,但除此之外,帧应该还包含什么数据呢?如果你还不知道答案,那可以想象一下我们给别人发快递时是怎么发的,除了需要快递的东西外,是不是还要填写发件人姓名地址,和收件人姓名地址?不然怎么知道快递要发到哪里,别人又怎么知道是谁发来的。所以可以猜到帧包括的内容有: 数据来源 + 发送的数据 + 目标地址。然后我们看看实际的帧结构是怎样的。

以太网帧格式

上图是两种不同类型的以太网帧,即 Ethernet_II和 Ethernet802.3帧,这两种帧有啥区別,我们暂时不用关心。

我们可以看到帧中确实包含我们所说的数据来源(S.MAC),发送的数据(Data),和目标地址(D.MAC)。目的地址与来源地址这里指的都是MAC地址,我们知道它是唯一的。所以通过帧中的目标MAC地址,所有连接到这个局域网的计算机就都可以进行通信了。

另外可以看到,帧的总长度在64-1518字节,除上面三个相同部分外,可以看到帧中还有一个2字节的类型(Type)或长度( length)字段,该字段是用来区別帧类型,当Type值小于或者等于1500(或者16进制的0x05DC)时,帧使用的是IEEE802.3格式。当Type值大于等于1536(或者16进制的0x0600)时,帧使用的是 Ethernet_II格式。 Ethernet_II格式是目前的主流格式。另外Type还用来指定数据链路层使用何种协议,如Type值为
0x0800时,使用的是IP协议,Type值为0x0806时,使用的是ARP协议。Type或 length值是由它的上层决定的,即由网络层决定使用何种协议的帧,协议指定后帧格式自然也随之确定。(协议的具体内容将在讲网络层时说明)

另外可以看到,帧尾部还包含一个4字节的FCS(帧校验序列 Frame Check Sequence)字段,这个校验序列是通过对帧进行
一个循环元余算法(CRC)计算而得,用于检查帧数据是否被损坏。

还记得开始说的数据链路层的功能吗?即“通过一些数据链路层协议,让数据在不太可靠的物理连路上能够进行可靠的传输”。前
半句所说的“数据链路层协议”,就是通过Type字段来指定,決定权在网络层。后半句所说的“可靠的传输”,即通过帧后四位的校检序列来实现,即目标计算机收到传输过去的帧后,会根据校验序列进行校验,如果校验不通过,则将该帧丟弃,此时可以重新发送该帧,从而保证数据可靠的传输。

所以我们现在对数据链路层的认识应该是:数据从网络层传到数据链路层后,将被封装成帧,以太帧封装完成后会通过物理层转换为比特流在物理介质上传输,到达设备后重新组装成帧。根据帧中的MAC地址,最终帧能够发送到某个唯一的目的端,实现局域网之间的通信。且根据帧尾的校验序列,可以校验帧数据是否准确,如果不准确时可以丢弃该帧,进而可以重新发送,以此保证了数据的可靠传输。

所以两句话总结数据链路层就是:

数据链路层实现了局域网内部通信;

数据链路层实现了数据的可靠传输。

所以OSI七层模型的低两层功能总结如下:

  • 物理层实现了物理设备间的数据传输;
  • 数据链路层实现了局域网内数据的可靠传输;

网络层

我们知道数据链路层已经实现了局域通信。虽然局域网内,我们能互相通信了,但大一点的局域网也就方圆几千里,而我们的访问目标可是全世界的网络啊,通过网络层就可以实现我们对互联网的访问,不出门即可全知天下事,就是因为有网络有网络层的功劳。网络层的一个主要概念是“路由”,路由,即路径自由,比如从深圳到北京的网络有很多条,通过路由算法,可以选择最佳路径到达目的地。路由器就是实现这一功能的的设备,它可以把各个局域网连接起来, 从而构成一个巨大的网络,我们的互联网就是基于一个个局域网组成的。

这时候又要把第一张图片祭出来了,从上图左我们可以看到,网络层的基本单位称为(package),上右图是它的结构,好像有点复杂。但是我们只要看几个主要的就行:

  • 版本号:4位,0100(4代表目前广泛使用的IPv4地址)/0110(6代表将要广泛使用的IPv6地址);
  • 协议:TCP、UDP
  • 源地址:32位,发送数据主机的IP地址;
  • 目的地址:32位,接收数据主机的IP地址;
  • 生存期(TTL):8位(最大值为255);
  • 用户数据:1480字节

因为包中含有源地址和目的地址,所以路由器将包转发到其它子网时,如果目的地址,即目的ip不在该子网中,则该包将继续被转发下去,直到找到目的网络。包到了目的网络后,由数据链路层根据帧中的目标MAC地址找到目的主机,从而实现了计算机之间的跨网通信

IP协议和ARP协议

这里我们可以补充回在讲数据链路层时,提到的IP协议和ARP协议了。

IP协议:即寻址和路由,就是负责根据IP找到目标网络,并不断将数据路由转发出去。

ARP协议:则是根据目标IP地址,获取目标IP的MAC地址,以最终实现数据的传输。ARP协议的通俗讲解可以看这

还有RARP协议:即反ARP协议,就是反过来根据MAC地址,获取其IP地址。

这时候再看回我们的第一张图,应该就很容易理解他们的通信逻辑了。

说了路由器的概念之后,也要了解一下网关的概念。看网关和路由器的区别

这时候我们看两个小例子来巩固一下对网络层的理解。

例1:ping命令测验

还记得我们包中的TTL(生存期)吗?TTL可以看做是一个计数器,在每个机器上的TTL值可能不同,它可以通过注册表修改为0-255之间的值。然后我们管每一个路由器叫做每一跳,就是每经路由器转发一次,TTL的值都会减1,如果出现死循环则TTL值将一直减1直至为0。当TTL为0时,连接超时,数据发送失败。所以根据这个原理,我们可以检测你当期的机器跟某服务器之间,经过了多少个路由的转发。如检测与百度服务器的路由次数,具体检测方法如下:

  • 1)使用 ping 127.0.0.1 查看链接本机时的TTL是多少,如128,
  • 2)使用 ping baidu.com 查看链接百度时的TTL是多少,如50.
  • 3)根据两个结果计算128 – 50 = 78,那么上述机器与百度的通信之间就经过了78次路由转发.

(小兵我测试时是在广州,百度的服务器是在北京,也就是说,78次路由转发之后,我的数据包就从广州到北京了)

例2:路由器的工作原理说明

在下图的网络环境中,假设网络A中的用户A1要向网络C的用户C3发送一个请求信号时,那信号的传递步骤是怎样的?

信号的传递步骤如下:

1)用户A1将目的用户C3的IP地址C3,连同数据信息以数据帧的形式通过集线器或交换机以广播的形式发送给同一网络中的所有节点(即A2、A3、A4、A5都会被广播到),A2、A3、A4发现A1不是跟他们说话,所以不会回应,但当路由器A5端口侦听到这个地址后,分析得知所发消息的目的节点不是本网段的,需要路由转发,就把数据帧接收下来。即数据从A1->A5。

2)路由器A5端口接收到用户A1的数据帧后,先从包头中取出目的用户C3的IP地址,并根据路由器A5的路由表计算前往用户C3的最佳路径(寻址)。因为从分析得知到C3网络的ID号与路由器C5的网络ID号相同,所以由路由器A5端口直接发向路由器C5端口应是信号传递的最佳途径。所以C3把数据路由转发给C5。即数据从A5->C5。

3)路由器C5端口再次取出目的用户C3的IP地址,发现C3确实就在本网络中,于是路由器C5将数据转发到交换机。交换机收到数据发现帧中的目的MAC是C3,然后它就查看自己维护的MAC地址表,如果自己维护的MAC地址表里面没有这个MAC地址,那么它会再通过广播的方式广播给C1、C2、C3、C4来认领。然后C3发现就是找自己的,于是C3回应给交换机,交换机就把数据转给了C3,同时交换机把C3的MAC地址记录到自己MAC地址表中,下次再来找C3的时候,就不用广播而是直接从MAC地址表找到C3了。最终就是C3收到了A1发来的消息。

所以OSI七层模型的低三层功能总结如下:

  • 物理层实现了物理设备间数据的传输;
  • 数据链路层实现了局域网内数据的传输;
  • 网络层实现了不同网络间数据的传输;

传输层

看完了上面的三层协议,我们知道通过ip地址和mac地址可以找到某个网络中的目标主机了,我们又知道,我们计算机上是有很多应用程序的,如QQ、微信、淘宝。那么怎么找到目标主机应用进程呢,我用QQ发的消息总不能发到对方的淘宝去吧,小马哥也不答应,所以肯定也得有一个东西来标识目标主机的应用程序,那就是我们常说的端口了,端口即应用程序与网卡关联的编号。传输层协议通过指定端口号就可以识别目标进程。即传输层为应用进程之间提供端口到端口的通信。传输层通过端口怎么实现通信的呢?主要是靠它的两个协议,TCP协议和UDP协议。

  • TCP协议

TCP(Transmission Control Protocol 传输控制协议)是面向连接的、可靠传输的协议。同时具有流量控制拥塞控制面向字节流传输等特点

面向连接:就是说应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。(即三次握手与四次挥手)

可靠传输就是说通过TCP连接保证传送的数据,无差错、不丢失、不重复、并且按序到达TCP通过数据分段、接收确认和超时重传等方式来实现。

流量控制TCP提供全双工通信,会话双方都可以同时接收和发送数据。都设有接收缓存和发送缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给发送缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入接收缓存,上层的应用进程在合适的时候读取接收缓存中的数据,对其进行处理。如果发送端的发送速度太快,导致接收端的接收缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。所以TCP根据接收端对数据的处理能力,决定发送端的发送速度,防止发送端发送过快,这个机制就是流量控制。TCP通过滑动窗口的概念来进行流量控制。

滑动窗口协议:允许发送方在收到确认报文前发送个数据分组,而不必每发送一个分组就停下来等待确认。因此该协议可以高效可靠地发送大量的数据。如果发送方收到接收方的窗口大小为0的TCP数据报,代表此时接收方的接收缓存已经充满,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。

拥塞控制:如果TCP在启动一个连接的时马上向网络发送大量数据包,可能会导致路由器或链路负载过量,产生网络拥塞,使得TCP连接的吞吐量急剧下降。由于TCP源端无法知道网络资源当前的使用情况,因此新建立的TCP连接不能一开始就发送大量数据,只能逐步增加每次发送的数据量,以避免上述现象的发生。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。常用的方法就是:1. 慢开始、拥塞控制  2. 快重传、快恢复。(具体实现就不贴出来了)

流量控制和拥塞控制的现象都是丢包,实现机制都是让发送方发的慢一点,发的少一点。但流量控制丢包位置是在接收端上,拥塞控制丢包位置是在路由器上。流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理,拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理。

面向字节流:指的是TCP将应用层数据看成是一连串的无结构的字节流,通过TCP连接传输到对面的应用层。对于太长的数据,TCP会将数据流分成适当长度的报文段,之后会将数据包发送给网络层,然后通过各种网络协议将数据包发送至接收端的传输层。在这过程中,传输层为了保证数据在传输中不发生丢包的现象,因此给每一个数据包标注一个序号,保证了接收端可以按照数据包的按序接收。

说TCP是面向字节流的指的是在应用层,数据以字节流的形式通过TCP连接在应用进程之间传送。TCP报文段指的是应用层数据向下到达传输层时以TCP报文段的形式向网络层传送。)

这里要补充一个【TCP分段与IP分片】的概念。

TCP/IP协议

即传输控制协议/因特网互联协议,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 简单讲就是定义了电子设备如何实现连接,以及数据如何在它们之间传输的标准。

IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许不同网络之间的主机互相通信。但IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。

 

  • UDP协议

UDP(User Data Protocol,用户数据报协议)是面向非连接传输不可靠的协议。适用于传输少量数据,速度较快。

面向非连接即通信前不必与对方建立连接,不管对方状态就直接发送,所以速度很快。如QQ。

传输不可靠指UDP协议只是保证尽最大努力传输,但对数据的完整性和正确性不做保证。如在线视频、网络语音电话等。

会话层

  会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。如服务器验证用户登录便是由会话层完成的。

表示层

  表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。

应用层

  应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。主要功能是为用户提供服务,如文件服务、目录服务、文件传输服务(FTP)、远程登录服务(Telnet)、电子邮件服务(E-mail)、数据库服务等。上述的各种网络服务由该层的不同应用协议和程序完成。及对应的各种程序协议,如FTP、SMTP、POP3 、HTTP。用户使用的都是应用程序,均工作于应用层。互联网是开放的,我们都可以开发自己的应用程序。(下面讲解一个应用层中较为重要的HTTP协议)

  • HTTP协议

  HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传送协议。它基于TCP协议,由HTTP客户端向服务器发起一个请求,HTTP服务器一旦收到请求,将向客户端发回一个状态行,比如"HTTP/1.1 200 OK",和响应的消息。(消息的消息体可能是请求的文件、错误消息、或者其它信息)

       HTTP协议比较重要的的两个特点:无连接、无状态

  • 无连接:无连接的含义是限制每次连接只处理一个请求。HTTP1.0时,每个http请求都会打开一个tcp连接,并且请求过后就断开这个tcp连接。随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。HTTP1.1后,Keep-Alive 被提出用来解决这效率低的问题。Keep-Alive 功能使客户端到服务器端的连接持续有效,即一次TCP连接内客户端可以发起多次请求,Keep-Alive 功能就省去了建立或者重新建立连接的时间。虽然说Keep-Alive使用了长连接优化了效率,但这是属于HTTP请求之外的,我们始终都要认为HTTP请求在结束后连接就会关闭。这是HTTP的特性。至于下层实现是否在结束请求后关闭连接,都不会改变这个特性。所以我们说HTTP协议是无连接的。

  • 无状态:HTTP协议是无状态协议。指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。我们通过cookie、session等技术可以使得客户端和服务器保持状态。但是HTTP协议本身是没有状态的。

下面来看一下HTTP报文的结构。

请求报文由四部分构成,即请求行、请求头部、空行和请求数据

请求报文中的首个字段,即请求方法,就是我们常见的GET、POST。此外还有HEAD、PUT、DELETE等。

响应报文也由四部分构成,即状态行、消息头部、空行和响应数据

关于HTTP就不再展开更多了,有需要的可以自己看看HTTP相关面试题。另外可以了解一下HTTP2、HTTP3的内容

总结

这时候再看一下这几个图。

       相信你已经对“说一下从输入网址到获得页面的过程是怎样的?”、“如何实现两台计算机通信”等问题有了一个比较清楚的了解。在分析时,我们从“实现两台计算机通信”这个需求开始,说到了我们生活中常见的网线,即底层的物理层,物理层为物理设备间提供了数据通道,实现了数据传输。然后说到了以太网,说到了网卡,说到了MAC地址唯一标识我们的计算机,借助交换机等设备,数据链路层实现了局域网内计算机间的数据传输,然后我们继续向更广阔的空间进发,从局域网到广域网到互联网,通过网络层,我们能够实现跨地域、跨国界的计算机资源共享。然后到了传输层,通过端口的概念,我们知道了原来具体参与通信的是计算机上的某个应用程序,通过传输层中的TCP和UDP协议,我们又了解了计算机通信中的一些特点和怎么解决通信时出现的一些问题(三次握手、滑动窗口、拥塞控制、四次挥手等),最后到了应用层,我们比较着重的介绍了我们最常用的HTTP协议。

       不知不觉也写了近3万字,在介绍每一层的时候,小兵都参考了比较多的文章和资料,尽量争取把每一层都浅显清晰地讲清楚。因为刚看这几层时发现很多地方描述得都比较大概,对于刚入门的人极不友好,根本不能从那些一鳞半爪的描述中把这几层的脉络和关键点联系起来,导致看完之后自己都是一知半解。如果不是自己真正去理解去内化,到被问到的时候,是很难答得出来的。所以,我们学东西还是得看自己,主动学,主动记,小兵这里也只是把我自己的认识写出来,还有很多说不对、说不全的地方,这些地方,就得你自己去甄别和补充了。

       最后,感谢冯诺依曼,感谢各位前辈大牛。怎么就想出了计算机这种东西,怎么就提出了计算机网络这种概念,实在佩服。

猜你喜欢

转载自blog.csdn.net/HelloWorld_In_Java/article/details/93394999