计算机网络面试题

应用层有哪些常见的协议?

HTTP:超文本传输协议

超文本传输协议(HTTP,Hyper Text Transfer Protocol)主要是为了Web浏览器与Web服务器之间的通信而涉及的,当我们使用浏览器浏览网页的时候,我们网页就是通过HTTP请求进行加载的。

 HTTP协议是基于TCP协议,发送HTTP请求之前首先要建立TCP连接也就是要经历3次握手。目前使用的HTTP协议大部分都是1.1.在1.1的协议里面,默认是开启了Keep-Alive的,这样的话建立的连接就可以在多次请求中被复用了。

另外,HTTP协议是”无状态“的协议,它无法记录客户端用户的状态,一般我们都是通过Session来记录客户端用户的状态。

HTTP1.0、1.1、2.0

HTTP1.0:

(1)无状态,无连接

(2)短连接:每次发送请求都要重新建立TCP请求,即三次握手,非常浪费性能

(3)无host头域,也就是http请求头里的host

(4)不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象

HTTP1.1:

(1)长连接,流水线,使用connection:keep-alive使用长连接

(2)请求管道化

(3)增加缓冲处理(新的字段如cache-control)

(4)增加Host字段,支持断点传输等

(5)由于长连接会给服务器造成压力

HTTP2.0:

(1)二进制分帧

(2)头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小。

(3)多路复用(或共享连接),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求

(4)服务器推送

HTTP与HTTPs的区别

(1)https协议需要到CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。

(2)http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。

(3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.

(4)http的连接很简单,是无状态的。https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息)

HTTP原理

(1)客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,一般 TCP 连接的端
口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协
议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
(2)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或
错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。

HTTPS原理

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传
送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。

请描述一次完整的HTTP请求的过程是怎么样的?在浏览器输入一个URL,会发生什么?

 

 

 

①浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
②解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
③浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第
三个报文的数据发送给服务器;
④服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
⑤释放 TCP连接;
⑥浏览器将该 html 文本解析渲染并显示内容;

SMTP:简单邮件传输协议

简单邮件传输协议(STMP,Simple Mail Transfer Protocol)基于TCP协议,用来发送电子邮件。

注意:接受邮件的协议不是STMP而是POP3协议。

电子邮件的发送过程?

比如我的邮箱是qq邮箱,我要写163邮箱发送邮件,整个过程可以简单分为下面几步:
1.通过SMTP协议,我们将我写好的邮件交给163邮箱服务器(邮局)

2.163邮件服务器发现我发送的邮箱是qq邮箱,然后它使用SMTP协议转发到qq邮箱服务器。

3.qq邮箱服务器接受邮件之后就通知qq邮箱的用户来收邮件,然后用户就通过POP3/IMAP协议将邮件取出。

如何判断邮箱是真正存在的?

很多场景我们需要判断发送的邮箱地址是否真正存在,这个时候我们可以利用SMTP协议来检测:
1.查找邮箱域名对应的SMTP服务器地址

2.尝试与服务器建立连接

3.连接成功后尝试向需要验证的邮箱发送邮件

4.根据返回的结果来判断邮件地址的真实性。

POP3/IMAP:邮件接收的协议

这两个协议没必要做多阐述,只需要了解POP3和IMAP两个都是负责邮件接收的协议即可。另外,需要注意不要将这两者和SMTP协议搞混淆了。STMP协议只负责邮件的发送,真正负责接收的协议是POP3/IMAP。

IMAP协议比POP3新一点,为用户提供的可选功能也更多一点,几乎所有现在电子邮件客户端和服务器都支持IMAP。大部分网络邮件服务提供商都支持POP3和IMAP。

FTP:文件传输协议

FTP协议主要是提供文件传输服务,基于TCP实现可靠的传输。使用FTP传输文件的好处是可以屏蔽操作系统和文件存储方式。

FTP是基于客户-服务器(C/S)模型而设计的,在客户端与FTP服务器之间建立两个连接。

FTP的独特的优势同时也与其他客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条TCP连接(其他客户端服务器程序一般只有一条TCP连接)

1.控制连接:用于传送控制信息

2.数据连接:用于数据传输

 

 Telnet:远程登录协议

Telnet协议通过一个终端登录到其他服务器,建立在可靠的传输协议TCP之上。Telnet协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这就存在潜在的安全风险。这就是如今很少使用Telnet并被SSH的非常安全的协议取代的主要原因。

SSH:安全的网络传输协议

SSH(Secure Shell)是目前比较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄漏问题。SSH是建立在可靠的传输协议TCP之上的。

Telnet和SSH之间的主要区别在于SSH协议会对传输的数据进行加密保证数据的安全性。

DNS

TCP三次握手和四次挥手

 

 为什么要三次握手?

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

第一次握手:客户端什么都不能确认;服务端确认客户端正常发送服务端正常接收

第二次握手:客户端确认客户端发送正常,接收正常;服务端发送正常,接收正常。

第三次握手:服务端确认服务端发送正常,客户端接收正常。

所以三次握手就能确认双方收发功能都正常,缺一不可。

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

第二次握手传回了ACK,为什么还要传回SYN?

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

 

接受端传回发送端所发送的ACK是为了告诉客户端,我们接受到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信。

 

1.4 三次握手过程中可以携带数据吗?
其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据

为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

 

SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。

为什么要四次挥手

断开一个TCP连接则需要四次挥手:

客户端   发送一个FIN,用来关闭客户端到服务器的数据传输;

服务端   收到FIN,它发返回一个ACK发送给客户端(服务端可能还有数据需要传送);

服务端   关闭服务端到客户端的连接,发送FIN给客户端(服务端数据传输完成,发送数据告知客户端);

客户端   发送ACK报文确认(客户端发送信息,表示已经接收到关闭信息,通信正式关闭)

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

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。前两次挥手用于关闭一个方向的数据通道,后两次挥手用于关闭另一个数据通道。

TIME_WAIT状态需要保持2MSL.

MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。

原因:(1)保证TCP协议的全双工连接能够可靠关闭;(2)保证这次连接的重复数据段从网络中消失

为什么最后一次握手报文要等待2MSL?保证A发送的最后一个确认报文段能够达到B。如果A不等待2MSL,若A返回的最后确认报文丢失,则B不能进入正常关闭状态,而此时A已经关闭,也不可能再重传。

 

TCP,UDP协议的区别

 

 UDP在传送数据之前不需要建立连接,远地主机在收到报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式,比如:QQ语音,消息,直播等。

 

TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播。由于TCP提供可靠的,面向连接的传输服务(TCP的可靠体现在三次握手来建立连接,而且在数据传送数据时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约资源),这难免增加了许多开销,如确认,流量控制,计时器以及连接管理。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP一般用于文件传输、发送和接受邮件、远程登录等场景。

TCP协议如何保证可靠传输

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

ARQ 协议

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

停止等待 ARQ 协议

停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组。

在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

优缺点:

  • 优点: 简单
  • 缺点: 信道利用率低,等待时间长

1) 无差错情况:

发送方发送分组, 接收方在规定时间内收到, 并且回复确认. 发送方再次发送。

2) 出现差错情况(超时重传):

停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续 ARQ 协议 可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。

3) 确认丢失和确认迟到

  • 确认丢失 :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。(不会认为已经发送过了,就不再发送。A 能重传,就证明 B 的确认消息丢失)。
  • 确认迟到 :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。

连续 ARQ 协议

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

优缺点:

  • 优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
  • 缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

滑动窗口和流量控制

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

拥塞控制

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

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

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

  • 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
  • 拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1。
  • 快恢复:当发送方连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法,把慢开始门限ssthresh设置为此时发送方cwnd的一半。由于跳过了拥塞窗口cwnd从1起始的慢开始过程,所以被称为快恢复。
  • 快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传超时计时器。

IP

IP为什么要分类

根据IP地址访问终端是通过路由器,路由设备当中有一张路由表,该路由表记录了所有IP地址的位置,这样就可以进行包的转发了,如果我们不区分网络地址,那么这张路由表当中就要保存所有IP地址的方向,这张路由表就会很大,就像下面说的那样:如果不分网络位和主机位,路由器的路由表就是都是32位的地址,那所有的路由器维护的路由表会很大,转发速度变慢(因为查询变慢)。而且所有的路由器都要全部Internet的地址,所有人的路由器都要有足够的性能存下来全网地址。

有了网络地址,就可以限定拥有相同网络地址的终端都在一个范围内,那么路由表只需要维护这个网络地址的方向,就可以找到相应的终端。

IPv4和IPv6的区别

协议地址的区别
(1)地址长度
IPv4协议具有32位(4字节)地址长度;IPv6协议具有128位(16字节)地址长度。
(2)地址的表示方法
IPv4地址是以小数表示的二进制数。 IPv6地址是以十六进制表示的二进制数。
(3)地址配置
IPv4协议的地址可以通过手动或DHCP配置的。
IPv6协议需要使用Internet控制消息协议版本6(ICMPv6)或DHCPv6的无状态地址自动配置(SLAAC)。
数据包的区别
(1)包的大小
IPv4协议的数据包需要576个字节,碎片可选 ;IPv6协议的数据包需要1280个字节,不会碎片。
(2)包头
IPv4协议的包头的长度为20个字节,不识别用于QoS处理的数据包流,包含checksum,包含最多40个字节的
选项字段。
IPv6协议的包头的长度为40个字节,包含指定QoS处理的数据包流的Flow Label字段,不包含checksum;IPv6
协议没有字段,但IPv6扩展标头可用。
(3)数据包碎片
IPv4协议的数据包碎片会由转发路由器和发送主机完成。IPv6协议的数据包碎片仅由发送主机完成。
DNS记录
IPv4协议的地址(A)记录,映射主机名;指针(PTR)记录,IN-ADDR.ARPA DNS域。
IPv6协议的地址(AAAA)记录,映射主机名;指针(PTR)记录,IP6.ARPA DNS域
地址解析协议
IPv4协议:地址解析协议(ARP)可用于将IPv4地址映射到MAC地址。
IPv6协议:地址解析协议(ARP)被邻居发现协议(NDP)的功能所取代。
身份验证和加密
Pv6提供身份验证和加密;但IPv4不提供。

解释一下IP地址、子网掩码、网关

IP地址

IP地址有一个32位的连接地址,由4个8位字段组成,8位字段称为8位位组,每个8位位组之间用点号隔开,用于标识TCP/IP宿主机。每个IP地址都包含两部分:网络ID和主机ID,网络ID 标识在同一个物理网络上的所有宿主机,主机ID标识网络上的每一个宿主机,运行TCP/IP的每个计算机都需要唯一的IP地址。
子网掩码(Subnet Mask)
使用子网可以把单个大网分成多个物理网络,并用路由器把它们连接起来。子网掩码用于屏蔽IP地址的一部分,使得TCP/IP能够区别网络ID和宿主机ID。当TCP/IP宿主机要通信时,子网掩码用于判断一个宿主机是在本地网络还是在远程网络。
缺省的子网掩码用于不分成子网的TCP/IP网络,对应于网络ID的所有位都置为1,每个8位位组的十进制数是255,对应于宿主机ID的所有位都置为0。
用于子网掩码的位数决定可能的子网数目和每个子网的宿主机数目,子网掩码的位数越多,则子网越多,但是宿主机也较少。
例:假设A类地址子网数是14,则所需位数至少为4,用于子网的位为:11111111, 11110000, 00000000, 00000000, 子网掩码为255.240.0.0,每个子网的宿主机数目为2^20-2=1,048, 574个。
网关(Gateway)
网关就是一个网络连接到另一个网络的“关口”。 按照不同的分类标准,网关也有很多种。TCP/IP协议里的网关是最常用的,在这里我们所讲的“网关”均指TCP/ IP协议下的网关。
网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192.168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192. 168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此 所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

IP地址与硬件地址

IP地址是网络层使用的地址,它是分层次等级的。硬件地址是数据链路层使用的地址(MAC地址),它是平面的。在网络层以及网络层之上使用IP地址,IP地址放在IP数据报首部,而MAC地址放在MAC帧的首部。通过数据封装,把IP数据报分组封装为MAC帧后,数据链路层看不见数据报分组的IP地址。

由于路由器隔离,IP网络中无法通过广播MAC地址来完成跨网络的寻址,因此在网络层只使用IP地址来完成寻址。寻址时,每个路由器依据其路由表选择目标网络需要转发到下一跳,而IP分组通过多次路由转发到目标网络后,改为在目标LAN中通过数据链路层的MAC地址以广播方式寻址。

地址解析协议(ARP),每台主机都设有一个ARP高速缓存,用来存放本局域网上各主机和路由器的IP地址到MAC地址的映射表,称ARP表。

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

 

 上图中有一个错误 是OSPF不是OSFP。 OSPF(Open Shortest Path First,OSPF)开放最短路径优先协议,是由internet工程任务组开发的路由选择协议。

总体来说分为以下几个过程:
1.DNS解析

2.TCP连接

3.发送HTTP请求

4.服务器处理请求并返回HTTP报文

5.浏览器解析渲染页面

6.连接接受

HTTP是不保存状态的协议,如何保存用户状态

HTTP是一种不保存状态,即无状态(stateless)协议。也就是说HTTP协议自身不对请求和响应之间的通信状态进行保存。Session的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为HTTP协议是无状态的。服务端给特定的用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个Seesion,过了时间限制,就会销毁这个Session)。

 

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

Cookie被禁用怎么办?

最常见的就是利用URL重写把Session ID直接附加在URL路径的后面。

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

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

 

cookie一般用来保存用户信息比如1.我们在cookie中保存了已经登录的用户信息,下次访问这个网站的时候页面就可以自动帮你把登录的一些基本信息写了2.一般的网站都会有保持登录,也就是说下次你访问网站的时候就不用登录了,这是因为用户登录的时候我们存放了一个Token在cookie中,下次登录的时候只需要根据Token值来查找用户即可(为了安全考虑,重新登录一般要重写Token);3.登录一次网站后访问其他页面不需要重新登录。

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

Cookie数据存放在客户端(浏览器端),Session数据保存在服务器端。

Cookie存储在客户端中,而session存储在服务器上,相对来说Session安全性更高。如果要在Cookie中存储一些敏感信息,不要直接写入Cookie中,最好能将Cookie信息加密,然后使用到的时候在去服务端解密。

 

2.1、保存的位置不同
cookie保存在浏览器端,session保存在服务端。
2.2、使用方式不同
cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
2.3、存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
2.4、存储大小:``cookie最多可以存放4k大小的内容,session则没有限制。
2.5、session的安全性要高于cooKie
2.6、cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录
session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
2.7、session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。

URL和URI的区别是什么?

URI(Uniform Resource Identifier)是统一资源标识符,可以唯一标识一个资源。

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

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

OSI和TCP/IP 网络分层模型详解

OSI七层模型

物理层:物理层的传输单位是比特,功能是在物理媒体上为数据端设备透明地传输原始比特流。通信链路与通信结点的连接需要一些电路接口,物理层规定了这些接口的一些参数,如机械形状和尺寸、交换电路的数量和排列等。

物理层设备:中继器的主要功能是将信号整形并放大再转发出去,以消除信号经过一长段电缆后而产生的失真和衰减,使信号的波形和强度达到所需要的要求,进而扩大网络传输的距离。其原理是信号再生(而非简单地将衰减地信号放大)。中继器有两个端口,一个输入端口一个输出端口。

集线器(Hub)实质上是一个多端口中继器。Hub的每个端口连接的网络部分是一个网络的不同网段,同时Hub也只能在半双工状态下工作,网络的吞吐率因而受到限制。

数据链路层:传输单位是,任务是将网络层传来的IP数据报组装成帧。数据链路层的功能可以概况为成帧、差错控制(由于外界的干扰,原始的物理连接在传输比特流时可能发生错误)、点到点的流量控制和传输管理。典型协议SDLC、HDLC、PPP。

差错控制:检错编码(奇偶校验码、循环冗余码),纠错编码(海明码)

流量控制:滑动窗口,自动重传请求(Automatic Repeat reQuest,ARQ),停止-等待协议、后退N帧协议、选择重传协议

数据链路层设备:网桥,两个或多个以太网通过网桥连接后,就成为一个覆盖范围更大的以太网,而原来的每个以太网就称为一个网段。网桥工作在链路层的MAC子层,可以使以太网各网段成为隔离开的冲突于。局域网交换机,又称以太网交换机,以太网交换机实质上就是一个多端口的网桥,它工作在数据链路层。以太网交换机的每个端口都直接与单台主机或另一个交换机相连,通常都工作在全双工方式。交换机能经济地将网络分成小的冲突域,为每个工作站提供更高的宽带。

网络层:网络层的传输单位是数据报,它关心的是通信子网的运行控制,主要任务是把网络层的协议数据单元分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。关键问题是对于分组进行路由选择,并实现流量控制、拥塞控制、差错控制和网际互连等功能。典型协议IP、ICMP、ARP、OSPF等。

路由器主要完成两个功能:一是路由选择(确定哪一条路径),二是分组转发(当一个分组到达时所采取的动作)。前者是根据特定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。后者处理通过路由器的数据流,关键操作是转发表查询、转发及相关的队列管理和任务调度等。(1)路由选择,指按照复杂的分布式算法,根据从各相邻路由器所得到的关于整个网络拓扑的变化,动态地改变所选择的路由;(2)分组转发,指路由器根据转发表将用户用户的IP数据报从合适的端口号转发出去。

路由表是根据路由选择算法得出的,而转发表是从路由表得出的。转发表的结构应当使找过程最优化,路由表则需要对网络拓扑变化的计算最优化。在讨论路由选择时,往往不去区分转发表和路由表,而笼统地使用路由表一词。

网络地址转换(NAT)是指通过将专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址。

网络层设备:路由器是一种具有多个输出/输入端口的专用计算机,其任务是连接不同的网络(连接异构网络)。在多个广播域互连时必须使用路由器。当源主机要向目标主机发送数据报时,路由器先检查源主机与目标主机是否连接在同一个网络上,那么路由器按照转发表指出的路由将数据报转发给下一个路由器,这称为间接交付。可见,在同一个网络中传输数据无须路由器参与,而跨网络通信必须通过路由器进行转发。

传输层:传输层的传输单位是报文段(TCP)或用户数据报(UDP),传输层负责主机中两个进程之间的通信,功能是为端到端提供可靠的传输服务,为端到端提供连接提供流量控制、差错控制、服务质量、数据传输管理服务等。典型协议TCP、UDP

数据链路层提供点到点的通信,传输层提供的是端到端的通信,两者不同。通俗的说,点到点可以理解为主机到主机的通信,一个点是指一个硬件地址或IP地址,网络中参与通信的主机是通过硬件地址或IP地址来标识的;端到端的通信是指运行在不同主机的两个进程之间的通信,一个进程由一个端口来标识。

传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱和重复),传输层同样能为应用程序提供可靠的服务。

传输层功能:(1)提供应用进程之间的逻辑通信;(2)分用和复用。复用是指发送方不同的应用进程都可使用同一个传输协议传输数据。分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。(3)差错检测,网络层只检测IP数据报的首部;(4)提供两种协议,面向连接的TCP和无连接的UDP。

IP地址和MAC地址标识的是主机,端口标识的是主机的应用进程。

数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口。

会话层:负责主机之间的会话进程,包括建立、管理以及终止进程间的会话。

表示层:数据压缩、加密和解密。

应用层:应用层是是用户与网络的界面。应用层为特定的网络类型应用提供访问OSI参考模型环境的手段。典型协议FTP、SMTP、HTTP

TCP/IP模型

网络接口层(物理层+数据链路层)、网际层(网络层)、传输层、应用层(会话层+表示层+应用层)

 

为什么要网络分层?

1.各层之间相互独立:各层直接相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。

2.提高了整体灵活性:每一层都可以使用最合适的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则有没有改变就行。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则上也是可以对应的。

3.大问题化小:分成可以将复杂的网络间的问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界定义。

HTTP VS HTTPS(应用层)

HTTP协议

HTTP协议,全称超文本传输协议(Hypertext Transfer Protocol)。顾名思义,HTTP协议就是用来规范超文本的传输,超文本也就是网络上的包括文本在内的各式各样的消息,具体来说,主要是规范浏览器和服务器端的行为的。

并且,HTTP是一个无状态协议,也就是说服务器不维护任何有关客户端过去所发请求的消息。这其实是一种懒政,有状态的协议会更加复杂,需要维护状态(历史信息),而且如果客户或服务器失效,会产生状态的不一致,解决这种不一致的代价更高。

HTTP协议通信过程

HTTP是应用层协议,它以TCP(传输层)作为底层协议,默认端口为80。通信过程主要如下:

1.服务器在80端口等待客户的请求;

2.浏览器发起到服务器的TCP连接(创建套接字Socket);

3.服务器接收来自浏览器的TCP连接;

4.浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP消息;

5.关闭TCP连接。

优点:

扩展性强、速度快、跨平台支持性好

HTTPS协议

HTTPS协议(Hyper Text Transfer Protocol Secure),是HTTP的加强安全版本。HTTPS是基于HTTP的,也是用TCP作为底层协议,并额外使用SSL/TLS协议用做加密和安全认证。默认端口号是443.

HTTPS协议中,SSL通道通常使用基于密钥的加密算法,密钥长度通常是40比特或128比特。

优点:保密性好、信任度高

SSL和TLS的区别?

SSL 指安全套接字协议(Secure Sockets Layer),首次发布与 1996 年。SSL 的首次发布其实已经是他的 3.0 版本,SSL 1.0 从未面世,SSL 2.0 则具有较大的缺陷(DROWN 缺陷——Decrypting RSA with Obsolete and Weakened eNcryption)。很快,在 1999 年,SSL 3.0 进一步升级,新版本被命名为 TLS 1.0。因此,TLS 是基于 SSL 之上的,但由于习惯叫法,通常把 HTTPS 中的核心加密协议混成为 SSL/TLS。

HTTP1.0 VS HTTP1.1

1.连接方式:HTTP1.0为短连接,默认使用短连接,客户端和服务器每次进行一次HTTP操作,就建立一次连接,任务结束就中断连接,当客户端浏览器访问的某个HTML或者其他类型的Web页中包含有其他的资源,每遇到一个Web资源,浏览器就会重新建立一个TCP连接,这样就会导致有大量的握手报文和挥手报文占用了带宽。

HTTP1.1支持长连接,TCP连接将持续打开,为后续客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器端用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

1.0与1.1都支持短连接和长连接,只是默认的不一样。

2.状态响应码:HTTP/1.1中加入了大量的状态码,光是错误响应码就新增了24种。

3.缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。

4.带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送了过来,并且不支持断点续传的功能;HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,则返回码是206.这样就方便了开发者自由的选择以便于充分利用带宽和连接。

5.Host头处理,HTTP1.1在请求头中加入了Host字段。

HTTP常见状态码(应用层)

 

1xx Informational 信息性状态码

2xx Success 成功状态码

  • 200 OK :请求被成功处理。比如我们发送一个查询用户数据的HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
  • 201 Created :请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
  • 202 Accepted :服务端已经接收到了请求,但是还未处理。
  • 204 No Content : 服务端已经成功处理了请求,但是没有返回任何内容。

3xx Redirection 重定向状态码

  • 301 Moved Permanently : 资源被永久重定向了。比如你的网站的网址更换了。
  • 302 Found :资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。

4xx Client Error 客户端错误状态码

  • 400 Bad Request : 发送的HTTP请求存在问题。比如请求参数不合法、请求方法错误。
  • 401 Unauthorized : 未认证却请求需要认证之后才能访问的资源。
  • 403 Forbidden :直接拒绝HTTP请求,不处理。一般用来针对非法请求。
  • 404 Not Found : 你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
  • 409 Conflict : 表示请求的资源与服务端当前的存状态在冲突,请求无法被处理。

5xx Server Error 服务器错误状态码

  • 500 Internal Server Error : 服务端出问题了(通常是服务端出Bug了)。比如你服务端处理请求的时候突然抛出异常,但是异常并为在服务端被正确处理。
  • 502 Bad Gateway :我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。

重定向与请求转发 

请求转发

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定他去执行,当这个servlet执行完之后,他要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里完成,因此servlet和jsp共享的是同一个request请求,在servlet里面放的所有东西,在student_list中都能取出来。整个过程一个请求,一个响应。

重定向

客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)

请求转发与重定向二者区别

(1)请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服
务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
(2)地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
(3)是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使
用重定向必然出错);
(4)跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
(5)发生行为不同:重定向是客户端行为,转发是服务器端行为。
 

单工、双工、半双工的通信方式

单工:数据传输只支持数据在一个方向上传输,在同一时间只有一方能接受或发送信息,不能实现双向通信。例如,电视,广播

半双工:半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;同一时间只可以有一方接收或发送信息,可以实现双向通信。例如,对讲机。

双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接收和发送信息。例如,电话通信。

 

posted @ 2022-12-19 09:21  白非立  阅读(73)  评论(0编辑  收藏  举报