又追问:拥塞控制具体的算法怎么样的?
TCP 的拥塞控制采用了四种算法,即慢开始 、 拥塞避免 、快重传、快恢复:
- 慢开始 : 慢开始算法的思路是当主机开始发送数据时由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。>cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。因为如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞。
- 拥塞避免 : 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1。
- 快重传与快恢复: 在 TCP/IP 中,快速传和块恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能**快速恢
复丢失的数据包。\*\*没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或
复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
===============================================================================
UDP:
1.UDP是无连接的, 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。
2.UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
3.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。
TCP:
-
TCP是面向连接的运输层协议。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
-
每一条TCP连接只能有两个端点,每一条TCP只能是点对点的。
-
TCP 提供可靠交付的服务,通过TCP连接传送的数据,无差错、不丢失、不重复,并且按时到达。
-
TCP提供全双工通信。TCP允许通信双方得到应用进程在任何时候都能发送数据。
-
面向字节流。含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP中的“流”是指流入到进程或者从进程流出的字节序列。
追问:既然你说TCP提供的可靠的服务,那么TCP 协议如何保证可靠传输?
主要有校验和、序列号、超时重传、流量控制及拥塞避免等几种方法:
- 1.应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 2.校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- 3.TCP 的接收端会丢弃重复的数据。
- 4.流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 利用滑动窗口实现流量控制。
- 5.拥塞控制: 当网络拥塞时,减少数据的发送。
- 6.ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 7.超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
==================================================================================
GET- 从指定的服务器中获取数据
POST - 提交数据给指定的服务器处理
GET方法:
使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:
/test/demo_form.jsp?name1=value1&name2=value2
区别(post全部都相反):
-
GET请求能够被缓存
-
GET请求会保存在浏览器的浏览记录中
-
GET请求的URL能够保存为浏览器书签
-
GET请求有长度限制
==========================================================================================
总体来说分为以下几个过程:
-
DNS 解析:浏览器查询 DNS,获取域名对应的 IP 地址
-
TCP 连接:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手
-
发送 HTTP 请求:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求
-
服务器处理请求并返回 HTTP 报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处
理,并将处理结果及相应的视图返回给浏览器
-
浏览器解析渲染页面
-
连接结束
追问:整个过程会使用哪些协议?
- 1.首先浏览器查找域名的IP地址的过程会使用DNS协议
- 2.与服务器建立TCP连接使用到了TCP协议
- 3.建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议
- 4.IP数据包在路由器之间,路由选择使用OSPF协议
5.路由器在与服务器通信时,需要将ip地址转换为**MAC地址**,需要使用**ARP协议**
6.在TCP建立完成后,使用**HTTP协议**访问网页
6.HTTP 1.0 和 HTTP 1.1 的主要区别是什么?
==============================================================================================
-
长连接 : 在 HTTP/1.0 中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP 1.1 起,默认使用长连接,默认开启 Connection: keep-alive。
-
错误状态响应码:在 HTTP1.1 中新增了 24 个错误状态响应码。
-
缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since,If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
-
带宽优化及网络连接的使用:在HTTP1.0中会存在浪费带宽的现象,主要是因为不支持断点续传功能,客户端只是需要某个对象的一部分,服务端却将整个对象都传了过来。在HTTP1.1中请求头引入了range头域,它支持只请求资源的某个部分,返回的状态码为206。
======================================================================================
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起,默认使用长连接。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。实现长连接需要客户端和服务端都支持长连接。
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
=====================================================================================
有下面几个区别:
-
开销:HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
-
资源消耗:HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议,需要消耗更多的CPU和内存资源
-
端口不同:HTTP和 HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
-
安全性:HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。而HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输
================================================================================
优点:
HTTP最凸出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。
-
简单:HTTP基本的报文格式就是header + body ,头部信息也是key-value简单文本的形式,易于理解,降低了学习和使用的门槛。
-
灵活和易于扩展:
-
HTTP协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。
-
同时HTTP由于是工作在应用层,则它下层可以随意变化。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。
这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。
大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:
希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:
[外链图片转存中…(img-79MXKk4f-1711810908992)]
[外链图片转存中…(img-CVEXQ6rr-1711810908992)]
[外链图片转存中…(img-9226UKKD-1711810908992)]
希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!