1.简述一下TCP和UDP的区别?
特性 | TCP(Transmission Control Protocol) | UDP(User Datagram Protocol) |
---|---|---|
连接类型 | 面向连接,需要建立三次握手连接 | 无连接,发送数据无需建立连接 |
数据传输 | 提供可靠的数据传输,保证数据顺序和完整性 | 不保证数据传输的可靠性,不保证数据顺序 |
错误校验 | 通过确认和重传机制进行错误检测和纠正 | 提供基本的错误检测,但不进行重传 |
流控制 | 使用滑动窗口机制进行流量控制 | 无流控制机制 |
拥塞控制 | 包含慢启动、拥塞避免等机制以控制网络拥塞 | 不包含拥塞控制机制 |
效率 | 相对较低,因为需要确认和重传等额外开销 | 较高,因为没有确认和重传机制的开销 |
数据单元 | 传输的数据单元称为段(Segment) | 传输的数据单元称为数据报(Datagram) |
应用场景 | 文件传输、网页浏览、电子邮件等需要可靠传输的场景 | 实时音频/视频、在线游戏等对延迟敏感的场景 |
安全性 | 更高的安全性,因为数据传输过程可控 | 较低安全性,数据传输过程不受控 |
多播和广播 | 不支持多播和广播 | 支持多播和广播,适合一对多的通信模式 |
2.TCP为什么要三次握手,两次不行吗?为什么?
- 三次握手的含义:
- 第一次握手(SYN):客户端向服务器发送一个带有SYN标志的TCP报文段,请求建立连接。这一步确认客户端的存在及其发送的能力。
- 第二次握手(SYN-ACK):服务器收到SYN报文后,发送一个带有SYN和ACK标志的TCP报文段作为响应。这一步不仅确认了服务器的存在和接收能力,同时也确认了客户端的接收能力。
- 第三次握手(ACK):客户端接收到SYN-ACK报文后,发送一个ACK标志的TCP报文段,确认收到了服务器的SYN-ACK报文。这一步最终确认了服务器的发送能力和客户端的接收能力。
- 为什么两次握手不行?
客户端发送一个连接的请求报文,但由于网络不好,这个请求没有及时到达服务端,而是在某个网络节点滞留了,直到某个时间才到达服务端,本来这已经是一个失效的报文,但服务端接收到这个请求报文后,还是会向客户端发出确认的报文,表示同意连接。假如不采用三次握手,那么只要服务端发出确认,新的建立就连接了,但其实这个请求是失效的,客户端是不会理睬服务端的确认信息,也不会向服务端发送确认请求,但服务端认为新的连接已经建立,并一直等待客户端发来的数据,这样服务端的很多资源会白白浪费掉
3.TCP为什么要四次挥手?
四次挥手是指在TCP协议中,当一端完成其数据发送任务后,双方释放连接的过程,通过发送和确认四个不同的控制报文来完成TCP连接的终止。
- 第一次挥手(主动关闭方发送FIN):
主动关闭方(通常是客户端)发送一个FIN(Finish)标志位设置为1的TCP报文段,告诉接收方(通常是服务器)它已经没有数据要发送 了,但此时它仍可以接收数据。- 第二次挥手(被动关闭方发送ACK):接收方收到FIN报文后,会发送一个ACK报文作为回应,确认序号是收到 的序列号+1,同时接收方进入CLOSE_WAIT(关闭等待)状态。此时,接收方若发送数据,继续发送,直到发送完毕。
- 第三次挥手(被动关闭方发送FIN):当接收方没有数据要发送时,它会发送自己的FIN报文,这时,接收方变为主动关闭方。这一报文也作为一个结束数据发送的信号。
- 第四次挥手(主动关闭方发送ACK) :主动关闭方收到FIN报文后,同意发送一个ACK报文作为回应,确认序号是收到的序列号+1,此时,主动关闭进入TIME_WAIT(时间等待)状态。需要经过时间等待计时器设置的时间2MSL后,才能回到CLOSED状态。2MSL的时间长度是为了确保被动关闭方能够收到ACK报文,从而正确关闭连接。
为什么要四次挥手:- 因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
4.UDP如何实现可靠传输
- 应用层确认机制:在应用层上,可以实现自定义的确认机制。发送方在发送数据后等待接收方的确认信息,如果在一定时间内未收到确认,则重新发送数据。这样可以确保数据的可靠传输。
- 超时重传:发送方可以设置一个超时计时器,如果在指定时间内未收到确认信息,则认为数据丢失,触发重传操作。
- 数据校验和重传:在UDP数据包中添加校验和字段,接收方在接收数据时计算校验和并与发送方的校验进行比较。如果不匹配,则要求发送方重新发送数据。
- 流量控制和拥塞控制:通过控制发送数据的速率和接收数据的处理速度,可以避免网络拥塞和数据丢失。这可以通过动态调整发送速率、使用滑动窗口等方法来实现。
5.OSI的七层模型都有哪些?每层的作用是什么?
- 第七层:应用层
- 功能:为应用程序提供网络服务,如文件传输、电子邮件等。它还负责处理与应用程序相关的数据格式和编码。
- 协议:HTTP、FTP、SMTP等。
- 第六层:表示层
- 功能:处理数据的表示形式,如数据加密解密和压缩,确保数据在发送和接收端的表示一致。
- 协议:JPEG、ASCII等。
- 第五层:会话层
- 功能:管理绘画的建立、维护和终止,包括同步会话和恢复会话数据
- 协议:SQL等
- 第四层:传输层
- 功能:提供端到端的数据传输服务,确保数据的可靠、顺序传输,以及错误检测和恢复。
- 协议:TCP和UDP
- 第三层:网络层
- 功能:负责数据包的路由选择,将数据从源网络传输到目的网络,处理逻辑寻址和路径选择。
- 协议:IP、ICMP等
- 第二层:数据链路层
- 功能:提供物理链路上无差错的数据传输,处理数据帧的封装和解封装,实现介质访问控制和错误检测。
- 第一层:物理层
- 功能:负责比特流的传输,定义了网络的物理接口、电气特性、机械特性、功能特性和过程特性。
OSI模型的每层都与相邻的上层和下层进行通信,每层都提供了一定程度的抽象,使得上层不必关心下层的具体实现细节。
6.forward和redirect的区别?
在Web开发中,特别是适用Servlet或类似的Web框架时,forward和redirect是两种常用的方法来控制浏览器的行为,它们用于将请求从一个资源转发到另一个资源。
forward(请求转发)
- 服务器端处理:forward是服务器端的内部操作,由Servlet容器执行,当一个Servlet调用RequestDispatcher.forward()方法时,当前请求会被转发到另一个请求,但整个过程中浏览器的地址栏不会发生变化。
- 会话数据保持:在请求转发过程中,原始请求的所有数据都会被保持并传递到转发的目标资源。这就意味着在目标资源中可以直接访问原始请求的参数和会话数据。
- 性能: forward通常比redirect更高效,因为它不需要重新发起HTTP请求,所有处理都在服务器端完成,减少网络开销。
redirect(重定向)
- 客户端处理:redirect是通过发送一个HTTP 302状态码和一个Location头来指示浏览器重新发送一个请求到新的URL。这意味着浏览器地址栏会更新为目标资源的URL。
- 会话数据:redirect不会自动携带原始请求的数据,这意味着原始请求的参数和会话数据不会自动传递到重定向的目标资源。如果需要传递数据,通常需要通过URL参数或使用会话管理机制。
- 性能:redirect需要向浏览器发起一个新的HTTP请求,因此可能比forward慢,因为涉及额外的网络往返。
总结:
- forward和redirect的主要区别在于处理的位置(服务端和客户端)、URL地址栏的变化、以及会话数据的传递。
- 选择使用forward还是redirect取决于具体的应用场景。例如,如果需要保持请求的上下文和会话数据,同时优化性能,通常会选择forward。而如果需要改变浏览器的URL地址,或者需要用户看到一个新的页面URL,或者在不同域之间跳转,redirect则更为合适。
7.HTTP响应码301和302代表的是什么有什么区别?
HTTP响应状态码301和302都是用来指示客户端(通常是浏览器)重定向到另一个资源的。但是有一些重定向的持久性和缓存行为上的区别。
- HTTP 301 Moved Permanently
- 含义:301状态码表示请求的资源已被永久移动到新的URI,未来的请求应该使用响应中的新URI。
- 持久性:301重定向是永久性的,这意味着搜索引擎和其他客户端会更新他们的链接数据库,指向新的URI。
- 缓存:301重定向可以被缓存,这意味着如果客户端之前缓存了这个响应,它会记住新的URI,以后直接使用而不需要再次重定向。
- HTTP 302 Found(临时重定向)
- 含义:302状态码表示请求的资源现在临时位于不同的URI。客户端应使用响应中的新URI来获取请求的资源,但是未来的请求应该仍然使用原来的URI
- 持久性:302重定向是临时的,搜索引擎和其他客户端不会更新它们的链接数据库,而是继续使用原始的URI
- 缓存:302重定向通常不被缓存,或者如果缓存,有效期很短,这意味着每次请求可能都需要进行重定向检查。
8.get和post请求有什么区别?
特性 | GET请求 | POST请求 |
---|---|---|
数据传输位置 | 参数包含在URL中 | 参数放在请求体中 |
数据可见性 | 数据在URL可见 | 数据在请求体中,不可见 |
安全性 | 较低,不适合传输敏感信息 | 较高,适合传输敏感信息 |
缓存 | 可以被缓存 | 通常不被缓存 |
幂等性 | 应该是幂等的,即多次请求结果相同 | 不一定是幂等的 |
URL长度限制 | URL长度有限制,通常不超过2048个字符 | 没有固定长度限制,但可能受服务器限制 |
收藏 | URL可以被收藏 | 请求体重的数据无法通过URL直接访问,不适合收藏 |
用途 | 用于获取资源,查询信息 | 用户提交数据,修改和创建资源 |
重发行为 | 可以安全地重发,如刷新页面 | 重发可能会导致数据重复提交,如表单重复提交 |
总结:GET和POST是HTTP协议中最常用的两种请求方法,它们在数据传输、安全性、缓存和幂等性上有显著区别。GET请求将参数嵌入URL中,适用于获取信息,数据可见,可以被缓存,且应该是幂等的。然而,它不适合传输敏感信息,因为数据可能被保存在历史记录或日志中。相比之下,POST请求将参数放在请求体中,更加安全,适合传输大量数据和敏感信息,但通常不会被缓存,且不一定幂等。此外,GET请求的URL可以被书签收藏,而POST请求的URL通常不被收藏,因为请求体中的数据无法直接通过URL访问。
9.如何实现跨域?
跨域:在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制。
解决办法:
- JSONP(JSON with Padding)
- 原理:利用script标签不受同源策略限制的特性,通过动态插入script标签来实现跨域请求。JSONP请求通常通过在URL中附加一个回调函数名作为参数,服务器响应时会将数据包裹在这个函数调用中返回。
- 限制:仅支持GET请求,不适合POST等其他HTTP方法
- CORS(Cross-Origin Resource Sharing)
- 服务器配置:在服务器端响应头中添加Access-Control-Allow-Origin字段,指定允许访问的源,可以是具体的域名,也可以是通配符*表示所有源。
- 预检请求:对于某些HTTP请求(如PUT、DELETE等),浏览器会先发送一个预检请求来确认跨域请求是否安全。服务器需要再预检请求的响应中包含Access-Control-Allow-Methods和Access-Control-Allow-Headers信息。
- 代理服务器
- 原理:在服务器端或本地搭建一个代理服务器,所有跨域请求先发送到代理服务器,由代理服务器转发请求到目标服务器,获取响应后再返回给前端。这样前端请求看起来像是同源请求。
- 实现:可以使用Node.js的Express框架配合相关中间件(如http-proxy-middleware),或Apache、Nginx等反向代理服务器来实现。
- 使用WebSocket
- 原理:WebSocket协议本身不受同源策略限制,可以用于实现跨域的实时通信
- 实现:客户端与服务器建立WebSocket连接,之后的数据传输不受同源策略约束。
总结:(面试回答)
- 跨域问题源于浏览器的同源策略,限制了不同源之间JavaScript的交互。为了解决这个问题,有多种方法可以实现跨域请求。其中,JSONP利用script标签的特性实现GET请求的跨域,但不支持其他HTTP方法。CORS通过在服务器端响应头中添加特定字段,允许指定源的跨域请求,对于PUT、DELETE等方法的跨域请求,CORS还支持预检请求机制,确保安全。代理服务器方案通过搭建一个中间服务器,将跨域请求转换为同源请求,适用于复杂场景。WebSocket和Server-Sent Events则提供了不受同源策略限制的实时通信渠道。在实际应用中,CORS因其灵活性和安全性,成为首选的跨域解决方案。
10.TCP流量控制,拥塞控制
- 流量控制:是TCP协议中的一项重要功能,它通过滑动窗口机制确保数据的平稳流动。发送方根据接收方的反馈(即ACK确认应答)和窗口大小来调整数据发送的速率,以防止数据积压和缓冲区溢出。
- 拥塞控制:是TCP协议中的另一项核心功能,它通过慢启动、拥塞避免、快速重传和快速恢复等机制来监测和调整网络中的数据流量,以防止网络拥塞。慢启动算法帮助网络逐步适应数据流量,而拥塞避免则确保在达到一定阈值后,流量的增长更加平缓。快速重传和快速恢复机制则允许在检测到网络拥塞时快速响应,通过减少发送窗口大小和智能重传来恢复正常的流量水平。
11.ip协议,icmp协议,arp协议的作用
- IP协议是互联网的核心,它负责数据包的封装、寻址和路由,使数据能够跨越不同的网络到达目的地
- ICMP协议则作为IP协议的补充,用于错误报告和网络监控,帮助我们诊断网络问题并进行网络管理。
- ARP协议(Address Resolution Protocol 地址解析协议)则在局域网环境中起着关键作用,它将IP地址转换为MAC地址,确保数据包能够在物理网络中正确传输。
12.http的不同版本和https的理解
- HTTP的发展经历了从HTTP/1.0到HTTP/2等多个版本,每个版本都在不断提高网络通信的效率和性能。HTTP/1.1引入了持久连接和管道化请求,大大提升了多请求的处理效率。而HTTP/2通过二进制分帧、多路复用和头部压缩等技术,进一步提高了资源加载的速度,特别是在移动网络和高延迟网络环境下表现更佳。
- HTTPS则是HTTP协议的安全版本,它通过SSL/TLS协议为HTTP通信提供了加密保护。HTTPS不仅可以保护数据免遭窃听和篡改,还可以通过数字证书验证服务器的身份,建立用户对网站的信任。HTTPS已经成为现代Web应用的标配,尤其是在涉及敏感信息传输的场景下,如在线支付、个人信息提交等。