URL(统一资源定位符)组成:传输协议、服务器的域名、端口、虚拟目录、文件名、锚点、参数
浏览器对输入的URL首先会进行识别,抽取出域名字段,例如: baidu.com,然后需要对域名进行解析,即DNS解析。
如果输入ip地址表示直接从主机上调用内容,输入域名,是通过域名解析服务器指向对应主机的IP地址,再从主机上调用网址的内容,DNS解析时,主要会经过一下内容:
TCP三次握手与四次挥手
HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。常用的请求方法有: GET、POST、PUT、DELETE、OPTIONS、HEAD
301:永久重定向
302:临时重定向
400:语法错误
401:表示需要认证
403:表示请求被拒绝
404:没发现资源
500:服务器内部出现故障
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。
POST 比GET安全,因为 url GET是直接暴露的。POST数据不会显示在URL中,是放在Request body中。
GET只接受ASCII字符,而POST没有限制。
GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。
POST的安全性要比GET的安全性高,安全:可查看数据,但是不可修改,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码。但是总的来说,不管是put还是get都是不算安全的,因为HTTP是明文传输。
GET是一个包将Header 和 body 同时发送过去,POST 是先发送head ,再发送body,分两个包发送。
就像是GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼老铁,我等下要送一批货来,你们准备接收一下哈
,然后再回头把货送过去。
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。
Cookie ⽤来保存⽤户信息,是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
Session是服务器端技术, session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
cookie只能存储ASCII码字符串,而Session可以存储任何类型的数据
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗, 考虑到安全应当使用session。
当客户端禁用cookie时无法使用cookie,此时需要运用Session以及URL地址的重写。
HTTP1.0默认的是短连接,该连接就是客户端和服务器没进行一次HTTP操作,就会建立一次连接,任务结束之后,就会断开连接。
HTTP1.1默认的是长连接,使用长连接时,会在HTTP的响应头加入:
Connection:keep-alive
在长链接下:建立一次TCP连接后进行多次请求和响应的交互。
HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误
HTTP2.0时代将 HTTP/1 的文本格式改成二进制格式传输数据,极大提高了 HTTP 传输效率,而且二进制数据使用位运算能高效解析。
HTTP/2 没使用常见的 gzip 压缩方式来压缩头部,而是开发了 HPACK算法,HPACK 算法主要包含三个组成部分:
HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应),才能处理下一个事务,也就是说在发出请求等待响应的过程中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞的问题。
而 HTTP/2通过 Stream 这个设计,多个 Stream 复用一条 TCP 连接,达到并发的效果,解决了 HTTP/1.1 队头阻塞的问题,提高了 HTTP 传输的吞吐量。
可以在用户请求 html 时,可以主动的推送 css 资源,一次请求,多次发送。
浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。这时需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous),JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。
浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。
TCP是可靠的,面向连接的传输方式,TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资。
缺点:
效率低,占用资源多,在传递数据的时候,需要建立连接,会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间。因为每个连接都会占用系统的CPU、内存等硬件资源。因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
UDP是不可靠的,无连接的传输方式,但是传输方式快,效率高,因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
应用:
参考资料:浅谈HTTP中Get与Post的区别 - hyddd - 博客园 (cnblogs.com)
参考资料:https://www.nowcoder.com/discuss/807702?type=all&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_all_nctrack.