【C++语言部分】面试高频问题汇总及详细解答
【操作系统(Linux)】面试高频问题汇总及详细解答
【数据库】面试高频问题汇总及详细解答
本文目录
- 1. 简述网络七层参考模型及每一层的作用
- 2. 简述静态路由和动态路由
- 3. 说说有哪些路由协议,都是如何更新的
- 4. 简述域名解析过程,本机如何干预域名解析
- 5. 简述 DNS 查询服务器的基本流程是什么,DNS 劫持是什么
- 6. 简述网关的作用是什么,同一网段的主机如何通信
- 7. 简述CSRF攻击的思想以及解决方法
- 8. 说说 MAC 地址和 IP 地址分别有什么作用
- 9. 简述 TCP 三次握手和四次挥手的过程(非常重要)
- 10. 说说 TCP 两次握手行不行,为什么要三次
- 11. 简述 TCP 和 UDP 的区别,它们的头部结构是什么样的
- 12. 简述 TCP 连接和关闭的状态转移
- 13. 简述 TCP 慢启动
- 14. 说说 TCP 如何保证有序
- 15. 说说 TCP 常见的拥塞控制算法有哪些
- 16. 简述 TCP 超时重传
- 17. 说说 TCP 可靠性保证
- 18. 简述 TCP 滑动窗口以及重传机制
- 19. 说说滑动窗口过小怎么办
- 20. 说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍
- 21. 简述 TCP 的 TIME_WAIT,为什么需要有这个状态
- 22. 简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭
- 23. 说说什么是 SYN flood,如何防止这类攻击
- 24. 说说什么是 TCP 粘包和拆包
- 25. 说说从系统层面上,UDP 如何保证尽量可靠
- 26. 说说 TCP 的 keepalive,以及和 HTTP 的 keepalive 的区别
- 27. 简述 TCP 协议的延迟 ACK 和累计应答
- 28. 说说 TCP 如何加速一个大文件的传输
- 29. 说说服务器怎么判断客户端断开了连接
- 30. 说说端到端,点到点的区别
- 31. 说说浏览器从输入 URL 到展现页面的全过程
- 32. 简述 HTTP 和 HTTPS 的区别(非常重要)
- 33. 说说 HTTP 中的 Referer 头的作用
- 34. 说说 HTTP 的方法有哪些
- 35. 简述 HTTP 1.0,1.1,2.0 的主要区别
- 36. 说说 HTTP 常见的响应状态码及其含义
- 37. 说说 GET 请求和 POST 请求的区别
- 38. 说说 Cookie 和 Session 的关系和区别是什么
- 39. 简述 HTTPS 的加密与认证过程
1. 简述网络七层参考模型及每一层的作用
OSI七层模型 | 功能 | 对应的网络协议 | TCP/IP四层概念模型 |
---|---|---|---|
物理层(Physical Layer) | 该层处理数据的传输介质、数据的电气、物理特性和传输速率,如何在传输媒介上传输数据比特流等 | RS-232/C,V.35,RS-449,G.703 等 | —— |
数据链路层(Data Link Layer) | 该层提供数据的传输服务,包括数据的分帧和传输控制,保证数据在链路上可靠传输 | 802.3, 802.2, PPP, HDLC, ARP 等 | 数据链路层 |
网络层(Network Layer) | 该层用于实现不同网络之间的路由和转发,负责数据的分组传输,为数据包选择最佳路由 | IP, ICMP, IGMP, ARP, RARP, OSPF, IGRP, RIP 等 | 网际层 |
传输层(Transport Layer) | 该层提供端到端传输的可靠性和透明性,负责将应用程序发送的数据分割成合适的大小并管理数据传输的流量和速度,以确保传输的质量和可靠性 | TCP, UDP, RTP等 | 传输层 |
会话层(Session Layer) | 该层负责建立、管理和终止会话(连接),控制连接的访问和传输数据,提供数据在应用程序之间的交互 | NFS, NetBIOS, RPC, SQL 等 | —— |
表示层(Presentation Layer) | 该层的任务是在数据传输的过程中负责数据的格式和内容的转换,以确保不同设备之间传输的数据是兼容的 | MIME, XDR, ASN.1 等 | —— |
应用层(Application Layer) | 该层为网络应用程序提供服务,包括文件传输、电子邮件和网页浏览,支持应用进程间的互相通信 | FTP, HTTP, SMTP, SNMP, Telnet, DNS, TFTP 等 | 应用层 |
2. 简述静态路由和动态路由
静态路由和动态路由都是路由器在进行路由选择时使用的方法。
- 静态路由是由管理员手动设置的路由信息,不会自动更新。当网络发生变化时,需要手动更新路由表。通常适用于较简单的网络拓扑结构,网络变化频率较低的网络环境,以及对路由稳定性和安全性要求较高的网络环境。其缺点是不能动态地适用网络状况的变化,当网络状况变化后必须由网络管理员修改路由表。
- 动态路由是根据网络拓扑结构和链路状态动态计算出的最优路由。路由器之间通过交换路由信息进行计算,每个路由器都会通过协议而自动更新路由表,以适应网络变化。常见的动态路由协议有RIP、OSPF、BGP等。适用于大型网络拓扑、网络变化频繁、网络路由复杂等情况。相比静态路由,动态路由的优点在于:自动学习和更新路由表,适应网络拓扑变化,运维更加方便;同时能够支持负载均衡和故障切换等功能,提高网络可用性和可靠性。缺点则在于网络中会增加一些开销和延迟,加大网络负担。
3. 说说有哪些路由协议,都是如何更新的
路由协议是路由器之间交换路由信息的协议,常见的路由协议有RIP、OSPF、BGP等。每个路由协议都有自己的更新方式。
- RIP:RIP是一种距离向量协议,路由器以周期性的方式广播自己的路由表,包含它所知道的目的网络的距离(以交换跳数(hops)为单位),然后等待从相邻路由器返回的路由信息,并根据计算的距离更新它的路由表。RIP协议中使用最大跳数限制,超出最大跳数的路由信息会被抛弃。
- OSPF:OSPF是一种链路状态协议,路由器之间交换它们所知的整个拓扑图,并使用Dijkstra算法计算出最优路径。路由器会先测量链路的带宽、延迟和可靠性,然后计算出最短路径(基于网络拓扑),更新路由表。OSPF协议支持VLSM(可变长子网掩码),支持多个等价路径。
- BGP:BGP是一种路径向量协议,它通过互联网交换自治系统之间的路由信息,路由器更新的依据是最短AS-Path。路由器会发送BGP Update消息,包括自己所知的目的网络信息和AS-Path,然后等待BGP peer的确认或拒绝信息,然后更新本地路由表。
总的来说,距离向量协议和链路状态协议都是基于网络拓扑和链路状态计算最短路径的,而路径向量协议是基于AS-Path进行路径选择的。不同的路由协议有各自的优缺点和特点,可以根据实际需要和网络环境进行选择。
4. 简述域名解析过程,本机如何干预域名解析
域名解析是将域名转换为对应的IP地址,以便计算机网络之间进行通讯。域名解析过程包括以下几个步骤:
- 用户在浏览器地址栏输入所需访问网站的域名,例如 www.example.com。
- 操作系统本地 DNS 缓存会被首先检查,如果缓存存在目标域名对应的 IP 地址,则系统会直接返回该地址。
- 如果本地 DNS 缓存中没有目标域名对应的 IP 地址,系统会依次向本地 DNS 服务器、根 DNS 服务器、顶级域名服务器、次级域名服务器等发送查询请求,获取目标域名所对应的 IP 地址,直到查询到目标域名的 IP 地址。
- 操作系统将获取到的 IP 地址返回给浏览器,浏览器根据 IP 地址发起 HTTP 请求,获取所需网站的内容。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
本机对域名解析过程有多种方式进行干预,例如:
- 修改本地 hosts 文件:在该文件中加入域名和对应 IP 地址的映射关系,使得系统在进行域名解析时直接使用映射的 IP 地址。
- 修改本地 DNS 服务器:可以在本地 DNS 服务器中添加自定义的 DNS 记录,从而干预域名解析过程,将某个域名解析为特定 IP 地址。
- 使用第三方工具:比如 DNS 代理,可以修改 DNS 请求的目标服务器,从而实现域名解析干预的效果。
需要注意的是,对域名解析过程进行干预可能会对网络性能和安全性造成影响,因此需要谨慎使用。
5. 简述 DNS 查询服务器的基本流程是什么,DNS 劫持是什么
DNS(Domain Name System)查询服务器的基本流程如下:
- 打开浏览器,输入一个域名,比如输入 www.163.com。这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
- DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
- 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
- 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
- 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。
DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。
6. 简述网关的作用是什么,同一网段的主机如何通信
网关是连接不同网络的设备,具有将信息从一个网络传递到另一个网络的作用。通常,网关的作用包括两个方面:
- 转发数据:将数据包从源主机传到目标主机。当发送端所在的网络和接收端所在的网络不在同一子网内时,数据包需要经过网关转发。
- 路由选择:在多个网络连接时,网关会根据主机的网络路径选择最佳路由,选择合适的网络路径将数据包转发到目标主机。
在同一网段内的主机通信通常不需要经过网关。当同一网段内的主机通信时,主机会直接使用 ARP 协议来找到对方的 MAC 地址,然后直接将数据包发送到对方的 MAC 地址上。如果目标主机不在同一网段内,发送端会通过 ARP 协议向默认网关发送 ARP 请求,将数据包转发给网关。然后网关再根据路由表将数据包转发到目标主机所在的网络。
7. 简述CSRF攻击的思想以及解决方法
CSRF(Cross Site Request Forgery)全称叫做跨站请求伪造。就是黑客可以伪造用户的身份去做一些操作,进而满足自身目的。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
- 登录受信任网站A,并在本地生成Cookie。
- 在不登出A的情况下,访问危险网站B。
此时,黑客就可以获取你的 cookie 达成不可告人的目的了。
CSRF 攻击是一种请求伪造的攻击方式,它利用的是服务器不能识别用户的类型从而盗取用户的信息来攻击。因此要防御该种攻击,要从服务器端着手,增强服务器的识别能力,设计良好的防御机制。主要有以下几种方式:
- 请求头中的Referer验证(不推荐):HTTP的头部有一个 Referer 信息的字段,它记录着该次HTTP请求的来源地址(即它从哪里来的),既然CSRF攻击是伪造请求是从服务器发送过来的,那么我们就禁止跨域访问,在服务器端增加验证,过滤掉那些不是从本服务器发出的请求,这样可以在一定程度上避免CSRF攻击。 但是这也有缺点,比如如果是从搜索引擎所搜结果调整过来,请求也会被认为是跨域请求。
- 请求令牌验证(token验证):token验证是一种比较广泛使用的防止 CSRF 攻击的手段,当用户通过正常渠道访问服务器时,服务器会生成一个随机的字符串保存在session中,并作为令牌(token)返回给客户端,以隐藏的形式保存在客户端中,客户端每次请求都会带着这个token,服务器根据该token判断该请求是否合法。
8. 说说 MAC 地址和 IP 地址分别有什么作用
MAC地址(Media Access Control Address)和IP地址(Internet Protocol Address)是计算机网络技术中使用的两种不同的地址类型。
- MAC地址
- MAC地址是网卡(Network Interface Card)在出厂时固化的硬件地址,是世界上唯一的,由6个字节组成。它的作用是将一个连接到网络的设备唯一地识别出来,以便在数据链路层(如以太网、无线局域网等)传输数据时,保证数据传输的目标正确。
- MAC地址只在设备处于本地网络中时起作用,不可跨越多个网络。在数据包通过路由器等设备跨越网络时,数据包会被封装为新的数据包,其原始的MAC地址会被覆盖。
- IP地址
- IP地址是用于在互联网上唯一识别一个网络节点的地址。它包含了两部分信息,分别是网络地址和主机地址。网络地址表示主机所处的网络,主机地址表示在该网络中的唯一标识。IP地址分为IPv4和IPv6两种格式。
- 在数据传输时,IP地址是数据包在网络层上的标示,作为目标地址,用于指示数据包应该被发送到哪个网络中。在网络层的路由过程中,根据IP地址决定数据包的转发路径,从而把数据正确地传输到目标设备。因此,IP地址是实现Internet的基础,它可以让计算机在全球范围内实现互联互通。
9. 简述 TCP 三次握手和四次挥手的过程(非常重要)
TCP协议(Transmission Control Protocol)是一种可靠的数据传输协议,通过三次握手建立连接,通过四次挥手断开连接。其过程如下:
- 三次握手(建立连接)
- 第一次握手:客户端向服务端发送一个SYN(同步)数据包,表示请求连接。
- 第二次握手:服务端收到数据包后,向客户端回复一个SYN-ACK(同步-确认)数据包,表示同意请求,并告知客户端确认收到了请求。
- 第三次握手:客户端再向服务端发送一个ACK(确认)数据包,表示确认已经接受服务端的回复。
至此,连接建立成功,进入正常数据传输阶段。
- 四次挥手(断开连接)
当数据传输完毕后,需要断开连接。断开连接需要进行四次挥手:
- 首先,客户端向服务端发送一个FIN(结束)数据包,告诉它自己的数据已经发送完毕,请求终止连接,此时客户端不发送数据,但还能接收数据。
- 服务端收到FIN包后,向客户端发送一个ACK数据包,表示已经接收到了客户端的请求。此时还没有断开socket连接,而是等待剩下的数据传输完毕。
- 接着,服务端向客户端发送一个FIN数据包,表示服务端也准备关闭连接。
- 客户端收到FIN包后,向服务端发送一个ACK数据包,表示已经接收到服务端结束传输请求。等待一段时间,确保服务端不再有数据发过来,然后彻底断开连接。
完成以上四个步骤,连接就成功断开。
10. 说说 TCP 两次握手行不行,为什么要三次
TCP协议中,三次握手建立连接是必要的。两次握手的情况下,如果客户端发送的第一个SYN数据包没有到达服务端或丢失,此时服务端无法确认客户端请求的连接是否有效,也就无法响应客户端的请求;同时也无法防止已经失效的连接请求报文段被服务端(错误地)接收,从而导致服务端一直等待客户端的响应,浪费服务器资源。
具体原因可以通过如下分析:
- 简单来说,第三次握手的过程是为了确认双方的连接确实已经建立。
- 在两次握手中,如果第二次握手的确认数据包在网络中滞留,导致没有及时到达客户端,此时客户端会认为连接请求成功,并开始发送数据。但服务端并没有接收到客户端的确认请求,也不知道连接是否真正建立,从而导致服务端的状态不明确。
- 如果没有第三次握手,当客户端完成第二次握手之后,连接就建立了,但是此时服务端并不知道连接是否生效,客户端发送的数据也不能保证可靠地到达服务端,从而导致通信的不可靠性。
- 通过第三次握手,确保了双方都能知道连接已经生效,从而在中间节点保持了可靠的通信。此时,客户端和服务端均已确认连接生效,可以放心地开始数据传输。
综上所述,三次握手是为了保证TCP连接的正确性,确保通信的可靠性。
11. 简述 TCP 和 UDP 的区别,它们的头部结构是什么样的
TCP (Transmission Control Protocol) 和 UDP(User Datagram Protocol) 都是传输层协议,主要区别如下:
- 可靠性:TCP协议是一种面向连接的协议,提供可靠的数据传输,能够保证数据的有效传输和接收。UDP协议则是面向无连接的协议,无法保证数据传输的可靠性。
- TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
- 速度: TCP协议由于要进行连接的建立和断开、数据包的确认等处理,因此传输速度相对来说较慢。而UDP协议由于没有这些处理,因此能够以很高的速度传输数据。
- TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率。
- TCP是一对一的连接,而UDP则可以支持一对一、多对多、一对多的通信。
- 传输方式: TCP采用流式传输方式,数据以数据流的形式从一个端点传输到另一个端点,而UDP则采用数据报传输方式,将数据分成若干个数据包进行传输。
- 吞吐量: TCP在传输大量数据的时候效率更高,而UDP则适合一些短数据的传输。
TCP协议和UDP协议的头部结构也不同:
-
TCP头部字段包括源端口、目标端口、序列号、确认号、数据偏移、预留位、标志位、窗口大小、校验和和紧急指针等。
-
UDP头部字段包括源端口、目标端口、长度和校验和等。
12. 简述 TCP 连接和关闭的状态转移
上半部分是TCP三路握手过程的状态变迁,下半部分是TCP四次挥手过程的状态变迁。
TCP连接有多个状态,以下是TCP连接状态的转移:
- CLOSED:初始状态,表示TCP端口没有被使用或者已经关闭。
- LISTEN:表示TCP服务器端被动监听状态,等待客户端连接请求。
- SYN_SENT:表示TCP客户端向TCP服务器端发送连接请求报文段并进入到SYN_SENT状态,等待服务器的响应。
- SYN_RECEIVED:表示TCP服务器端接收到SYN报文段并回应SYN_ACK,进入到SYN_RECEIVED状态,等待客户端的确认。
- ESTABLISHED:表示TCP连接已经建立。在这种状态下,客户端和服务端可以进行数据传输。
- FIN_WAIT_1:表示TCP客户端发送FIN报文段并进入到FIN_WAIT_1状态,等待服务端的ACK确认报文段。
- CLOSE_WAIT:表示TCP服务端接收到来自客户端的FIN并发送ACK信息确认已经接受该请求。
- FIN_WAIT_2:表示客户端已经接收到ACK确认报文段,等待服务器发送FIN报文段。
- LAST_ACK:表示TCP客户端发送最后的ACK报文段,等待服务端的确认。
- TIME_WAIT:表示TCP连接正在关闭,等待一段时间,确保所有的报文都被正确接收和处理后状态才能转为CLOSED状态。
- CLOSED:表示TCP连接彻底关闭。
以上是TCP连接状态的典型转移过程,不过在实际应用中可能会有变化。
对于TCP连接的断开,有以下几个状态转移:
- FIN_WAIT_1:接收到来自另一端的FIN报文段,进入FIN_WAIT_1状态。
- CLOSING:同样是接收到来自另一端的FIN报文段,进入CLOSING状态。
- TIME_WAIT:在主动关闭连接的一方,发送完最后的ACK确认报文段后,进入TIME_WAIT状态,等待一段时间。
- LAST_ACK:服务端收到客户端发送的FIN报文后,发送ACK确认报文段,等待客户端的最后一次ACK回应。
- CLOSED:表示TCP连接已彻底关闭,不再进行任何通信。
13. 简述 TCP 慢启动
TCP慢启动是TCP拥塞控制算法中的一种,用于控制数据传输的速度,保证网络拥塞的稳定性。
在TCP建立连接时,会根据网络的状况来选择一个合适的窗口大小。如果突然发送大量的数据,会引起网络拥塞,影响网络的正常工作。因此,在发送数据之前,TCP先采用“慢启动”的策略来逐渐增加数据的发送速度。
具体过程如下:
- 初始值:将拥塞窗口 cwnd 初始化为 1 个 MSS(最大报文段长度)。
- 指数增长:每当确认成功接收到一个数据包,拥塞窗口 cwnd 就会加倍。每一个确认接收到的数据包都会对 cwnd 的值加一。因此,cwnd 短时间内将以指数级增长,并且数据传输的速度也越来越快。
- 线性增长:当 cwnd 的值增长到某一程度后,就不再以指数增长,而是转为线性增长。这时每收到一个 ACK(确认应答),就把 cwnd 窗口增大一个 MSS(最大报文段长度)。
- 拥塞避免:当 cwnd 的值达到一个较大的阈值 ssthresh 后,就进入拥塞避免阶段。在拥塞避免阶段,cwnd 的值每经过一个 RTT(往返时间),就增加一个 MSS(最大报文段长度)。
慢启动阶段持续的时间是 TCP 的一个 RTT(往返时间),每个 RTT 内的数据传输速率逐渐递增,如果网络没有出现拥塞,则可以达到最大速率,否则将进入拥塞控制状态,通过调整 cwnd 的大小以控制发送速率。
慢启动可以有效地避免数据发送过快而导致的拥塞,控制网络的拥塞状态,保证网络的稳定和高效运行。
14. 说说 TCP 如何保证有序
主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。
具体步骤如下:
- 为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区。
- 并为每个已发送的数据包启动一个超时定时器。
- 如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区。
- 否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。
- 接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。
15. 说说 TCP 常见的拥塞控制算法有哪些
TCP拥塞控制算法是保证TCP网络拥塞控制、稳定通信的重要机制,目前主要有以下几种算法:
- 慢启动(Slow Start):在建立一次TCP连接或从网络拥塞状态中恢复时,发送方发送的报文数量将逐渐增加,防止网络过早出现拥塞。
- 拥塞避免(Congestion Avoidance):在发送方发送的报文数量达到某一阈值时,根据网络拥塞情况逐渐增加拥塞窗口大小来提高网络吞吐量。
- 快重传(Fast Retransmit):在接收方发送丢失报文片段的确认信息后,发送方立即重传丢失报文片段,而不必等待超时重传触发,减少网络负担。
- 快恢复(Fast Recovery):在接收到一个重复的确认信息后,预测网络仍有很多可用的带宽,会将拥塞窗口设置为慢启动门限的一半,并继续进行数据包的发送。
- TCP Vegas:通过测量报文段的往返时间(RTT)来获得网络拥塞状态,并减慢发送速度来避免出现网络拥塞。
- TCP Flow Control:通过协商和协调TCP连接方的发送速率和接收速率,实现数据在不同传输速度下的高效传送与流量控制。
- TCP BIC:在基于TCP的Cubic拥塞控制算法的基础上,加大拥塞窗口的增长率,保证在高速网络上的稳定性和吞吐量。
16. 简述 TCP 超时重传
TCP超时重传是TCP协议中一种用于保证数据可靠性的重传机制,用于解决网络传输中由于丢包等问题引起的数据传输失败的问题。
具体过程如下:
- 发送方向接收方发送数据,并设置一个超时计时器。
- 接收方接收到数据后,向发送方返回ACK确认信息。
- 如果发送方在超时计时器结束之前接收到ACK确认信息,则表示数据传输成功。如果接收方没有返回ACK确认信息,发送方认为该数据丢失,并会进行超时重传。
- 超时重传机制会重新启动计时器,然后重新发送之前未收到ACK确认的数据段。如果在重新发送数据之前,接收方已经收到了该数据段,则接收方会忽略重复的数据段。
- 如果重传多次仍未能接收到ACK确认信息,就会认为连接已中断,并采取相应措施,如断开当前连接或重新建立连接等。
17. 说说 TCP 可靠性保证
TCP 是一种面向连接的可靠传输协议,它可以保证数据的正确传输和接收,同时还具有拥塞控制、流量控制等机制,为应用程序提供了相对稳定的网络通信服务。具体来说,TCP 可靠性保证主要体现在以下几个方面:
- 可靠的传输:TCP 采用了序列号、确认和重传等机制,保证数据在传输过程中不丢失、不重复、不失序,并且可以快速响应丢失的数据并进行重传。
- 超时重传:在数据传输中如果有数据包没有收到确认信息,则会根据超时时间进行重传,确保数据不会丢失。
- 流量控制:TCP 会通过协商和协调连接方的发送速率和接收速率来保证数据的顺畅传输和流量控制。
- 拥塞控制:TCP 通过拥塞窗口和拥塞状态检测机制,在网络拥塞时通过减少发送速率来避免网络崩溃,从而保证数据传输的稳定性。
综上所述,TCP 通过序列号、确认、超时重传、流量控制和拥塞控制等机制来保证网络数据传输的可靠性和数据完整性,避免出现数据丢失、重复和失序,同时避免网络拥塞带来的问题,为分布式应用程序提供了强大的网络通信服务。
18. 简述 TCP 滑动窗口以及重传机制
TCP 滑动窗口和重传机制是在 TCP 可靠传输中非常重要的机制。
- TCP 滑动窗口机制是通过在发送方和接收方之间控制发送报文数量来控制数据传输的速度。在 TCP 数据传输过程中,发送方和接收方之间共同维护一个窗口大小,称为滑动窗口。发送方每次发送的数据量不能超过接收方定义的滑动窗口大小,或者是网络的拥塞窗口大小,如果超过则会丢失部分数据。接收方通过维护一个接收窗口来控制自己的接收数据速度,当接收方收到数据后,会向发送方发送一个接收窗口的值,告知发送方还可以发送多少数据。通过控制窗口大小,TCP 可以在网络不稳定的情况下进行数据传输,防止数据丢失,实现流量控制。
- TCP 重传机制是通过检测数据丢失并重新发送丢失的数据来保证可靠传输。在 TCP 数据传输过程中,如果发送方在规定的超时时间内没有收到接收方发送的确认消息,则会认为数据已经丢失,需要重新发送。如果发送方发送的数据段与上一次发送的相同,则不需要重新发送,并将上一次包的确认应答返回给接收方,从而减少了网络拥塞的程度,提高了网络的效率。通过这种方式,TCP 可以在网络不好的情况下实现数据可靠的传输。
19. 说说滑动窗口过小怎么办
我们可以假设窗口的大小是1,也是就每次只能发送一个数据,并且发送方只有接受方对这个数据进行确认了以后才能发送下一个数据。如果说窗口过小,那么当传输比较大的数据的时候需要不停的对数据进行确认,这个时候就会造成很大的延迟。
20. 说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍
TCP 的三次握手是建立 TCP 连接的重要过程。每个端点在发送/接收 SYN 和 ACK 报文时,都带有一个序列号和确认号,并通过这些号码来确认彼此知道对方的存在。如果其中一方没有收到另一方的 SYN 或 ACK 报文,则会发生以下情况:
- 第一次握手 SYN:
如果发送方发送了第一次握手 SYN,但接收方没有回复 SYN-ACK 报文,那么发送方会等待一段时间,然后重传该 SYN 报文。如果重传三次后,仍然没有接收到 SYN-ACK 或 RST 报文,则发送方会放弃连接尝试并关闭连接。因为如果没有收到目标端点的 SYN-ACK 报文,则连接不能被视为有效的 TCP 连接。
- 第二次握手 SYN-ACK:
如果发送方发送了第二次握手的 SYN-ACK 报文,但是接收方没有回复 ACK 报文,则发送方会认为连接还未建立,并重发 SYN-ACK 报文。这个过程将持续,直到接收方发送 ACK 或 RST 报文,才结束连接。
- 第三次握手 ACK:
如果发送方发送了第三次握手的 ACK 报文,但是接收方没有收到该报文,则发送方会再次发送该 ACK 报文。如果重发多次后,仍然没有收到接收方的回复,则会认为连接建立失败,并尝试关闭连接。
21. 简述 TCP 的 TIME_WAIT,为什么需要有这个状态
TCP 的 TIME_WAIT 状态是在 TCP 连接的关闭过程中出现的一种状态,它表示连接已经关闭,但是等待一段时间以确保网络上所有剩余的数据包都已经被传输完毕,防止任何过时的数据包在下一个新连接中出现,从而避免数据混乱。
在 TCP 连接的关闭过程中,最后一个 ACK 报文在发送后,等待一段时间以确保对方收到此报文,经过这个时间间隔后才会进入 TIME_WAIT 状态,等待关闭连接的对端在一定时间内未能收到该报文,则会发送 RST 报文强制关闭连接。此阶段持续的时间通常为 2MSL(Maximum Segment Lifetime,最长分段寿命),因为 TCP 报文传递所有路径的最长时间不应超过该时间。如果不等待 2MSL,就有可能出现网络上旧连接遗留的数据包被新连接错误地接收到的情况。这将导致数据包出现重复和乱序等情况。
因此,TIME_WAIT 状态的存在是为了保证连接的可靠性和稳定性。它可以确保网络上所有的数据包都已传输完毕,预防旧的连接信息干扰新的连接,从而保证下一个连接的可靠性。同时,它也提供一种错误检测和故障恢复机制,确保 TCP 连接处于健康状态。
22. 简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭
MSL 是 TCP 协议中的一个重要参数,表示数据报文在网络中的最长寿命时间。在网络中,每个数据报文在经过一定时间后,如果还没有到达目的地,则可能被网络设备舍弃,从而导致数据传输出现错误或断开。
为了防止这种情况的发生,TCP 协议规定任何一段时间内发送和接收的 TCP 报文片段都应该在 MSL 段时间内到达或者被丢弃,以及保证连接的稳定性。MSL 实际上是指定了 TIME_WAIT 的最小超时值,通常为 2 倍的最长分段寿命(2MSL)。
客户端连接在主动关闭连接时,会向服务端发送 FIN 报文,等待接收到服务端的确认报文(FIN-ACK)后,进入 TIME_WAIT 状态并等待 2MSL 的时间,以确保之前由该连接产生的所有分组在网络中完全消失,避免这些分组被错误地路由到新的连接中产生混淆,从而保证了连接的稳定性。在这个时间段内,如果网络上还有残留的数据包出现,它们会被丢弃,不会给后续的连接造成影响。
因此,客户端连接要等待2MSL的时间才能完全关闭,是为了保证数据包的可靠传输和保证连接的稳定性,从而避免出现数据包重复、乱序等问题,保证下一个新连接的可靠性。
23. 说说什么是 SYN flood,如何防止这类攻击
SYN flood 是一种常见的攻击方法,利用 TCP 协议中的三次握手过程传输大量伪造的 SYN 数据包,从而导致服务器在处理伪造的连接请求时耗尽资源,无法接受合法连接请求。SYN flood 攻击通常是一种分布式拒绝服务(DDoS)攻击,并且很难被铲除,危害性很大。
针对 SYN flood 攻击,可以采取以下几种防范措施:
- 加强网络设备安全:通过加强网络设备的安全性来防范 SYN 攻击。例如通过升级设备固件、缩小设备开放端口范围、添加入侵检测系统(IDS)等来防止病毒和恶意攻击。
- 增加专业防火墙:专业的防火墙可以检测和过滤 SYN 请求报文。例如,通过限制单个 IP 的连接数、设置连接超时时间、加强 SYN Cookie 等方法可以防止 SYN 攻击。
- 调整 TCP 连接参数:修改 TCP 连接参数可以增强服务器的连接限制和资源分配。例如,通过修改最大连接数、调整队列深度等参数可以有效控制 TCP 连接。
- 使用硬件设备协助:硬件设备可以检测和过滤 SYN 数据包,例如交换机、路由器等网络设备可以处理大量的流量和请求数量,从而抵御 SYN 攻击。
24. 说说什么是 TCP 粘包和拆包
TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况:
- 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包。
- 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包。
- 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包。
- 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。
25. 说说从系统层面上,UDP 如何保证尽量可靠
UDP 是一种面向无连接的传输协议,与 TCP 相比,UDP 没有提供可靠的传输、拥塞控制或流量控制等机制。但是,UDP 在系统层面上可以采取以下措施尽量保障其可靠性:
- 使用数据校验:UDP 首部提供了一个16位字段的校验和,用于校验 UDP 数据的完整性。发送方在发送 UDP 数据时,计算校验和,并将该值填写在 UDP 首部中的校验和字段中。接收方在接收 UDP 数据时,计算校验和,检查是否与校验和字段中的值相同。如果不相同,则说明数据已经损坏,应该被丢弃。通过数据校验,可以保证 UDP 数据在传输过程中不被篡改或者损坏。
- 使用确认机制:在 UDP 中,无法判断数据包是否传输成功。但是可以使用确认机制,通过接收方向发送方返回一个确认报文来保证数据是否被成功传输。发送方在发送 UDP 数据后,等待一段时间后(或在收到接收方的应答数据后),如果未收到确认报文,则说明数据可能已经丢失或者被损坏,应该进行重传。通过确认机制,可以保证 UDP 数据的可靠传输。
- 重传机制:如果接收方在一定时间内未收到发送方发送的 UDP 数据,则发送方会进行重传。接收方在收到重传数据时,可以通过计算校验和、检查序列号等方式来确保数据的正确性。重传机制可以避免 UDP 数据丢失或损坏,数据能够被成功传输。
26. 说说 TCP 的 keepalive,以及和 HTTP 的 keepalive 的区别
TCP 的 keepalive 是指在通信双方建立连接后,若长时间没有数据传输时,会通过发送一些特定的探测报文段来判断对方是否仍然处于连接状态。TCP 的 keepalive 主要被用于避免无操作接口(idle socket)长时间占用系统资源,以及检测连接是否断开。
TCP keepalive 的工作流程如下:
- 发送端发送 keepalive 报文(ACK)给接收端。
- 接收端返回 ACK 应答报文。
- 如果在规定的时间内没有收到应答报文,发送端会重新发送 keepalive 报文。
- 如果连续多次没有收到应答报文,则会将该连接视为无效连接,关闭连接。
与 TCP keepalive 不同的是,HTTP keepalive 主要用来减少 HTTP 协议的请求建立和断开连接所需的时间,以及提高服务器处理请求的效率。HTTP keepalive 需要在 HTTP 请求头中添加 Connection:keep-alive 字段,开启 HTTP keepalive 机制后,客户端可以在一个 TCP 连接中发送多个 HTTP 请求,服务器在收到请求后不会立即关闭连接,而是会继续保持连接,直到达到一定超时时间或者客户端主动关闭连接。
HTTP keepalive 和 TCP keepalive 的区别主要包括:
- 作用范围不同:TCP keepalive 用于检测连接是否正常和避免资源浪费,而 HTTP keepalive 则主要是为了提高 HTTP 请求的吞吐量和效率。
- 使用场景不同:TCP keepalive 适用于所有基于 TCP 的应用,HTTP keepalive 则只适用于 HTTP 协议。
- 心跳机制不同:TCP keepalive 的心跳机制是由 TCP 协议自身负责的,HTTP keepalive 的心跳机制则是由应用层自行实现的。
27. 简述 TCP 协议的延迟 ACK 和累计应答
- 延迟应答指的是:TCP在接收到对端的报文后,并不会立即发送ack,而是等待一段时间发送ack,以便将ack和要发送的数据一块发送。当然ack不能无限延长,否则对端会认为包超时而造成报文重传。linux采用动态调节算法来确定延时的时间。
- 累计应答指的是:为了保证顺序性,每一个包都有一个ID(序号),在建立连接的时候,会商定起始的ID是多少,然后按照ID一个个发送。而为了保证不丢包,对应发送的包都要进行应答,但不是一个个应答,而是会应答某个之前的ID,该模式称为累计应答。
28. 说说 TCP 如何加速一个大文件的传输
- 建连优化:TCP 在建立连接时,如果丢包,会进入重试,重试时间是 1s、2s、4s、8s 的指数递增间隔,缩短定时器可以让 TCP 在丢包环境建连时间更快,非常适用于高并发短连接的业务场景。
- 平滑发包:在 RTT 内均匀发包,规避微分时间内的流量突发,尽量避免瞬间拥塞。
- 丢包预判:有些网络的丢包是有规律性的,例如每隔一段时间出现一次丢包,例如每次丢包都连续丢几个等,如果程序能自动发现这个规律(有些不明显),就可以针对性提前多发数据,减少重传时间、提高有效发包率。
- RTO 探测:若始终收不到 ACK 报文,则需要触发 RTO 定时器。RTO 定时器一般都时间非常长,会浪费很多等待时间,而且一旦 RTO,CWND 就会骤降(标准 TCP),因此利用 Probe 提前与RTO 去试探,可以规避由于 ACK 报文丢失而导致的速度下降问题。
- 带宽评估:通过单位时间内收到的 ACK 或 SACK 信息可以得知客户端有效接收速率,通过这个速率可以更合理的控制发包速度。
- 带宽争抢:有些场景(例如合租)是大家互相挤占带宽的,假如你和室友各 1Mbps 的速度看电影,会把 2Mbps 出口占满,而如果一共有 3 个人看,则每人只能分到 1/3。若此时你的流量流量达到 2Mbps,而他俩还都是 1Mbps,则你至少仍可以分到 2/(2+1+1) * 2Mbps = 1Mbps 的 50%的带宽,甚至更多,代价就是服务器侧的出口流量加大,增加成本。(TCP 优化的本质就是用带宽换用户体验感)
29. 说说服务器怎么判断客户端断开了连接
当服务器与客户端建立连接之后,可以通过以下几种方式判断客户端是否已经断开连接:
- 超时判断:服务器可以设置一个超时时间,如果在超时时间内没有收到客户端的任何消息,那么服务器就认为客户端已经断开连接。通常情况下,超时时间的取值应该根据实际情况来设置,以避免超时时间过长导致资源浪费,或者过短导致误判。
- 接收报错:当服务器端在接收客户端数据时,如果读取操作返回错误,那么就可以判断客户端已经断开连接。
- 发送数据时发生的错误:当服务器端向客户端发送数据时,如果发送操作返回错误,那么就可以判断客户端已经断开连接。
- 使用心跳检测:心跳检测可以通过定期向客户端发送小数据包来判断客户端是否还在连接状态,如果连续数次发送失败,则认为客户端已经断开连接。
需要注意的是,在服务器端判断客户端是否已经断开连接时,应该充分考虑网络不稳定的情况,避免误判。对于敏感数据的处理,可以使用更加可靠的判断方法来避免数据丢失或泄露,例如通过双方协商的方式来实现数据加密、校验等操作。
30. 说说端到端,点到点的区别
端到端(End-to-End)和点到点(Point-to-Point)是指在计算机网络通信中的不同传输方式。
- 端到端:端到端通信是针对传输层来说的,传输层为网络中的主机提供端到端的通信。端到端通信指数据从源到目的地之间经过多个网络节点,每一个节点只起到中转作用,并没有对数据做任何处理。在端到端通信中,任何的智能处理都应该在源和目的地之间的节点中完成。端到端通信的主要思想是让较高层的协议尽可能的接近应用程序,让较低层的协议尽可能简单。
- 点到点:点到点通信是针对数据链路层来说的,因为数据链路层只负责直接相连的两个节点之间的通信。点到点通信指数据传输链路只有源和目的地两个节点,也就是数据是直接从源传输到目的地,并且中间没有其他节点的介入。在点到点通信中,传输过程中的任何智能处理都应该在数据源和目的地之间完成,中间的网络节点只是作为物理传输的中转站,对数据进行简单的转发,不进行处理。
总的来说,端到端和点到点都是计算机网络通信中的传输方式。端到端通信更加灵活,具有更强的适应性,可以应用于各种不同的网络环境。点到点通信则更加简单,优点是传输速度快,但是限制了传输的路线,只能采用比较简单的方法进行数据传输。在网络通信中,具体使用端到端还是点到点传输方式应该根据具体的应用场景和需求来决定。
31. 说说浏览器从输入 URL 到展现页面的全过程
- 输入 URL:用户在浏览器地址栏中输入 URL 地址,浏览器通过 DNS 解析得到服务器的 IP 地址。
- 发起 HTTP 请求:浏览器向服务器发出 HTTP 请求,请求包括 HTTP 请求头和请求体。
- 服务器处理请求:服务器接收到请求之后,处理请求并返回 HTTP 响应,响应也包括 HTTP 响应头和响应体。
- 浏览器接收响应:浏览器接收到服务器的响应之后,开始解析响应头和响应体。
- 解析响应头:浏览器解析响应头,根据响应头中包含的信息来判断响应的类型(HTML、CSS、JS、图片、音视频等)以及是否需要重定向等操作。
- 解析响应体:浏览器根据响应类型,使用相应的解析引擎解析响应体,如 HTML 解析引擎、CSS 解析引擎、JS 解析引擎等。
- 构建 DOM 树:浏览器根据 HTML 文档中的标签和属性,构建出 DOM 树来表示 HTML 文档的结构。
- 构建 CSSOM 树:浏览器根据 CSS 样式规则和继承关系,构建出 CSSOM 树来表示 CSS 文档的结构。
- 渲染页面:浏览器根据 DOM 树和 CSSOM 树,计算出每个元素在浏览器窗口中的位置、大小等信息,然后将其绘制在屏幕上,完成页面的渲染展示。
- 执行 JS 脚本:在渲染页面的过程中,如果遇到 JS 脚本,则浏览器会暂停页面的渲染,执行 JS 脚本。JS 脚本的执行可能会改变 DOM 树和 CSSOM 树的结构,从而影响页面的渲染。
以上是浏览器从输入 URL 到展现页面的全过程。其中涉及到了多个模块和操作,例如 DNS 解析、HTTP 协议、HTML、CSS、JS 等,并且每个模块和操作均对最终的页面展现产生影响,需要有一个正确而高效的执行流程来保证页面的正常渲染和交互。
32. 简述 HTTP 和 HTTPS 的区别(非常重要)
- HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
- HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTP与HTTPS的区别:
- 安全性:HTTPS 经过 SSL/TLS 加密传输数据,从而保证传输过程中的安全,而 HTTP 传输的数据是明文的,容易遭受黑客的攻击。
- 连接方式:HTTP 是基于 TCP 连接的,HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 加密协议,所以是基于 SSL/TLS 连接的。
- 默认端口:HTTP 默认端口号为 80,HTTPS 默认端口号为 443。
- 证书认证:HTTP 没有证书认证的机制,而 HTTPS 需要使用 SSL/TLS 证书进行认证,只有通过认证的网站才能建立安全的连接。
- 性能:HTTPS 传输数据需要经过 SSL/TLS 加密和解密过程,因此会耗费更多的服务器资源和带宽,导致传输速度稍慢。
33. 说说 HTTP 中的 Referer 头的作用
HTTP 中的 Referer 头用于标识 HTTP 请求的来源,即告诉服务器当前请求的页面是从哪个页面跳转过来的。referer 头可以用来记录用户访问的轨迹、优化网站的跳转流程以及辅助用户行为分析等。
Referer 头通常在 HTTP 请求中包含页面 URL,可以告诉服务器当前请求的页面是从哪个页面链接过来的。例如,当用户浏览商品页面并点击“加入购物车”按钮时,会向服务器发送添加购物车的请求,并在请求 header 中包含 Referer 头,从而告诉服务器本次请求是从哪个商品页面跳转过来的。
Referer 头的作用如下:
- 网站分析:可以根据 Referer 头记录用户浏览页面的顺序和路径,进行用户行为分析,从而优化网站的页面跳转流程和内容呈现方式等。
- 防盗链:网站防止自身的资源被其他站点盗链,可以通过检查 Referer 头的值,来判断当前请求是否来自合法的站点。
需要注意的是,Referer 头并不是强制性的,浏览器或其他客户端可以选择不发送该头信息,从而不向外暴露用户的浏览行为,提升用户隐私保护。
34. 说说 HTTP 的方法有哪些
HTTP(Hypertext Transfer Protocol)协议是一种应用层协议,主要用于在 Web 应用程序中传输数据。HTTP 协议定义了客户端和服务端之间进行请求和响应的方式,而 HTTP 方法则定义了客户端与服务器交互时的不同动作类型。
HTTP 方法主要有以下几种:
- GET:从服务器获取资源。该方法是 HTTP 协议中最常用的一种。通过 GET 方法客户端可以向服务器发送一个请求,从而获取特定资源(如 HTML 页面或图片等)的内容。GET 请求不会改变服务器上的数据,因此被视为“幂等”的方法。
- POST:向服务器提交资源。该方法通常用于向服务器提交一个新的实体资源(如网页表单、文件上传等),客户端向服务器发送一个请求将要提交的数据作为请求 PAYLOAD 发送到服务器。POST 请求有时也用于修改现有资源,但这取决于后端 Web 应用程序的具体实现。
- PUT:更新服务器上资源。PUT 方法的作用是向服务器上传更新后的文件,它会将请求 PAYLOAD 中的数据存储在服务器上。如果服务器已经存在相应的资源,PUT 方法会修改该资源,否则会新建一个资源。
- DELETE:删除服务器上的资源。DELETE 方法的作用是在服务器上删除指定的资源。它通常被用来删除一个数据库记录或文件等。
- HEAD:获取与 GET 方法相同的响应,但是没有响应体。HEAD 方法与 GET 方法类似,但在获取响应时会忽略响应体,只返回文件头部分,这使得 HEAD 方法更加高效。
- OPTIONS:获取服务器支持的 HTTP 方法列表。OPTIONS 方法的作用是向服务器请求获取响应时,服务器会返回当前 Web 资源支持使用的 HTTP 方法列表。
- CONNECT:用于实现与 Web 服务器的代理服务器通信。CONNECT 方法通常用于 SSL/TLS 加密的连接,通过代理进行通信。
- TRACE:回显服务器收到的请求,用于诊断。TRACE 方法的主要用途是诊断 Web 服务器的请求响应链,它会使得服务器将接收到的请求原样返回给客户端,例如用于分析和调试 HTTP 可能存在的问题和错误。
总的来说,HTTP 方法可以让客户端通过特定的方式发送请求,传递不同的数据类型和参数,而服务端则能够根据不同的请求方式做出相应的响应。
35. 简述 HTTP 1.0,1.1,2.0 的主要区别
HTTP协议在不同的版本之间有一些重要的区别,以下是HTTP 1.0,1.1和2.0的主要区别:
- 连接复用:
HTTP 1.0中默认使用持续连接,即每个请求都需要一个新的TCP连接。但是,HTTP 1.1引入了连接复用技术,使单个TCP连接可以传输多个请求和响应,从而加快了数据传输的速度,并减少了网络负载。
HTTP 2.0也支持多路复用(Multiplexing)功能,不仅支持更高效的同时传输多个请求,而且可以更好地满足 HTTP 协议语义,避免了复杂的序列化。
- 请求管道:
HTTP 1.0可以发送多个请求,但需要等待每个响应的返回才能继续向下执行。HTTP 1.1引入了“请求管道”功能,可以在同一个TCP连接中同时发送多个请求,而且响应的返回顺序与请求的发送顺序无关,从而快速且高效地执行。
HTTP 2.0的多路复用功能更为强大,它支持多个请求和响应的“乱序交织”,同时支持优先级、依赖关系和服务端推送等功能。
- 请求头压缩:
HTTP协议的请求和响应头部信息通常很长,其中可能包括许多重复信息。HTTP 1.1和2.0都支持对头部信息的压缩,减少了数据传输量,从而提高了性能。
HTTP 1.1使用gzip或deflate来压缩头部信息,而HTTP 2.0 使用更高效的HPACK压缩算法,可以降低大约50%的头部大小,并且能够更好地适应动态头部大小的变化。
- TLS加密:
HTTP 1.0和HTTP 1.1都支持通过TLS/SSL实现HTTPS协议来进行安全数据传输。HTTP 2.0 强制要求使用 TLS 加密通信,扩大了浏览器对TLS加密技术的支持,并采用更加安全可靠的TLS协议版本。
36. 说说 HTTP 常见的响应状态码及其含义
HTTP(Hypertext Transfer Protocol)是Web应用程序协议。在HTTP中,响应状态码用于表示服务器对浏览器请求的结果进行响应时所返回的状态码。HTTP响应状态码主要分为5类,以下是常见的响应状态码及其含义:
- 1xx(信息响应类别):表示请求已被服务器接收,客户端应该继续发送后续请求。
- 100 Continue:表示客户端应该继续发送请求。这个状态码告诉客户端,虽然当前的请求已被接收,但仍需要等待后续请求,直到服务器最终向客户端发送200 OK状态码为止。
- 2xx(成功响应类别):表示请求已被服务器接收、理解和接受。
- 200 OK:表示请求已成功响应并返回所请求的资源。
- 201 Created:表示服务器已成功创建了一个新资源。
- 204 No Content:表示服务器已成功响应,但响应的实体没有包含任何内容。通常会用于删除操作。
- 3xx(重定向类别):表示用户要访问资源的位置已发生变化。
- 301 Moved Permanently:表示所请求的资源已经被永久移动到新URL,并且未来任何对此URL的请求都应该被定向到新URL。
- 302 Found:表示所请求的资源暂时被移动到新URL上,未来可能会恢复原URL。但通常情况下302会被滥用,SEO建议使用301。
- 304 Not Modified:表示客户端请求的资源未被修改,服务器不会返回实体信息,请求的资源为缓存内容。
- 4xx(客户端错误类别):表示客户端提交的请求有误。
- 400 Bad Request:表示客户端发送的请求中存在语法错误,服务器无法理解此请求。
- 401 Unauthorized:表示客户端请求的内容需要身份验证或者认证失败。
- 403 Forbidden:表示客户端请求被服务器拒绝,有访问权限但是访问被禁止。
- 404 Not Found:表示所请求的资源在服务器上不存在。
- 5xx(服务器错误类别):表示服务器处理请求时发生错误。
- 500 Internal Server Error:表示服务器内部错误,无法完成请求。
- 502 Bad Gateway:表示服务器充当网关或代理服务器时,未能及时从上游服务器或者其他服务器收到响应。
- 503 Service Unavailable:表示服务器由于过载或维护而暂时无法处理请求。
37. 说说 GET 请求和 POST 请求的区别
HTTP协议中最常用的请求方法是GET和POST,这两种请求方法在协议的语义和实现上存在一些显著的差异,以下是它们之间的区别:
- 数据的位置不同
- GET方法数据会附在URL之后(即请求行中),以?分隔URL和传输数据,多个参数之间使用&连接,传输数据量受URL长度限制;
- POST方法数据通过请求体(body)发送,不会附在URL之后,可以传输大量数据。
- 安全性不同
- GET方法的参数会被浏览器缓存,因此会留下历史记录,使用GET方式传输敏感数据会造成安全问题;
- POST方法的参数不会被缓存或添加到浏览器历史记录中,相对来说更安全,但依然不适合传输高度敏感的数据。
- 语义不同
- GET方法是一种“幂等”的方法,无论调用多少次,请求结果都是相同的,不会对服务器产生任何副作用;
- POST方法是一种“非幂等”的方法,在每次请求时都会在服务器上创建一个新的资源,会对服务器产生副作用。
- 应用场景不同
- GET方法适用于获取资源的操作,例如查询、搜索;
- POST方法适用于向服务器提交数据的操作,例如注册、登录、修改密码等。
总的来说,GET方法用于获取或查询资源,对数据的传输量有限制,安全性相对较差。POST方法用于提交或修改资源,可以传输大量数据,安全性较高。具体应该根据场景需求来选择使用哪种方法。
38. 说说 Cookie 和 Session 的关系和区别是什么
Cookie和Session都是用来跟踪用户身份和维持状态的机制。它们之间的关系和区别如下:
- 关系:
- Cookie和Session都是在Web服务器和Web浏览器之间的交互中使用的管理用户标识和状态的机制。
- Cookie是将一段文本存储在客户端浏览器中,返回给服务器,由服务器进行解析。Cookie是存储在客户端浏览器中的,因此服务器可以将不同的Cookie返回给同一客户端的不同网页。因此,它对于实现跨页面(跨请求)的状态管理非常有用。
- Session是服务器创建并存储的用户标识和状态,其信息存储在服务器上,而不是存储在客户端浏览器上。会话一般是被用户访问完网站一定时间后自动销毁。
- 区别:
- 存储位置:Cookie 存储在客户端浏览器中,Session 存储在服务器上。
- 数据安全性:从数据安全性来看,Session 比 Cookie 更为安全,因为 Session 的数据存储在服务器上,客户端无法修改,而 Cookie 存储在客户端浏览器中,容易被修改。
- 数据存储大小:Cookie 存储在客户端浏览器中,存储大小通常为4KB左右,而 Session 存储在服务器上,存储大小不受限制。
- 过期时间:Cookie 可以设置过期时间,可以在指定时间内保持有效,而 Session 默认过期时间为30分钟(根据服务器的设置调整),一旦超时就会销毁。
39. 简述 HTTPS 的加密与认证过程
HTTPS(Hypertext Transfer Protocol Secure)是在HTTP协议上采用SSL/TLS加密的安全通信协议,用于在互联网上保护数据传输的安全。HTTPS通信过程主要包括以下几个步骤:
- 握手协议
客户端向服务器端发起一个SSL连接请求,请求连接的端口默认为443。连接建立以后,服务端和客户端之间开始进行SSL握手协议,该协议主要包括以下四个步骤:
- 客户端向服务器发送一个SSL/TLS版本号和随机数据(Client Hello)。
- 服务器端向客户端回应其SSL/TLS版本号和随机数据,同时也向客户端发送自己的身份认证信息,包括服务器数字证书、公钥和签名等(Server Hello)。
- 客户端验证服务器的数字证书,检查证书的有效性,包括证书的颁发机构、序列号、过期时间等,如果通过验证,就向服务器发送使用公钥加密的对称加密算法的随机密钥(pre-master secret)。
- 服务器收到客户端的信息后,使用私钥解密,获取对称加密算法的密钥,然后向客户端发送使用此密钥加密的响应信息,客户端使用此密钥进行解密。
- 加密通信
SSL握手协议完成后,客户端和服务器之间采用对称加密算法进行通信。服务器通过公钥将对称加密算法的密钥发送给客户端,之后的数据传输都采用该密钥进行加密。对称加密可以加快加密和解密的速度,提高数据传输的效率。
- 断开连接
当一方(客户端或服务器)发送断开连接请求时,另一方将发送断开连接响应信息,然后关闭SSL连接。
综上,HTTPS通过采用SSL/TLS协议对HTTP报文进行加密并进行身份认证,有效地保护了数据传输的安全性。在整个通信的过程中,通过握手协议、加密和解密过程以及数字证书的验证和签发等多种方式,增强了HTTPS通信的安全性和可靠性。