0
点赞
收藏
分享

微信扫一扫

计算机网络面试准备

炽凤亮尧 2022-04-03 阅读 122
网络面试

文章目录

1.计算机网络模型

TCP/IP 与 OSI 都是为了使网络中的两台计算机能够互相连接并实现通信与回应,但他们最大的不同在于,OSI 是一个理论上的网络通信模型,而 TCP/IP 则是实际上的网络通信标准。

image-20220302134316392

1. OSI七层模型

  1. 物理层:实现计算机节点之间比特流的透明传输,规定传输媒体接口的标准,屏蔽掉具体传输介质和物理设备的差异,使数据链路层不必关心网络的具体传输介质,按照物理层规定的标准传输数据就行。

  2. 数据链路层:通过差错控制、流量控制等方法,使有差错的物理线路变为无差错的数据链路

  3. 网络层:实现网络地址与物理地址的转换,并通过路由选择算法为分组通过通信子网选择最适当的路径

  4. 传输层:提供源端与目的端之间提供可靠的透明数据传输,传输层协议为不同主机上运行的进程提供逻辑通信。负责向两台主机进程之间的通信提供通用的数据传输服务(TCP、UDP),(网关)。

  5. 会话层:管理主机之间的会话进程,负责在网络中的两节点之间建立、维持、终止通信。

  6. 表示层:处理用户数据的表示问题,如数据的编码、格式转换、加密和解密、压缩和解压缩

  7. 应用层:为用户的应用进程提供网络通信服务,完成和实现用户请求的各种服务。

2.TCP/IP模型

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。TCP/IP协议族按照层次由上到下,层层包装。

image-20220302142744145

上图表示了TCP/IP协议中每个层的作用,而TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地。出栈的过程,数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。

image-20220302143913612

2.网络层

实现网络地址与物理地址的转换,并通过路由选择算法为分组通过通信子网选择最适当的路径

1.IP地址与物理地址

物理地址是数据链路层和物理层使用的地址,IP地址是网络层和以上各层使用的地址,是一种逻辑地址,其中ARP协议将IP地址转换成物理地址。

2.ARP地址解析协议的工作原理

ARP 是根据 IP 地址获取 MAC 地址的一种协议,核心原理就是广播发送ARP请求单播发送ARP响应

3.RARP逆地址解析协议:

RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着 MAC 地址和 IP 地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。

4.DHCP协议

动态主机配置协议,对 IP地址进行集中管理和分配,提升地址的使用率,通过DHCP协议,可以使客户机自动获得服务器分配的lP地址和子网掩码。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

image-20220302151931626

5.ICMP协议,因特网控制报文协议

因特网控制报文协议,用于在IP主机、路由器之间传递控制消息控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息),确认 IP 包是否成功到达目标地址。因为 IP 协议并不是一个可靠的协议,它不保证数据被送达,当传送IP数据包发生错误,比如主机不可达、路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机,给主机一个处理错误的机会。

ICMP报文有两种:差错报告报文和询问报文。以下是4种常见的ICMP差错报告报文

image-20220302153715628

6.交换机与路由器的区别

7.路由选择协议

(1)内部网关协议IGP:

(2)外部网关协议:

BGP:边界网关协议,BGP 是力求寻找一条能够到达目的网络 且 较好的路由,而并非要寻找一条最佳路由。BGP采用路径向量路由选择协议。

3.传输层

传输层主要提供**不同主机上进程间 逻辑通信 + 可靠传输 或者 不可靠传输的功能。**端到端通信

一、TCP和UDP

image-20220303162242299

1. 传输控制协议TCP和用户数据报协议UDP的区别

(1)TCP是面向字节流的,基本传输单位是TCP报文段;UDP是面向报文的,基本传输单位是是用户数据报;

(2)TCP 注重安全可靠性,连接双方在进行通信前,需进行三次握手建立连接。UDP 是无连接的,使用最大努力交付,即不保证可靠交付

(3)UDP 不需要连接等待,所以数据传输快,而 TCP 传输效率相对较低

(4)TCP首部开销是20个字节;UDP的首部开销是8个字节,这也是减少网络传输开销的一方面

(5)TCP有拥塞控制和流量控制,而UDP没有拥塞控制和流量控制

(6)TCP支持点对点通信,提供全双工通信,不提供广播或多播服务;UDP支持一对一、一对多、多对一、多对多的通信模式。

2.TCP和UDP的适用场景

(1)当对网络通讯质量要求不高时,并且要求网络通讯速度能尽量的快,这时就可以使用UDP。比如即使通信: 语音、 视频 、直播等

(2)当对网络通讯质量有要求时,要求整个数据准确无误可靠的传递给对方,这时就适用使用 TCP 协议,一般用于文件传输、发送和接收邮件等场景。比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议都是使用 TCP 协议

3.TCP的首部字段

image-20220302164118319

(1)源端口和目的端口:分别占16位,指发送方应用程序的端口和目的方应用程序的端口号,通过 IP 地址 + 端口号就可以确定一个进程地址

(2)序号(Sequense Number,SN):在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,该字段表示本报文段所发送数据的第一个字节的序号。(初始序号称为 Init Sequense Number, ISN)

(3)确认号 ack:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 N,则表明:到序号 N-1 为止的所有数据都已正确收到。

(4)头部长度:指出 TCP报文段的数据起始处 距离 TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。

(5)保留位:占6位,应置为 0,保留为今后使用。

(6)6个控制位:用于说明该报文段的性质:

(7)窗口大小:16位,用于控制发送端的滑动窗口大小

(8)校检和:16位,校验数据段是否未被修改

(9)紧急指针:16位。

二、TCP连接的建立与断开

1、建立连接的三次握手

image-20220302165851807

(1)第一次握手:客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端初始化序列号 ISN,即seq = x,表示本报文所发送的第一个字节的序号。此时客户端处于 SYN_Sent 状态,等待服务端确认。

(2)第二次握手:服务端收到数据包后,由 SYN = 1 知道客户端请求建立连接,那么就会对这个TCP 连接分配缓存和变量(缓存指的是一个字节流队列),接着返回一个确认报文:设置 SYN = 1,ACK = 1,同时指定自己的初始化序列号 ISN,即图中的 seq = y,并把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务端进入SYN_REVD状态。

(3)第三次握手:客户端收到确认后,检查ACK是否为1,ack是否为 x +1,如果正确,则给服务端发送一个 ACK 报文:设置 ACK = 1,把服务端的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1,此时客户端和服务器端都进入 ESTABLISHED 状态。完成三次握手,随后Client与Server之间可以开始传输数据了。

三次握手出现错误时的应对措施
第一次握手A发送SYN传输失败,A,B都不会申请资源,连接失败。如果一段时间内发出多个SYN连接请求,那么A只会接受它最后发送的那个SYN的SYN+ACK回应,忽略其他回应全部回应,B中多申请的资源也会释放

第二次握手B发送SYN+ACK传输失败,A不会申请资源,B申请了资源,但收不到A的ACK,过一段时间释放资源。如果是收到了多个A的SYN请求,B都会回复SYN+ACK,但A只会承认其中它最早发送的那个SYN的回应,并回复最后一次握手的ACK

第三次握手ACK传输失败,B没有收到ACK,释放资源,对于后序的A的传输数据返回RST。实际上B会因为没有收到A的ACK会多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到A的ACK,则释放资源,对A的数据传输返回RST

2.为什么不能用两次握手进行建立连接

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

(1)**三次握手目的是确认双方的接收与发送能力是否正常,同步连接双方的初始化序列号 ISN,为后面的可靠性传输做准备。**而两次握手只有服务端对客户端的起始序列号做了确认,但客户端却没有对服务端的初始序列号做确认,不能保证传输的可靠性。

(2)三次握手可以防止已失效的连接请求报文段突然又传送到了服务端,导致服务器错误地建立连接,浪费服务端的连接资源。

为什么是三次握手

这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了

超过三次浪费资源

3.断开连接的四次挥手

image-20220302174343074

(1)第一次挥手:客户端发送一个 FIN 报文,设置 FIN = 1 并指定序列号 seq = u(u 是之前传送过来的最后一个字节的序号 + 1),主动关闭 TCP 连接,此时客户端进入FIN_WAIT_1状态;

(2)第二次挥手:服务端收到 FIN 报文后,由FIN=1 知道客户端请求关闭连接,则返回确认报文:设置ACK = 1,ack = u + 1,seq = v(v 的值取决于服务器发送给客户端之前的一个包确认号是多少)

(3)第三次挥手:当服务端没有要向客户端发送的数据时,就向客户端发送一个 FIN 报文,设置 FIN = 1 并指定序列号 seq = w(w 的值取决于服务器发送给客户端之前的一个包确认号是多少),用于关闭服务端到客户端的数据传送。此时服务器处于 LAST_ACK 状态

4)第四次挥手:客户端收到 FIN 报文后,发送给服务端一个 ACK 报文作为应答:设置 ACK=1 和 ack = w +1。发送之后,客户端处于 TIME_WAIT状态,如果服务端接收到这个数据包,则进入CLOSED状态,完成四次挥手。

4.为什么需要TIME_WAIT状态(为什么还要等待2MSL)

TIME_WAIT 状态持续 2MSL(最大报文存活时间),约4分钟才转换成CLOSE状态。由于TIME_WAIT 的时间会非常长,因此服务端应尽量减少主动关闭连接,TIME_WAIT 的主要作用有:

(1)重发丢失的 ACK 报文,保证连接可靠的关闭:

(2)保证本次连接的重复数据段从网络中消失:

如果存在两个连接,第一个连接正常关闭,第二个相同的连接紧接着建立;如果第一个连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达,则会干扰第二连接,等待 2MSL 可以让上次连接的报文数据消逝在网络中。

5.为什么需要四次挥手

TCP 是全双工模式,并且支持半关闭特性,提供了连接的一端在结束发送后还能接收来自另一端数据的能力。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手。

6.如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

7.什么是SYN洪泛

SYN 洪泛是指利用 TCP 需要三次握手的特性,攻击者伪造 SYN 报文向服务器发起连接,服务器在收到报文后用 ACK 应答,但之后攻击者不再对该响应进行应答,造成一个半连接。假设攻击者发送大量这样的报文,那么被攻击主机就会造成大量的半连接,耗尽其资源,导致正常的 SYN 请求因为队列满而被丢弃,使得正常用户无法访问。

**SYN攻击:**SYN攻击即是利用TCP协议的缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。优化方式:(1)缩短SYN Timeout时间; (2)记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。

8.三次握手过程中对否可以携带数据

第三次握手时是可以携带数据的,但第一二次握手时不可以携带数据。

(1)假如第一次握手可以携带数据的话,那么会放大 SYN 洪泛。如果有人要恶意攻击服务器,每次都在第一次握手中的 SYN 报文中放入大量的数据,然后疯狂重复发送 SYN 报文的话,就会让服务器开辟大量的缓存来接收这些报文,内存会很容易耗尽,从而拒绝服务。

(2) 第三次握手时客户端已经处于 ESTABLISHED 状态,对于客户端来说,他已经建立起连接了,并且已经知道服务器的接收和发送能力是正常的,所以也就可以携带数据了。

TCP规定:SYN报文段(SYN=1)不能携带数据,但需要消耗一个序列号。ACK报文段可以携带数据,但是如果不携带数据则不消耗序列号。

9.TCP的粘包和拆包

9.1什么是粘包拆包

​ 拆包粘包在数据链路层、网络层以及传输层都可能存在。而在传输层中,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。TCP是个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

9.2什么情况会发生拆包粘包

(1)应用程序 write 写入的数据字节大于套接口发送缓冲区大小,将会发生拆包现象;

(2)应用程序 write 写入的数据字节小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。

(3)进行MSS大小的TCP分段:程序需要发送的数据大小和TCP报文段能发送MSS(Maximum Segment Size,最大报文长度)是不一样的。大于MSS时,就需要把程序数据拆分为多个TCP报文段,称之为拆包;小于时,则要考虑合并多个程序数据为一个TCP报文段,则是粘包;其中 MSS = TCP报文段长度-TCP首部长度。

(4)接收方法不及时读取套接字缓冲区数据,这将发生粘包。

9.3拆包粘包问题的解决策略

(1)在数据尾部增加一个特殊字符进行分割,例如 FTP 协议;

(2)将数据大小设置为固定的,如果数据长度不够,则使用空位补全;

(3)将数据分为两部分,消息头和消息体;其中消息头大小固定,且包含一个字段声明内容体的大小

9.4网络层-IP数据报分片

**MTU 是数据链路层**中的网络对数据帧的一个限制(以太网中 MTU 为1500个字节),一个 IP 数据报在以太网中传输,如果它的长度大于 MTU 值,就要进行分片传输,使得每片数据报的长度小于 MTU。而分片传输的 IP 数据报不一定按序到达,但 IP 首部中的信息能让这些数据报片按序组装,IP数据报的分片与重组是在网络层进完成的。

前面提到,**MSS 是 TCP 数据包每次能够传输的最大数据分段**,TCP 报文段的长度大于 MSS 时,要进行分段传输。TCP 在建立连接时通常会协商双方的 MSS 值(**MSS 选项只出现在 SYN 报文段中,即 TCP 三次握手的前两次**)。**MSS 的值一般为 MTU 值减去两个首部大小(IP 数据包包头的大小 20 Bytes 和 TCP 数据段的包头 20 Bytes)**,**TCP报文段的分段与重组是在传输层完成的。**

到这里我们就能看出,TCP 分段的原因是 MSSIP 分片的原因是 MTU,由于一直有 MSS <= MTU,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了,因此TCP报文段很少会发生IP分片的情况。

而由于 UDP 数据报不会自己进行分段,因此当长度超过了 MTU 时,会在网络层进行 IP 分片。同样,ICMP(在网络层中)同样会出现IP分片情况。

所以,总的来说,UDP 不会分段,就由 IP 来分,TCP会分段,当然就不用 IP 来分了!

10.TCP的长连接和短连接

10.1. TCP短连接
模拟一下TCP短连接的情况:client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次请求就完成了。这时候双方任意都可以发起close操作,不过一般都是client先发起close操作。上述可知,短连接一般只会在 client/server间传递一次请求操作。
短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。
10.2. TCP长连接
我们再模拟一下长连接的情况:client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

10.3. 长连接和短连接的优点和缺点
由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

10.4. 长连接短连接操作过程
短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
10.5. 什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

11. seq初始序列号是固定的吗

三次握手的一个重要功能是客户端和服务端交换初始序列号,以便让对方知道接下来接受数据的时候如何按序列号组装数据。

如果初始序列号是固定的,攻击者很容易猜出后续的确认号,所以初始序列号是动态生成的。

12.为什么建立连接是三次握手,关闭连接却是四次挥手

建立连接的时候,服务端在 LISTEN 状态,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

而关闭连接是,服务端收到客户端的FIN报文时,仅仅表示客户端不再发送数据了但是还能接收数据,并且自己也未必将全部数据都发送给对方了,所以自己可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,自己的ACK和FIN一般会分开发送,从而导致多了一次。

三、TCP可靠性传输

1.TCP如何保证可靠性传输

  • (1)三次握手
  • (2)应答机制与超时重传:TCP接收端收到发送端的数据时,它将发送一个确认。当TCP发送端发出一个报文段后,它会启动一个定时器,等待接收端的确认报文段,如果不能及时收到一个确认,将重发这个报文段。
  • (3)数据包校验与丢弃重复数据:TCP会检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP会超时重发数据;对于重复数据,则进行丢弃;
  • (4)对失序数据包进行重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
  • (5)流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,防止较快主机致使较慢主机的缓冲区溢出。TCP使用的流量控制协议是可变大小的滑动窗口协议。
  • (6)拥塞控制:网络拥塞时,减少数据的发送。

2.TCP的流量控制

所谓流量控制就是让发送方的发送速率不要太快,让接收方来得及接收。因为如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。TCP的流量控制是通过大小可变的滑动窗口来实现的。接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK报文来通知发送端,滑动窗口是接收端用来控制发送端发送数据的大小,从而达到流量控制

设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。假设每一个报文段为100字节长,而数据报文段序号的初始值设为1。

image-20220303145633843

从图中可以看出,B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1 ,只有在 ACK=1 时确认号字段才有意义。

3.TCP的拥塞控制

拥塞控制就是防止过多的数据注入网络中,使网络中的路由器或链路不致过载。发送方维持一个拥塞窗口cwnd 的状态变量。拥塞窗口的大小动态变化,取决于网络的拥塞程度,发送方让自己的发送窗口等于拥塞窗口。只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。 拥塞控制的方法主要有以下几种:慢启动、拥塞避免、快重传和快恢复。

(1)慢开始算法:当发送主机开始发送数据时,不要一开始就发送大量的数据,因为不清楚网络的拥塞情况,而是试探一下网络的拥塞情况,由小到大逐渐增大发送窗口。在开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段,然后每经过一个传输轮次RTT,拥塞窗口 cwnd 就加倍。另外,为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限 ssthresh 状态变量。

当 cwnd < ssthresh 时,使用上述的慢开始算法。

当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

(2)拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

无论在慢开始阶段还是在拥塞避免阶段,只要网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的拥塞窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd 设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的数据量,使得发生拥塞的路由器有足够时间把队列中积压的数据处理完毕。过程图如下:

image-20220303150657667

**(3)快重传:**快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(使发送方及早知道有报文段没有到达对方)而不必等到自己发送数据时捎带确认。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

image-20220303151011840

(4)快恢复:与快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减少”算法,把ssthresh门限设置为拥塞窗口cwnd的一半,但是接下去并不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法因为如果网络出现拥塞的话,就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞,所以此时并不执行慢开始算法,而是执行拥塞避免算法。

4.拥塞控制和流量控制的差别

(1)相同点:拥塞控制和流量控制的相同点都是控制丢包现象,实现机制都是让发送方发得慢一点。

(2)不同点:

① 拥塞控制是一个全局性的过程,防止过多的数据注入到网络中,造成网络拥塞

② 流量控制指点对点通信量的控制,要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

四、UDP如何保证可靠传输

  • UDP是传输层应用,本身是不可靠的,只能在应用层下功夫,模仿TCP的可靠传输,应答确认 (Seq/Ack应答机制),超时重传(定时器),有序传输(将数据包进行编号,按照包的顺序接收并存储),并且还要实现拥塞控制和可靠传输。
  • 开源程序利用udp实现了可靠的数据传输,分别为RUDP、RTP、UDT

五、停止等待协议、连续ARQ协议、滑动窗口协议、流量控制(慢开始、拥塞避免、快重传、快恢复)

4.应用层

应用层主要提供应用进程间的网络通信服务,完成用户请求的各种服务。

一、http协议

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。

http协议即超文本传输协议,基于TCP协议,用于从Web服务器传输超文本到本地浏览器的传送协议。http协议是无状态协议自身不对请求和响应直接的通信状态进行保存,但有些场景下我们需要保存用户的登陆信息,所以引入了cookie 和 session 来管理状态。

1.cookie和session的区别

HTTP协议本身是无状态的,为了使其处理更加复杂的逻辑,在HTTP1.1中引入了Cookie来保存状态信息。Cookie是由服务器端产生的,再发送给客户端保存,当客服端再次访问的时候,服务器根据cookie辨识客户端是那个,以此可以做个性化推送,免账号密码登录等。

Session用于标记特定客户端信息,存在服务器的一个文件里。一般客户端带Cookie对服务器进行访问,可以通过cookie中的session id 从整个session中查询服务器记录的关于客户端的信息

1)保存位置与安全性:cookie保存在客户端,session保存在服务端,所以在安全性上面,cookie存在安全隐患,可以通过拦截或本地文件找到cookie后进行攻击,而session相对更加安全。因此,可以将登陆信息等重要信息存放为session中;其他信息如果需要保留,可以放在cookie中。

(2)存储容量:单个cookie最大只允许4KB,一个站点最多保存20个Cookie;session没有大小限制,个数只跟服务器的内存大小有关。

(3)有效期与实现机制:cookie可长期有效存在;session依赖于cookie,过期时间默认为-1,只需关闭窗口该 session 就会失效。每个客户端对应一个session ,客户端之间的 session 相互独立;

  1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
  2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
  3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

总体来说Cookie和Session的区别
cookie数据存放在客户的浏览器上,session数据放在服务器上;
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session;
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用cookie;
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

2.一个完整的http请求是怎么样?即从输入网址到获得页面的过程

image-20220305171251155

(1)解析url,获取 url 中包含的域名;

(2)通过DNS系统查询域名对应的IP;

image-20220305151721516

(3)浏览器得到域名对应的IP地址之后,向服务器发起三次握手请求建立TCP链接;

(4)TCP链接链接建立起来后,浏览器向服务器发送http请求,如果 html文件在缓存里,浏览器则直接返回, 如果没有,则去后台拿;

(5)服务器接收到请求后,根据路径参数映射到特定的处理器进行处理,并将处理结果以及相应的视图返回给浏览器。

(6)浏览器解析视图,并根据请求到的资源、数据进行渲染页面,最终向用户呈现一个完整的页面。

3.http的长连接和短连接

http的长连接和短连接本质上是TCP长连接和短连接。从http1.1开始就默认使用长连接。

短链接是指客户端与服务端每进行一次请求操作,就建立一次TCP连接,收到服务器响应后,就断开连接。

长连接是指客户端和服务建立TCP连接后,它们之间的连接会持续存在,不会因为一次HTTP请求后关闭,后续的请求也是用这个连接进行通信,使用长连接的HTTP协议,会在响应头有加入:Connection:keep-alive。长连接可以省去每次TCP建立和关闭的握手和挥手操作,节约时间提高效率。但在长连接下,客户端一般不会主动关闭连接,如果客户端和服务端之间的连接一直不关闭的话,随着连接数越来越多,会对服务端造成压力。

所以长连接多用于频繁请求资源,而且连接数不能太多的情况,例如数据库的连接用长连接。而像Web网站这种并发量大,但是每个用户无需频繁操作的场景,一般都使用短连接,因为长连接对服务端来说会耗费一定的资源。

4.http的断点续传是如何实现的?

HTTP请求头有个Range字段;我们下载文件的时候如果遇到网络中断,如果重头开始下载会浪费时间,所以我们可以从上一次中断处继续开始下载;具体的操作:

或者指定5001以后的所有数据

5.http存在的问题

为了解决上述几个问题,那么就引入了https协议。

6.URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息URL。以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
从上面的URL可以看出,一个完整的URL包括以下几部分:

1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符

2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

7.URI和URL的区别是什么

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

    Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
    URI一般由三部组成:
    ①访问资源的命名机制
    ②存放资源的主机名
    ③资源自身的名称,由路径表示,着重强调于资源。

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

    采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
    ①协议(或称为服务方式)
    ②存有该资源的主机IP地址(有时也包括端口号)
    ③主机资源的具体地址。如目录和文件名等

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

8.http1.0、http1.1、http2.0主要特点

http1.0的主要特点:
简单快速:当客户端向服务器端发送请求时,只是简单的填写请求路径和请求方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了 。

灵活:HTTP协议允许客户端和服务器端传输任意类型任意格式的数据对象

**无连接:**无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题)

**无状态:**无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息。(使用 cookie 机制可以保持 session,解决无状态的问题)

http1.1的特点
a、默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求 。
b、管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应 。
c、断点续传,就是可以将一个大数据,分段传输,客户端可以慢慢显示。

http2.0的特点
a、HTTP/2采用二进制格式而非文本格式
b、HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个HTTP连接就可以实现多个请求响应
c、使用报头压缩,HTTP/2降低了开销
d、HTTP/2让服务器可以将响应主动“推送”到客户端缓存中

9.http2.0的多路复用和http1.x中的长连接复用有什么区别

  • HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接
  • HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,因为传输格式是文本的,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞
  • HTTP/2多个请求可同时在一个连接上并行执行(由于支持二进制的格式,可以无序)某个请求任务耗时严重,不会影响到其它连接的正常执行

HTTP/1.1 最大的变化就是引入了持久连接(persistent connection),在HTTP/1.1中默认开启 Connection: keep-alive,即TCP连接默认不关闭,可以被多个请求复用。那么管道机制就是在同一个TCP连接中可以同时发送多个HTTP请求而不用等待上一个请求返回数据后,再发送下一个请求。虽然可以同时发送多个HTTP请求,但是服务器响应是按照请求的顺序进行响应的。

HTTP 2.0的多路复用是在同一个TCP连接中,可以发送多个HTTP请求,而且请求的响应不依赖于前一个请求。每个请求单独处理,不会出现HTTP1.1中上一个请求没有回应便一直等待的情况。

image-20220305210802238

  • 图中第一种请求方式,就是单次发送request请求,收到response后再进行下一次请求,显示是很低效的。
  • 于是http1.1提出了管线化(pipelining)技术,就是如图中第二中请求方式,一次性发送多个request请求。
  • 然而pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。这种情况就如图中第三种,第一个请求阻塞后,后面的请求都需要等待,这也就是队头阻塞(Head of line blocking)。
  • 为了解决上述阻塞问题,http2中提出了多路复用(Multiplexing)技术,Multiplexing是通信和计算机网络领域的专业名词。http2中将多个请求复用同一个tcp链接中,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个request-response拆分为了细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求,如图中第四种情况所示。

二、https协议

https 是基于tcp协议,在http的基础上加入了SSL/TLS,可看成是添加了加密和认证机制的http,使用对称加密、非对称加密、证书等技术进行进行客户端与服务端的数据加密传输,最终达到保证整个通信的安全性。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

1、https的认证加密过程?如何保证内容不会被篡改的?

2、根证书如何保证签发的证书是安全有效的?

image-20220305155127393

在整个过程中,一共涉及2对公私密钥对,一对由服务器产生,主要用于加密,一对由CA产生,主要用于签名。

3、为什么需要CA证书认证机构呢?

CA证书是为了确保服务端的公钥是准确无误、没有被修改过的。虽然https是加密的,但是请求还是可以被拦截的,假设没有CA证书,如果服务器返回的包含公钥的包被攻击者截取,然后攻击者也生成一对公私钥,他将自己的公钥发给客户端。攻击者得到客户端数据后进行解密,然后再通过服务器的公钥加密发给服务器,这样数据就被攻击者获取到了。

有了CA证书后,客户端根据内置的CA根证书,很容易识别出攻击者的公钥不合法,或者说攻击者的证书不合法。

4、SSL/TLS

https比http安全的原因就是它在TCP协议之上加入了SSL(Secure Sockets Layer 安全套接字协议)

众所周知,http(s)协议是工作在应用层,而其下就是传输层,而http(s)协议是基于传输层中的TCP协议之上的,就是说http(s)的数据传输是要在TCP三次握手后,也就是建立连接的基础上才能进行http(s)通信

原本的http协议直接就是TCP握手完,就用明文传输数据

而https协议则是在TCP协议之上加入了SSL加密协议,在传输数据之前先进行加密

SSL是一个不依赖于平台和运用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。

image-20220307155124027

SSL协议提供的安全通道有以下三个特性:

  • **机密性:**SSL协议使用密钥加密通信数据。
  • **可靠性:**服务器和客户都会被认证,客户的认证是可选的。
  • **完整性:**SSL协议会对传送的数据进行完整性检查。

SSL提供服务

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器
  • 加密数据以防止数据中途被窃取
  • 维护数据的完整性,确保数据在传输过程中不被改变。

SSL原理详解

image-20220307155730486

SSL的体系结构中包含两个协议子层,其中高层是SSL握手协议层(SSL HandShake Protocol Layer);底层是SSL记录协议层(SSL Record Protocol Layer)

SSL协议主要分为两层:

  • SSL握手协议层包括SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)和SSL告警协议(SSL Alert Protocol)。握手层的这些协议用于SSL管理信息的交换,允许应用协议传送数据之间相互验证协商加密算法和生成密钥等
  • SSL记录协议层的作用是为高层协议提供基本的安全服务。SSL纪录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。纪录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。

SSL握手协议的作用是协调客户和服务器的状态,使双方能够达到状态的同步

其中最重要的是握手协议和记录协议:

  • SSL握手协议:它建立在SSL记录协议之上,用于在实际的数据传输开始之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
  • SSL记录协议:它建立在可靠的传输(如TCP)之上,为高层协议提供数据分块、数据封装、压缩、解压缩、加密、解密等基本功能。

什么是TLS?

简单点说,TLS就是规范化的SSL

早期TCP上的https传输用的加密协议是SSL,等到SSL发展到3.0之后,有一个国际机构将其标准化,标准化之后的SSL就叫做TLS,不过人们还是习惯叫SSL,现在大部分用的就是TLS,不过大家喜欢叫做SSL而已,就一回事.

对称加密和非对称加密

数字签名和数字证书

  1. 数字签名

    回到刚才实名举报的例子,举报信的传输是安全了(因为只有检举机构的私钥能解密),那如果检举机构想对举报人回信,在举报人的角度怎么能证实收到的回信是检举机构发的呢?

    在现实中很简单,不就盖个章嘛(不考虑被伪造的情况)

    这个章在密码学里叫数字签名,既表明自己身份唯一的标识

    那这个签名怎么签呢?

    假如我是检举机构,我的回信叫letter

    1.letter内容+Hash函数——>摘要

    2.摘要+私钥——>数字签名

    3.将数字签名放在letter内容的下面发送给举报人

    注意:在数字签名的过程中,只有私钥是具有唯一性的,hash函数是公开的,letter内容可能被截获修改!

    对于举报人,关心的只有两点:1.信是不是检举机构寄的? 2.信的内容有没有被黑客修改?

    如果上诉两点一旦确认为 1.是 2.没有 那这封信就无误了。

    那怎么求证呢?我们看举报人收到了什么内容,有信的内容和数字签名

    对于第一点:1.信是不是检举机构寄的?

    因为私钥是检举机构的唯一标识,只能通过验证数字签名来求证

    数字签名+公钥,如果能成功得到摘要就确定数字签名没有被伪造,既信是检举机构寄的

    对于第二点: 2.信的内容有没有被黑客修改?

    前文说过,hash是公开的,如果上面验证了数字签名的正确性,那摘要就是可以反应原文的,所以

    letter内容+hash 得到摘要,再与上面解密数字签名的摘要对比,一样的话就是没有修改

  2. 数字证书

    有朋友说,有数字签名,双方不就可以安全通信了吗,那数字证书是什么?

    上面一切可靠通信的前提是,举报人手持的公钥和检举单位的私钥是一对

    当举报人手上的公钥被恶意替换成某诈骗公司的公钥之后,诈骗公司就可以伪装成检举机构和举报人通信而不被发现,因为诈骗公司本身就拥有自己的私钥,而且把举报人的公钥替换成了自己的公钥,而举报人根本发现不了,还以为自己跟检举机构安全保密的通信呢。

    这时候就要数字证书登场了!

    证书中心(certificate authority,简称CA)用自己的私钥,检举机构的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

    数字证书保证了检举机构和对应公钥的匹配性

    就是说,检举机构下次寄信时带上这个数字证书,举报人用CA的公钥解密的到检举机构的公钥,和客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表对比,如果在上面就可以,不在上面就是假的公钥。

    扩展:有的朋友就说了,那如果CA的公钥被替换了怎么办?

    有兴趣的朋友可以去了解一下这种情况,称为中间人攻击,既黑客组织同时冒充服务端和客户端进行双向伪装通信

三、http的请求与响应

1、http的常见请求方式:

2、get和 post 请求的区别:

GET和POST本质上就是TCP连接。一般在使用的时候,get方法将参数放在url中,post将参数放在request body当中。但是他们本质的区别(?并不是这样):GET产生一个TCP数据包;POST产生两个TCP数据包。
Get方法:把http header和data放在一起发送,服务器返回200.
Post方法:浏览器先发http header,服务器返回100 continue,浏览器再发送data,服务器返回200

3、http报文头分析:

(1)报文类型:报文类型分为请求报文和响应报文

image-20220305161648876

(2)报文中各部分的简要描述:

(3)通用头部:既可以出现在请求报文中,也可以出现在响应报文中,它提供了与报文相关的最基本的信息:

(4)请求头部:请求头部是只在请求报文中有意义的头部。用于说明是谁或什么在发送请求、请求源自何处,或者客户端的喜好及能力

(5)响应头部:响应头部为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令

(6)实体首部:描述主体的长度和内容,或者资源自身

(7)实体的主体部分:该部分其实就是HTTP要传输的内容,是可选的。HTTP报文可以承载很多类型的数字数据,比如,图片、视频、HTML文档电子邮件、软件应用程序等等。

4、Http 常见的状态码

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

image-20220305180822215

5、http1.0和http1.1的主要区别是什么

  1. ⻓连接 : 在HTTP/1.0中,默认使⽤的是短连接,也就是说每次请求都要重新建⽴⼀次连接。HTTP 是基于TCP/IP协议的,每⼀次建⽴或者断开连接都需要三次握⼿四次挥⼿的开销,如果每次请求都要这样的话,开销会⽐较⼤。因此最好能维持⼀个⻓连接,可以⽤个⻓连接来发多个请求。HTTP 1.1起,默认使⽤⻓连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有⾮流⽔线⽅式和流⽔线⽅式 。流⽔线⽅式是客户在收到HTTP的响应报⽂之前就能接着发送新的请求报⽂。与之相对应的⾮流⽔线⽅式是客户在收到前⼀个响应后才能发送下⼀个请求。
  2. 错误状态响应码 :在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发⽣冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  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(PartialContent),这样就⽅便了开发者⾃由的选择以便于充分利⽤带宽和连接。

6、http/1.x和http/2.0的区别:

(1)多路复用,做到同一个连接并发处理多个请求:HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,并发请求的数量比HTTP1.1大了好几个数量级。http 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

(2)支持首部压缩:HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

(3)服务器推送:当向支持HTTP2.0的web服务器请求时,服务器会顺便把客户端需要的资源一起推送到客户端,避免客户端再次创建连接发送请求到服务器端获取,这种方式非常合适加载静态资源。

(4)http2.0采用二进制而不是文本格式。http 2.0会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中http.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。

**为什么需要头部压缩?**假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。具体参考:HTTP/2 头部压缩技术介绍

**HTTP2.0多路复用有多好?**HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。

7、http 和 https 的区别、https的实现过程

(1)http 和 https 都是基于 TCP 协议,但是 http 是使用明文传输,通讯内容可能被窃听和篡改,客户端也无法验证通讯方的身份,无法保证数据发送到正确的机器上;https 是在 http 的基础上加入了 SSL/TLS,可看成是添加了加密和认证机制的http,使用对称加密、非对称加密、证书等技术进行进行客户端与服务端的数据加密传输,最终达到保证整个通信的安全性。

(2)端口不同:http 使用的是80端口,https 使用的443端口

(3)资源消耗:和 http 通信相比,https通信会由于加解密处理消耗更多的CPU和内存资源

https实现过程(SSL/TLS握手过程)

  • 浏览器将支持的加密算法信息发给服务器
  • 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
  • 客户端(SSL/TLS)解析证书验证证书合法性生成对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密
  • 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器
  • 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
  • 服务器将加密后的密文发送给客户端
  • 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成

image-20220305173040041

四、应用层其他相关的协议:

(1)DNS域名系统:用于域名解析服务,将域名地址转换为IP地址,基于UDP服务,使用53端口。

image-20220305173748246

迭代查询:
① 请求发起后,游览器首先会解析这个域名,首先它会查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。
如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求本地DNS(域名分布系统)服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
③ 查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询
根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到那个顶级域服务器上去继续查询,并给出顶级域服务器的地址。这种过程是迭代的过程
⑤ 本地DNS服务器继续向顶级域服务器发出请求,顶级域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你应该去找那个权限域名服务器
⑥ 最后,本地DNS服务器向权限域名服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

(2)FTP:定义了文件传输协议,使用21端口。上传下载文件,都要用到FTP服务。

(3)Telnet:远程终端协议,它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,提供一种基于DOS模式下的通信服务。

(4)SMTP:定义了简单邮件传送协议,用于发送邮件,使用25号端口。

(5)POP3:与SMTP对应,POP3用于接收邮件。使用110端口。

(6)SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。

(7)TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在69端口上使用UDP服务。

https://blog.csdn.net/a745233700/article/details/114824602

https://www.cnblogs.com/sinlearn/p/15100446.html

https://blog.csdn.net/qq_36452584/article/details/115270305

https://blog.csdn.net/m0_37907797/article/details/103252306

https://www.zhihu.com/question/31965904/answer/316810167

https://blog.csdn.net/mw_myever/article/details/109163961

https://zhuanlan.zhihu.com/p/359935850

https://zhuanlan.zhihu.com/p/60305452

5.各层的网络设备,对应的协议

一、各层设备

https://blog.csdn.net/m0_62591999/article/details/121174253

https://www.jianshu.com/p/dfb08cb87773

二、各层协议

杂记

1.网络层路由选择协议

网络层—路由选择协议_nineteen_的博客-CSDN博客

2.各层协议

计算机网络各层协议_Wc&Yd博客-CSDN博客_计算机网络各层协议

3.DHCP协议详解

DHCP协议详解_zzd_zzd的博客-CSDN博客_dhcp协议

4.ICMP协议

完全理解icmp协议_嘿嘿-CSDN博客_icmp

5.路由选择协议

浅谈交换机和路由器的区别_LieBao-CSDN博客_交换机和路由器的区别

6.IGMP 网际组管理协议

组播基本概念、IGMP、IGMP监听学习笔记 - 江召伟 - 博客园 (cnblogs.com)

7.TCP协议

计算机网络——TCP协议_蒙面侠的博客-CSDN博客_计算机网络tcp

计算机网络:这是一份全面 & 详细 的TCP协议攻略 - 简书 (jianshu.com)

TCP/IP 常用协议 - 疯狂的小牛仔 - 博客园 (cnblogs.com)

8.Session和Cookie的详解和区别使用

cookie和session的详解与区别 - 测试开发喵 - 博客园 (cnblogs.com)

session和cookie区别详解 - 幽篁晓筑 - 博客园 (cnblogs.com)

(1条消息) Cookie和Session的区别(面试必备)_chen13333336677的博客-CSDN博客_session和cookie的区别面试题

面试常考之cookie和session的区别 - 可樂_Thompson - 博客园 (cnblogs.com)

(1条消息) java面试题:session和cookie的区别_我是方小磊的博客-CSDN博客_面试题session和cookie的区别

9.HTTP

https://blog.csdn.net/u014294681/article/details/86585326

https://zhuanlan.zhihu.com/p/281910644

10.SSL/TSL

https://www.jianshu.com/p/d2c21c7bf38d

https://blog.csdn.net/cy973071263/article/details/105309476

https://www.cnblogs.com/plorde/p/12304965.html

https://www.jianshu.com/p/a7292b4db7bd

SSL协议的工作流程_weixin_34194087的博客-CSDN博客

SDN博客_计算机网络tcp](https://blog.csdn.net/m0_46365614/article/details/114769176)

计算机网络:这是一份全面 & 详细 的TCP协议攻略 - 简书 (jianshu.com)

TCP/IP 常用协议 - 疯狂的小牛仔 - 博客园 (cnblogs.com)

8.Session和Cookie的详解和区别使用

cookie和session的详解与区别 - 测试开发喵 - 博客园 (cnblogs.com)

session和cookie区别详解 - 幽篁晓筑 - 博客园 (cnblogs.com)

(1条消息) Cookie和Session的区别(面试必备)_chen13333336677的博客-CSDN博客_session和cookie的区别面试题

面试常考之cookie和session的区别 - 可樂_Thompson - 博客园 (cnblogs.com)

(1条消息) java面试题:session和cookie的区别_我是方小磊的博客-CSDN博客_面试题session和cookie的区别

9.HTTP

https://blog.csdn.net/u014294681/article/details/86585326

https://zhuanlan.zhihu.com/p/281910644

10.SSL/TSL

https://www.jianshu.com/p/d2c21c7bf38d

https://blog.csdn.net/cy973071263/article/details/105309476

https://www.cnblogs.com/plorde/p/12304965.html

https://www.jianshu.com/p/a7292b4db7bd

SSL协议的工作流程_weixin_34194087的博客-CSDN博客

举报

相关推荐

0 条评论