IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 面试专题之http -> 正文阅读

[网络协议]面试专题之http

既然是http的专题,那么首先要知道什么是http?

http是超文本传输协议(hypertext transfer prototal)!是客户端和服务器端互相通信时必须遵守的协议。HTTP协议是应用层协议,底层是基于TCP协议。默认是用80端口
tips:TCP/IP协议(协议群的统称),计算机网络分层(五层) 应用层http - 传输层tcp/udp - 网络层IP - 数据链路层 - 物理层。可通过以下链接了解详细信息(了解即可):
https://blog.csdn.net/yi_master/article/details/79358920
https://developer.51cto.com/art/201906/597961.htm

http版本发展历史

https://blog.csdn.net/liujianfei526/article/details/53289350

  • http0.9
    1991年发布。只有一个GET命令。
  • http1.0
    1996年5月发布。首先任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还可以传输图片、视频和二进制文件(灵活)。其次,除了GET命令外还新增了POST和HEAD命令,丰富了浏览器和服务器的互动手段。再次,新增了Header和服务端处理请求的状态码、多字符集支持、多部分发送、权限、缓存、内容编码等。
    1.0的主要缺点每个tcp连接只能发送一个请求,每次发送请求都必须重新建立tcp连接。而建立tcp连接的成本很高,需要客户端和服务器端三次握手,而且开始时发送速率慢。
  • http1.1
    1997年1月发布。1.1版本进一步完善了http协议,一直用到了现在。与1.0对比,最大的变化是引入了持久连接,即复用tcp连接(长连接)。不用声明:Connection: keep-alive。客户端和服务器端发现对方一段时间没有活动,就可以主动关闭连接,Connection: close。目前对于同一个域名,大多数浏览器允许同时建立6个持久连接。第二个变化是引入了管道机制,即在同一个tcp连接里,客户端可以同时发送多个请求。同时还新增了很多方法,如PUT、PATCH、DELETE、HEAD、OPTIONS等。另外客户端请求头信息里新增了host字段,用来指定服务器端的域名
    缺点:虽然1.1版本允许复用tcp连接,但同一个tcp连接里,所有的数据通信都是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。那就极有可能出现“队头堵塞”。为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致很多网页优化技巧:比如合并js和css,将图片嵌入css代码,域名分片等。
    tips: 理解持久连接和管线化
    https://blog.csdn.net/weixin_44486539/article/details/102988300
    持久连接即复用tcp连接,此时 请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3
    管线化是建立在持久连接之上,此时 请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
    所以说1.1版本缺点是即使复用了tcp连接,然而所有的数据通信都是按次数进行,可能会出现队头堵塞的情况。
  • http2
    2015年发布。二进制协议,复用tcp连接,在一个连接里,客户端和服务器端可以同时发送多个请求或回应,而且不用按照顺序一一回应,这样就避免了“队头堵塞”。这样双向的、实时的通信,就叫做多工。数据流。头信息压缩。服务器推送。
  • http3
    https://blog.csdn.net/qq_34827674/article/details/115188998
    即将问世的http3。将传输层中的tcp替换成了udp协议,并在udp协议上开发了QUIC协议,来保证数据的可靠传输。QUIC协议特点:无队头阻塞,建立连接速度快(无需三次握手等),支持连接迁移(即使网络发生变化,导致IP地址改变,也无需断开连接后重连)。

http协议的特点

  • 支持客户/服务器端模式
  • 简单快速
  • 灵活:http允许传输任意类型的数据对象。由content-type标记。
  • 无状态:http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,对于事务处理没有记忆能力,客户端和服务器端永远处于一种“无知”的状态,就是每次请求和响应都是独立的,没有任何联系。所以引入了cookie(记录在客户端)和session(记录在服务器端)。
  • 无连接特点是针对1.0版本的http协议,指的是每次服务器端返回响应报文后自动断开连接,1.1版本的http协议是保持连接的,connection默认为keep-alive。

http和https的区别

  • http是明文传输,而https是http+ssl(对数据加密),比http安全。ssl协议位于传输层协议与应用层协议之间,为数据通讯提供安全支持。
  • https需要申请CA证书,付费;
  • http和https使用的是完全不同的连接方式,用的端口号也不一样,http端口号80,https端口号443;
  • http协议是无状态的,而https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http安全。

http状态码

1XX 服务器端已收到请求
2XX 成功 200ok
3XX 重定向/缓存 301永久重定向 302临时重定向 304资源未更改
4XX 客户端错误 403 请求页面禁止访问 404 not found资源不存在 比如输入错误的url
5XX 服务器端错误 500 服务器代码问题

请求方法

GET POST(提交表单) HEAD OPTIONS DELETE PUT(上传文件)
最常用的是GET和POST,restful接口一般会使用GET POST PUT DELETE

GET和POST的区别,特点

https://www.cnblogs.com/logsharing/p/8448446.html

  • GET参数通过URL传递,POST放在Request body中。
  • GET参数只接受ASCII字符,而POST没有限制。
  • GET请求会被浏览器主动cache,但POST不会。
  • GET请求参数在URL中传送的参数是有长度限制的,但POST没有。
  • GET请求只产生一个TCP数据包,而POST产生两个TCP数据包。
    对于get请求,请求头和数据一并发出去;而post请求,先发送请求头,服务器响应100后,客户端再发送数据;

TCP协议和UDP协议(传输层协议)

https://blog.csdn.net/petterp/article/details/102779131
传输层为两台主机上的应用程序提供端到端的通信。传输层有俩个传输协议:TCP(传出控制协议)和UDP(用户数据报协议)。

TCP和UDP协议的区别

  • 其中TCP是一个可靠的面向连接的协议,而UDP是无连接的协议。
  • TCP提供可靠的服务。也就是说,通过tcp连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付。
  • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通道。
  • 每一条TCP连接都是点到点的,UDP支持N对N;
  • TCP对系统资源要求较多,而UDP对系统资源要求较少。

TCP的三次握手和四次挥手

http://blog.sina.com.cn/s/blog_160965eee0102yleh.html

报文主要段的意思

序号(seq):表示发送的数据字节流,确保TCP传输有序,对每个字节编号

确认序号(ack):发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。

ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

FIN:结束标志,用于释放连接,为1表示关闭本方数据流
    
由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式(http2才是全双工模式,0.9,1.0都是短连接,1.1版本是半双工模式)
tips:什么双工模式——客户端和服务器端都能主动发送数据。

为什么要三次握手和四次挥手?

三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里。

四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送

为什么要等待2MSL的时间

MSL为最长报文段寿命,它是任何报文段被丢弃前在网络内的最长时间。

理解一:如果第四次挥手报文没有到达服务器端,那么服务器会在超时之后重新发送FIN,如果此时的客户端已经是closed状态的话,重发的FIN就找不到对应的连接了。所以第四次挥手的时候客户端不能马上进入closed状态,而要保持time_wait状态。

理解二:客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。

ajax请求和http请求的关系

ajax请求属于http请求。http包括两种请求,一种是同步(普通请求),一种是异步(ajax请求也可以设置为同步,设置async为false,默认为true,但绝大部分情况不需要使用同步)。

如何区分是普通请求还是ajax请求呢?
通过请求头header中的x-requested-with字段是否为XMLHttpRequest,普通请求为null。虽然我们能设置ajax请求中的header字段,但是x-requested-with字段不会被完全重置,对于XMLHttpRequest对象发出的请求都被会被浏览器设置一遍这个值。
tips: 我们在浏览器中设置referer(源)字段也是无效的。

本质区别就是ajax请求通过XMLHttpRequest对象请求数据,而普通请求通过httpRequest对象发送数据请求服务器。

在这里插入图片描述

在这里插入图片描述
ajax请求一般是指上图中的XHR部分。

用xhr写一个get或post请求?理解xhr。

XHR(XMLHttpRequest)对象用于与服务器交互。通过XHR对象可以在不刷新页面的情况下请求特定url,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。

  • 构造函数 XMLHttpRequest()
    该构造函数用于初始化一个 XMLHttpRequest 实例对象。在调用下列任何其他方法之前,必须先调用该构造函数,或通过其他方式,得到一个实例对象。
  • readyState (只读属性)代表请求的状态码
  • onreadystatechange 当readyState发生变化时,触发该事件
  • status (只读属性)返回数字,代表请求的响应状态码
  • statusText (只读属性)返回DOMString, 代表请求的响应状态
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
	if (xhr.readystate === 4 && xhr.status === 200) {
		console.log('success' + xhr.statusText);
	}
}
xhr.open('GET', url, true);
xhr.send();

前端缓存 - 详谈http缓存

缓存的好处:缓解服务器压力,提升性能(获取资源耗时更短了)。

前端缓存分为两种,一种是http缓存,一种是存储,如localstorage、sessionstorage、indexDB等。

只有GET方法获取到的数据能被缓存,且一般只缓存js、css、图片等静态资源。

http缓存都是从第二次请求开始的。第一次请求资源的时候,服务器返回资源,并在响应头中回传资源的缓存参数,如果是强缓存,则将资源存储在内存或磁盘中(标记过期时间),若是协商缓存则带Etag或Last-modified字段。

http缓存又分为强缓存和协商缓存。
和强缓存相关的header头有cache-control、expires、Pragma(向后兼容http1.0)。
和协商缓存相关的header头有Etag/If-none-match,last-modified/If-modified-since。

在这里插入图片描述

若命中强缓存,直接从内存或硬盘中读取数据而不向服务器发送http请求。判断是否为强缓存cache-control: max-age=xxx,单位秒,或者expires,判断资源是否过期。
若未命中强缓存,则发送http请求头带If-none-match或者if-modified-since,判断协商缓存Etag/If-none-match,last-modified/If-modified-since,若命中协商缓存,则http状态码为304,直接从缓存中读取数据,并重置缓存时间,若未命中协商缓存,则请求成功时状态码为200,读取服务器数据。

以下情况即命中了强缓存。
在这里插入图片描述

http1.1定义的cache-control头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过它的值来定义缓存策略。
cache-control: no-store // 没有缓存。客户端必须从服务器拿数据
cache-control: no-cache // 强缓存失效,判断协商缓存情况
cache-control: private/public // 客户端私有缓存/客户端和代理服务器共有缓存
cache-control: max-age=xxx // 资源有效期

注意:
在chrome浏览器中返回的200状态会有两种情况:
1、from memory cache
(从内存中获取/一般缓存更新频率较高的js、图片、字体等资源)

2、from disk cache
(从磁盘中获取/一般缓存更新频率较低的js、css等资源)

缓存和用户的行为

http缓存还和用户行为有关。
如果是刷新,那么强缓存失效,如果是强制刷新,那么强缓存和协商缓存都失效。
在这里插入图片描述

https是如何加密的?

  • 对称加密
  • 非对称加密
  • 对称加密+非对称加密
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:29:09  更:2021-08-14 14:32:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:43:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码