网络分层

image.png

应用层(可直接交互的结构/提供用户与网络之间的接口服务和规范)

应用层的任务是通过网络进程间的相互通信来完成特定的功能。应用层协议定义的是应用进程间的通信和交互规则。对于不同的网络应用或者需求,在应用层中有着不同的应用层协议,这些协议的主要作用是定义应用进程间通信的规则,例如交换报文的类型、报文语法(报文中的各个字段以及这些字段是如何描述的)、字段的含义等。具体的协议有Web的HTTP协议、电子邮件的SMTP、域名系统DNS(网络名字到网络地址的转换)等。

HTTP协议

Web的应用层协议是HTTP协议,HTTP由两个程序实现:一个客户程序和一个服务器程序。两个程序可以运行在不同的端系统中,并通过HTTP报文进行会话。而HTTP会定义这些报文的结构以及客户和服务器进行报文交换的方式。HTTP使用了TCP作为运输协议,HTTP通信的大体流程是:客户端先发起一个与服务器端的TCP链接,链接建立后客户端向服务端的套接字接口发送请求报文然后接收服务器套接字接口的响应报文。 HTTP是无状态的,无状态的意思是服务器想客户发送被请求的文件,而不会存储任何关于客户的状态信息,即同一或不同客户的上一次请求不会影响到这一次的请求。 面试回答:HTTP是Web的应用层协议,HTTP由两个主机实现:客户端、服务端。两个主机可以在不同端系统中,通过HTTP报文进行会话。HTTP协议定义了报文的结构和交换方式。并且使用了TCP作为运输协议。HTTP是无状态的,即服务端不存储客户端的状态信息,所以客户端的请求之间互相不影响。 TCP:TCP是因特网运输层的面向连接的可靠的运输协议。TCP之所以是面向链接的,是因为在传输数据时,两个进程间会先进行握手、相互发送预备报文段,以确保两台主机能正常收发数据。(可靠是因为采取了可靠数据传输机制) IP:IP是无连接的,所以不会占用两个正在通信的计算机之间的通信线路(主要用于计算机之间的通信)。 TCP/IP:TCP/IP 是基于 TCP 和 IP 这两个最初的协议之上的不同的通信协议的大集合。 TCP/IP 意味着 TCP 和 IP 在一起协同工作。 TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。 IP 负责计算机之间的通信。 TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。 IP 负责将包发送至接受者。 在TCP/IP中包含一系列用于处理数据通信的协议:

  • TCP:应用程序之间通信
  • UDP:应用程序之间的简单通信
  • IP:计算机之间的通信
  • ICMP:针对错误和状态
  • DHCP:针对动态寻址

域名系统(DNS)

域名系统(Domain Name System 缩写 DNS,Domain Name 被译为域名)是因特网的一项核心服务,它作为可以将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。(百度百科)例如:一个公司的 Web 网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco 公司的域名是 www.cisco.com 等。

运输层(主机通信的桥梁,向上层提供一个可靠的端到端服务,使会话层不知道传输层以下的数据通信的细节)

运输层的主要任务是负责向两台主机进程之间的通信(应用层)提供数据传输服务。应用进程利用运输层的服务传送应用层的报文。由于一台主机可以同时运行多个进程,因此运输层有复用和分用的功能。复用是指多个应用层进程可以同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面的应用层中的相应进程。
运输层主要使用两种协议:

  1. 运输控制协议TCP:包括面向链接服务可靠数据运输服务。
  2. 用户数据协议UDP:UDP是无连接的,并且仅提供最小服务不提供不必要服务的轻量级运输服务。它不保证数据传输的可靠性。

    网络层(保证“桥梁”准确送达/为要传输的分组选择合适的路径/通信子网)(单位:分组)

    计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。(运输层的“用户数据报UDP”和网络层的“IP数据报”不一样
    网络层中的网络并不是通常的具体网络,而是特指计算机网络体系结构模型中第三层的名称。
    互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Internet Protocol)和许多路由选择协议,因此互联网的网络层也叫做网际层IP 层

    数据链路层(审核、规范数据)(单位:帧/数据帧)

    数据链路层简称链路层。两台主机之间的数据传输,由于总是在一段一段的链路上传送的,这就需要专门的链路层的协议。在两个相邻节点之间传送数据时,链路层将网络层交下来的IP数据报组成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息。
    接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,链路层在收到一个帧后,就可以从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

    物理层(确保原始的数据可在各种物理媒体上传输/为数据传输提供可靠的物理环境【电缆\光纤\无线信道】)(单位:比特/比特流)

    在物理层上所传送的数据单位是比特。
    物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
    在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定单指 TCP 和 IP 这两个具体的协议,而往往表示互联网所使用的整个 TCP/IP 协议族。

七层体系结构图.png

面试常见问题总结

TCP三次握手和四次挥手

目的:TCP协议采用了三次握手策略是为了准确无误的将数据送至目标主机。

三次握手解释

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。

SYN解释

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

计网八股文 - 图3
计网八股文 - 图4
image.png

四次挥手解释

四次挥手图

四次挥手过程:

  • 客户端发送一个FIN,用于关闭客户端到服务器的数据传送。
  • 服务器端收到FIN,并且返回一个ACK,确认序号为收到的FIN序号+1。一个FIN占用一个序号。
  • 服务器端关闭与客户端的链接,发送一个FIN给客户端。
  • 客户端发回之前收到的ACK报文,并将确认序号+1。

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

详细过程
  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

四次挥手详图

为什么客户端还需要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为什么建立连接是三次握手,关闭连接确实四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 (1)第一次挥手 因此当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。 (2)第二次挥手 被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)。 (3)第三次挥手 被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。 (4)第四挥手 如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态

TCP和UDP的区别

  • UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。
  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务,这难以避免增加了许多开销,

tcp VS udp.jpg

TCP协议如何保证可靠传输

  1. 应用数据被分割为TCP认为最适合发送的数据块
  2. TCP给发送的每一个包都进行编号、排序
  3. TCP接收端会丢弃重复的数据
  4. 校验和:TCP保持着首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的一致性。如果校验和有差错,TCP会对其这个报文段。
  5. 流量控制:TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
  6. ARQ协议:是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  7. 超时重传:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

数据是如何在各层之间传输的

  • 对于发送方:从上层到下层 层层包装
  • 对于接收方:从下层到上层,层层拆包

在浏览器中输入URL地址 >>> 显示主页的过程

计网八股文 - 图9

  1. DNS 解析
  2. TCP 连接(与服务器三次握手建立TCP链接)
  3. 发送 HTTP 请求(请求报文)
  4. 服务器处理请求并返回数据( HTTP响应报文)
  5. 浏览器解析渲染页面
  6. TCP四次挥手断开连接

URL和URI的区别

  • URI是统一资源标志符,可以唯一标示一个资源。
  • URL是同一资源定位符,可以提供该资源的路径。它是一种具体的URI(即URL可以用来标示一个资源,而且还指名了如何locate这个资源)

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

状态码

状态码

HTTP长链接、短连接

在HTTP/1.0中默认使用短连接。
短连接:客户端和服务器每进行一次HTTP操作,就建立一次链接,任务结束就中断链接。当客户端浏览器访问的某个HTML中包含其他Web资源,浏览器就会重新建立一个HTTP会话。
长链接:在使用长链接时,当打开一个网页后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,客户端再次访问这个服务器时,会继续使用这条已经建立的链接。
HTTP协议的长链接短连接也是TCP协议的长链接短连接。

HTTP是无状态的,那么它是如何保存用户状态的呢?

可以使用Session机制来保存用户状态或一些数据。服务端可以给特定的用户创建特定的Session,然后就可以标识这个用户并且跟踪这个用户。Session是存在服务端的,要实现Session跟踪可以通过在Cookie中附加一个Session ID的方式来跟踪。如果Cookie被禁用,可以利用URL重写将Session ID直接附加在URL路径后。

Cookie是什么?和Session有什么区别?

Cookie和Session都是用来跟踪浏览器用户身份的会话方式,主要区别在于应用场景。
Cookie(一般用来保存用户信息):

  1. 在Cookie中保存以及登陆过的用户信息,主要的实现有:浏览器的表单填充功能。
  2. 登陆时的ReadMe功能,这是因为在用户第一次或重新登陆时会存放一个Token在Cookie中,下次登陆时浏览器只需要拿到Token进行校验即可。
  3. 单点登录功能。

Session(主要作用是通过服务端记录用户的状态):

  1. 购物车功能

物理区别:Cookie数据保存在客户端,Session数据保存在服务端。

HTTP1.0和HTTP1.1的主要区别

  1. 长、短链接:1.0时默认使用短连接,1.1默认使用长链接
  2. 错误状态响应码:新增了一些错误状态码
  3. 缓存处理:1.1引入了更多的缓存控制策略
  4. 带宽优化以及网络连接的使用:HTTP1.0中存在一些浪费带宽的现象,例如:客户端只需要某个对象的一部分,而服务器将整个对象直接传输过来(不支持断点续传);HTTP1.1则在头部引入了range头域,它允许只请求资源的某个部分(返回码为206)。

HTTP和HTTPS的区别

  1. 端口:HTTP的URL由http://起,且默认为80端口;HTTPS的URL由https://起,且默认端口为443
  2. 安全性和资源消耗:HTTP协议建立在TCP之上,所有运输的内容都是明文的,客户端和服务端都无法验证对方的身份;HTTPS是建立在SSL/TLS之上HTTP协议,SSL/TLS运行在TCP之上,所有的传输内容都经过对称加密,但对称加密的密钥用服务器方的证书采用了非对称加密。所以HTTP的安全性没有HTTPS高。但HTTPS比HTTP更耗费服务器资源。