导言

      计算机网络体系结构分为三种:OSI(open system interconnect)体系结构(七层)、TCP/IP体系结构(四层)、五层体系结构。

OSI体系结构:概念清楚,理论也比较完整,但它既复杂又不实用;

TCP/IP体系结构:四层体系结构,得到了广泛的应用;

五层体系结构:为了方便学习,这种OSI体系结构和TCP/IP体系结构,既简洁又能将概念讲清楚。

网络体系架构包括 网络体系结构分类_网络

TCP/IP 与 OSI最大的不同:OSI是一个理论上的网络通信模型,而TCP/IP则是实际运行的网络协议。

 为什么分七层:支持异构网络的互联互通。

1. OSI 与 TCP/IP各层的结构与功能,都有哪些协议?

(1)应用层

应用层的任务是通过进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程)间通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。应用层交互的数据单元称为报文。

(2)运输层

运输层的主要任务是负责向两台主机进程之间的通信提供通用的数据传输服务。进程利用该服务传送应用层报文。”通用的“是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。

    运输层主要使用以下两种协议

a. 传输控制协议TCP(Transmission Control Protocol):提供面向连接的(也就是说在收发数据之前,必须和对方建立可靠的连接)、可靠的数据传输服务。;

      b. 用户数据协议UDP(User Datagram Protocol):提供无连接的,尽最大努力的数据传输服务,但不保证数据传输的可靠性。

(3)网络层

        在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还有经过很多通信子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫组IP数据报,简称数据报。

  注意:不要把运输层的”用户数据报“和网络层的”IP数据报“弄混。另外,无论是哪一层的数据单元,都可笼统的用”分组“表示。

(4)数据链路层

数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息。

(5)物理层

        在物理层上传送的数据单位是比特。物理层的作用是保证数据可以在各种物理媒介上进行传送,为数据的传输提供可靠的环境。

网络体系架构包括 网络体系结构分类_TCP_02

⭐ 2. TCP三次握手

        为了准确无误的把数据送到目标处,TCP协议采用了三次握手策略。介绍几个重要字段的全称:

  seq(sequence number):序号

  ack(acknowledgement number):确认号

  标志位:SYN,同步; ACK,确认; FIN,终止。

网络体系架构包括 网络体系结构分类_网络协议_03

(1)三次握手的过程 

        第一次握手:Client将同步标志位SYN置为1(SYN为1就表示要建立连接,连接成功之后该位置会再次被置为0),请求序号seq=x(在所有的字节排列中,申请从哪一个字节开始发送,这个序号就一般表示当前已经发送到哪个序号,服务器同意后将会从下一个序号开始发送,第一次握手只有请求序号没有确认号),并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

        第二次握手:Server收到数据包后由同步标志位SYN=1知道Client请求建立连接,确认标志位ACK置为1(这会才有确认标志位,第一次握手并没有确认标志位。当确认标志位为0时,确认号不起作用),ack=x+1(确认序号等于请求序号+1,表示x+1之前的Server都收到了,从Server发送的请求已经收到)。TCP是全双工协议,因此Server有可能也会给Client发送数据,因此Server也会向Client建立连接,Server将同步标志位SYN置为1(Server也要向Client发送请求,因此SYN也要被置为1),seq=y就表示Server给Client发送的数据开始序号。并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
        第三次握手:因为连接要是双向的,Server确认后只是Client到Server连通了,因此Client也要确认一下,才能让Server向Client的连接也连通。Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

(2)总结三次握手

        客户端 - 发送带有SYN标志的数据包 - 一次握手 - 服务器

        服务器- 发送带有SYN/ACK标志的数据包 - 二次握手 - 客户端

        客户端 - 发送带有ACK标志的数据包 - 三次握手 - 服务器

(3)为什么要三次握手?

      目的是为了建立可靠的通信信道,让双方确认自己与对方的发送与接收是正常的。

   第一次握手:client什么都不用确认;server确认对方发送正常,自己接收正常;

   第二次握手:client确认了自己发送、接收正常,且对方发送、接收正常;server确认了对方发送正常,自己接收正常;

   第三次握手:client确认了自己发送、接收正常,且对方发送、接收正常;server确认了对方发送、接收正常,自己发送、接收正常;

(4)为什么要传回SYN?

        接收端传回发送端所发送的SYN,是为了告诉发送端,接收端收到的信息确实是发送端所发出的信号。

(5)传了SYN,为什么还要传ACK?

        双方通信无误必须是两者互相发送信息都可以完成。传了SYN,证明发送端到接收端的通道是没有问题的,但接收端到发送端的通道还需要ACK信号来验证。

⭐ 3. TCP四次挥手

终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端相互总共发送4个包以确认连接的断开。

网络体系架构包括 网络体系结构分类_TCP_04

(1)四次挥手过程

第一次挥手:Client发送一个FIN,以及选择号seq=u(表示:u之前的数据已经全部发送,并且数据发到u就可以截止了,就不再有数据了),用来关闭Client到Server的数据传送。Client进入FIN_WAIT_1状态。

    第二次挥手:Server收到FIN后,发送一个请求号seq=v和确认序号ack=u+1给Client。Server进入CLOSE_WAIT状态。
    第三次挥手:Server发送一个FIN,请求号为最新的seq=w和确认序号ack=u+1,用来关闭Server到Client的数据传送。Server进入LAST_ACK状态。

    第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为w+1。Server进入CLOSED状态,完成四次挥手。

(2)四次挥手总结

        第一次挥手:客户端 - 发送一个FIN,用来关闭客户端到服务器的数据传送;

        第二次挥手:服务器 - 收到这个FIN,它发回一个ACK,确认序号为收到的序号+1。和SYN一样,一个FIN将占用一个序号;

    第三次挥手:服务器 - 关闭与客户端的连接,发送一个FIN给客户端;

第四次挥手:客户端 - 发回ACK报文确认,并将确认序号设置为收到序号+1.

(3)为什么要四次挥手?

        任何一方都可以在数据传送结束之后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放的通知,对方确认后就完全关闭了TCP连接。

        由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭。这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了。但是在这个TCP连接上仍然能够发送数据,直到另一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

4. TCP 和 UDP协议的区别

网络体系架构包括 网络体系结构分类_TCP_05

(1)UDP        

即时通信),如直播、QQ语音、QQ视频等。

(2)TCP

文件传输、发送和接收邮件、远程登录等场景。

5. TCP协议如何保证可靠传输?

(1)应用数据被分割成TCP认为最适合发送的数据块;

(2)TCP给发送的每一个包进行编号,接收方对包进行排序,把有序数据传送给应用层;

(3)校验和:TCP将保持它首部和数据的检验和。接收方在接收数据时检验数据包在传输过程中是否改变的验证方式;

(4)TCP的接收端会丢弃重复数据;

(5)流量控制:TCP利用滑动窗口实现流量控制。TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收缓冲区能够接收的数据。当接收方来不及处理发送方的数据,能够提示发送方降低发送速率,防止包丢失;

(6)拥塞控制:当网络拥塞时,减少数据的发送;

(7)ARQ协议:基本原理是每发完一个分组,就停止发送,等待对方确认。在得到对方确认后,继续发送下一个分组;

(8)超时重传:当TCP发出一个段后,会启动一个定时器,等待目标端确认收到这个报文段。如果不能及时收到确认,则会重新发送这个段。

6. ARQ协议

        自动重传请求(ARQ)是OSI中数据链路层和传输层的错误纠正协议之一。它通过使⽤确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后⼀段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议。

(1)停止等待ARQ协议

        为了实现可靠传输,它的基本原理是每发完一个分组就停止发送,等待对方确认(回复ACK)。如果过了一段时间(超过时间后),还没有收到ACK确认,说明发送失败,需要重新发送,直到收到确认后再发下一个分组。在该协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。简单,但信道利用率低、等待时间长。

   1)无差错情况:发送方发送分组,接收方在规定时间内收到,并回复确认;发送方再次发送。

   2)出现差错情况(超时重传):停止等待协议中超时重传是指只要超过一段时间仍然没有收到回复,就重传前面发送过的分组(认为刚才发送的分组丢失了)。因此,每发完一个分组需要设置一个超时计数器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。另外,在停止协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。

   3)确认丢失和确认迟到: 

两点措施:丢弃这个重复的M1消息,不向上交付;向A发送确认消息(A再次发送了M1,说明B的确认消息丢失了)。

处理如下:1. A收到重复的确认后,直接丢弃;2. B收到重复的M1 后,也直接丢弃重复的M1。

(2)连续ARQ协议

        连续ARQ协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组已经收到了。

      优点:信道利用率高,容易实现,即使确认丢失,也不必重传。

      缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。比如,发送方发送了5条消息。    ,中间第3条丢失,这时接收方只能对前2条发送确认。发送方无法知道后3个分组的下落,只能把后3个都重传一遍。这也叫Go-Back-N(回退N),表示需要退出来重传已经发送过的N个消息。   

7. 滑动窗口和流量控制

       TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方的发送速率,来保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方的窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。

8. 拥塞控制

      在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器以及与降低网络传输性能相关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的是抑制发送端发送数据的效率,以便接收端来得及接收。

      为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(cwnd)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,且动态变化。

拥塞控制采用了4种算法,即慢开始、拥塞避免、快重传和快恢复。在网络层也可以使用路由器采用适当的分组丢弃策略(如主动队列管理),以减少网络拥塞的发生。

18. DNS

        DNS(域名系统),因特网上作为域名和IP地址相互映射的分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器识别的IP数字串。

域名解析(主机名解析)。

       域名解析使用UDP协议,因为UDP协议快。区域传送用TCP协议,因为TCP协议可靠性好。

19. DNS工作原理

(1)域名结构

www.      zhihu.         com          .
三级域     二级域          顶级域        根域

www.      zhihu.       com.       cn         .
四级域     三级域        二级域      顶级域      根域

(2)域名服务器 

网络体系架构包括 网络体系结构分类_网络_06

 根域名服务器:最高层次的域名服务器。很多情况下,根域名服务器并不会直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器进行查询。

    顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。

递归查询(没有查到,则继续向其他域名服务器发出查询请求)。

迭代查询(要么告知IP地址,要么告知下一步向谁发出查询请求)。

(3)工作流程

    01 当用户输入域名时,浏览器先检查自己的缓存中是否包含这个域名对应的IP地址,有则解析结束;

02 若没有,则检查操作系统缓存中是否有,有解析结束(如Windows的hosts文件);

  03 若没有,则请求本地域名服务器解析(LDNS);

04

    05 此时,LDNS再发送请求到上一步返回的顶级域(gTLD),接收请求的gTLD查找并返回这个域名地址对应的Name Server(域名服务器);

06 Name Server根据映射找到目标ip,返回给LDNS;

07

⭐ 9. 在浏览器中输入url地址   --> 显示主页的过程,或一次完整的http请求

 (1)DNS解析域名:浏览器解析输入的URL,发出DNS请求解析域名,查询服务器域名对应的IP地址,并生成HTTP请求报文。

(2)发起TCP的三次握手

(3)建立TCP连接后发起HTTP请求

(4)服务器响应http请求,浏览器得到html代码

(5)浏览器解析html代码,并请求html代码中的资源

(6)浏览器对页面进行渲染呈现给用户

10. HTTP状态码

网络体系架构包括 网络体系结构分类_网络体系架构包括_07

11. 各种协议与HTTP之间的关系

        用户发起请求,首先发给DNS服务器进行域名解析,得到IP地址后生成针对目标Web服务器的HTTP请求报文,然后报文由TCP协议负责传输。为了方便通信,HTTP请求报文被分为报文段,每个报文段可靠的传输给对方。报文段由IP层负责一边中转一边传送,服务器收到报文段后重组报文段,然后由应用层的HTTP协议处理请求的内容,请求的结果以同样的方式进行回传。

网络体系架构包括 网络体系结构分类_网络协议_08

HTTP协议与TCP/IP协议的关系:

        也就是说,HTTP 的长连接和短连接本质上是 TCP 长连接和短连接。HTTP 属于应用层协议,在传输层使用 TCP 协议,在网络层使用 IP 协议。IP 协议主要解决网络路由和寻址问题,TCP 协议主要解决如何在 IP 层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP 有可靠,面向连接的特点。

12. HTTP长连接,短连接

HTTP/1.0中默认使⽤短连接。也就是说,客户端和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web⻚中包含有其他的Web资源(如 JavaScript⽂件、图像⽂件、CSS⽂件等),每遇到这样⼀个Web资源,浏览器就会重新建⽴⼀个HTTP会话。

HTTP/1.1起,默认使⽤⻓连接,⽤以保持连接特性。使⽤⻓连接的HTTP协议,会在响应头加⼊这⾏代码:

Connection:keep-alive

在使⽤⻓连接的情况下,当⼀个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使⽤这⼀条已经建立的连接。Keep-Alive不会永久保持连接,它有⼀个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

      长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源、点对点的通讯、且连接数不太多的情况下采用长连接比较合适。

      短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。像 Web 网站的 http 服务一般都用短连接。

13.1 如何理解 HTTP 协议是无状态的?

        HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。(也就是说,HTTP 协议⾃身不对请求和响应之间的通信状态进⾏保存。)也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。

        HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议。

13. HTTP是不保存状态的协议,那么如何保存用户状态?

Session的主要作用就是通过服务端记录用户的状态。典型的场景是购物⻋,当你要添加商品到购物⻋的时候,系统不知道是哪个⽤户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(⼀般情况下,服务器会在⼀定时间内保存这个 Session,过了时间限制,就会销毁这个Session)。

 在服务端保存 Session 的方法很多,最常用的就是内存和数据库(⽐如是使用内存数据库redis保存)。 既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加⼀个 Session ID 的⽅式来跟踪。

       Cookie被禁用了,怎么办?利用URL重写,把Session ID直接附加在URL路径的后面。

14.Cookie的作用是什么?和Session有什么区别?

Cookie和Session都是用来跟踪浏览器用户身份的会话方式,但两者的应用场景不太一样。

      Cookie一般用来保存用户信息,比如①在Cookie中保存已经登录过的用户信息,下次访问网站的时候页面可以自动把登录的一些基本信息给填了;②一般的网站都会有保持登录,也就是说下次再访问网站的时候就不需要重新登录了;③登录一次网站后,访问网站的其他不需要重新登录。

      Session的主要作用是通过服务端记录用户的状态。典型的场景是购物⻋,当你要添加商品到购物⻋的时候,系统不知道是哪个⽤户操作 的,因为 HTTP 协议是⽆状态的。服务端给特定的⽤户创建特定的 Session 之后就可以标识这个⽤户 并且跟踪这个⽤户了。

      Cookie数据保存在客户端(浏览器端),Session数据保存在服务器端。相对来说,Session安全性更高。

15. HTTP1.0 和 HTTP1.1的主要区别是什么?

(1)长连接:HTTP/1.0中,默认使用短连接,也就是说每次请求都要重新建立一次连接。HTTP是基于TCP/IP协议的,每一次建立或断开都需要三次握手或四次挥手,开销比较大。HTTP/1.1起默认使用长连接,默认开启Connection:keep-alive。HTTP/1.1的持续连接有流水线方式和非流水线方式。

(2)错误状态响应码:在HTTP/1.1中新增了24个错误状态响应码,如409表示请求的资源与资源的当前状态发生冲突,410表示服务器上的某个资源被永久性的删除。

(3)缓存处理:在HTTP/1.0中主要使用header里的If-Modified-Since,Expires来做缓存判断的标准。HTTP/1.1则引入了更多的缓存控制策略,如Entity tag等。

(4)带宽优化及网络连接的使用:HTTP/1.0中,存在亦希望我浪费带宽的现象,例如客户端只需要某个对象的⼀部分,⽽服务器却将整个对象送过来了,并且不⽀持断点续传功能。HTTP/1.1则在请求头引入了range头域,它允许只请求资源的某一部分。

16. URL 和 URI的区别是什么?

    URI(Uniform Resource Identifier) :统⼀资源标志符,可以唯⼀标识⼀个资源。

    URL(Uniform Resource Location) :统⼀资源定位符,可以提供该资源的路径。它是⼀种具体的URI,即 URL 可以⽤来标识⼀个资源,⽽且还指明了如何定位这个资源。

        URI的作⽤像身份证号⼀样,URL的作⽤更像家庭住址⼀样。URL是⼀种具体的URI,它不仅唯⼀标识资源,⽽且还提供了定位该资源的信息。

17. HTTP 和 HTTPS 的区别?

    URL分为两部分,通信协议和域名地址,

网络体系架构包括 网络体系结构分类_网络_09

(1)端口

        HTTP 的 URL 由 “http://” 起始且默认使⽤端⼝80,⽽ HTTPS 的 URL 由“ https://” 起始且默认使⽤端口443。

(2)安全性和资源消耗

        HTTP协议也就是超文本传输协议,运行在TCP之上,所有传输的内容都是明文,不提供任何方式的数据加密,客户端和服务器端都⽆法验证对⽅的身份。假如你在一个HTTP协议的网站上面购物,你需要在页面上输入你的银行卡号和密码,然后你把数据提交到服务器实现购买。假如这个环节稍有不慎,你的传输数据被第三者给截获了,由于HTTP明文数据传输的原因,你的银行卡号和密码,将会被这个截获人所得到。

        HTTPS 协议也就是安全套接字层超文本传输协议,是为了解决 HTTP 协议的缺陷提出的,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS 协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密。在数据进行传输之前,对数据进行加密,然后再发送到服务器。所以说,HTTPS安全性比 HTTP⾼,但HTTPS ⽐HTTP耗费更多服务器资源。