Get和Post
它们携带参数的方式不一样,get请求是通过url的方式携带参数的,而post请求时通过请求体的方式来请求的。
get的参数是放到url上的,所有参数会有数据大小的限制,而post请求参数的大小一般是没有限制的。
post比get请求安全。
get和post都是http请求,get发的是一次http请求,而post会先发送请求头再发一次请求体
get一般是用来获取服务器的信息的,而post是来更改服务器的信息的。
在浏览器中输入url到浏览器展示页面发生了什么
总体来讲:首先是DNS的解析,得到IP地址,然后建立TCP连接,发送HTTP请求,服务器接收到请求,处理返回结果,浏览器端根据返回的数据进行渲染。
DNS解析过程:首先会去浏览器的DNS缓存里找,搜索操作系统的DNS缓存,读取本地的host文件,查询本地DNS服务器的缓存,如果再本地的DNS服务器查询有就返回结果给客户机,没有就根据设置发起递归查询或迭代查询。
递归查询:如果主机所访问的本地DNS服务器不存在该域名的IP,那么本地域名服务器会以DNS客户的身份向跟DNS发出询问。
迭代查询:根DNS收到本地DNS发出的请求时,要么给出IP,要么就告诉本地DNS下一步向哪个服务器查找。根DNS通常把自己直到的顶级DNS的IP地址告诉本地的DNS,让本地的DNS再向顶级的DNS查询。
DNS的缓存:为了提高效率,减轻服务器的负荷,减少因特网上的DNS查询报文,不仅本地DNS需要高级缓存,很多主机启动的时候,会去本地DNS下载域名和地址的数据库,维护自己经常使用的域名的高速缓存,并且只在缓存中找不到域名的IP地址时去本地DNS中找。
建立TCP连接。
http请求封装到TCP中,向服务器发送,服务器根据接收到的请求来响应相应的数据。
浏览器根据返回的数据来构建DOM树,根据外部,内部,内联的CSS构建CSSOM,再将DOM和CSSOM树构建出渲染树渲染页面。
TCP的三次握手,四次挥手
三次握手:
客户端向服务端发送请求报文,这个报文中的SYN如置为1,生成的序列号seq也包含其中。
服务端收到客户端的请求,如果同意连接,就像客户端发送确认报文,报文中包含SYN和ACK都置为1,自己选择一个seq,ack=seq+1,发送给客户端。
客户端收到服务的的确认,还要向服务端发出确认,报文段的ACK置为1,seq = x + 1,ack = 第二次握手的seq+1。
为什么两次握手不行?
三次握手的两个重要的功能是双方做好发送数据的准备,双方对初始序列号进行协商。
第一次握手证明:服务端知道客户端的发送能力,服务端的接受能力正常。
第二次握手证明:客户端知道自己的发送能力,接收能力,服务端的接受,发送能力正常。但是服务端不知道客户端的接受能力是否正常。
第三次握手证明:服务端知道客户端的发收,自己的发收正常。
所以,三次握手就是为了预防:客户端发送一个请求,在网络节点长时间滞留,以至于连接释放后才到达服务端,服务端以为这是客户端的新的连接请求,向客户端确认,同意连接。服务端的确认后新的连接建立,并等待客户端发数据,那么服务端就会白白浪费资源。如果采取三次握手,那么服务端就不会与客户端进行连接。
四次挥手:
客户端向服务端发送连接释放报文,并停止发送数据,主动关闭TCP连接,客户端把FIN置为1,seq=前面传送过的数据的最后一个字节的序列号加1,客户端进入FIN-Wait-1终止等待1状态,等待服务端确认。
服务端收到后发出确认,确认号ack = seq + 1,服务端的序列号为前面传送过的数据的最后一个字节的序列号加1。然后服务端进入关闭等待状态。服务端可能还有数据要向客户端发送,
如果服务端已经没有向客户端发送数据了,服务端包FIN=1,确认号ack = seq + 1;然后服务端进入最终的确认状态。
客户端收到服务端发出的确认释放报文后,发出确认,把ACK = 1,ack = seq + 1;seq = 前面传送过的数据的最后一个字节的序列号加1。此时TCP并未断开,经过2MSL(最长报文段寿命),客户端才能进入closed状态。
为什么要等2MSL:
为了确保客户端最后的确认报文ACK能够到达服务端,因为这个报文可能会丢失,服务端收不到确认,就会重发FIN和ACK报文,而客户端就能在2MSL时间内收到确认,客户端在确认,启动2MSL的等待时间,如果立即断开,那么如果客户端中途发送的数据报文传输失败,服务端就无法重传FIN+ACK,服务端就无法进入CLOSED状态。
防止已经失效的连接请求报文段出现在本连接中,经过2MSL本链接持续时间内所产生的所有报文都会消失。这样下一个连接就不会出现旧的请求报文。
为什么第二次跟第三次不能合并, 第二次和第三次之间的等待是什么?
当服务器执行第二次挥手之后, 此时证明客户端不会再向服务端请求任何数据, 但是服务端可能还正在给客户端发送数据(可能是客户端上一次请求的资源还没有发送完毕),所以此时服务端会等待把之前未传输完的数据传输完毕之后再发送关闭请求。
TCP 和 UDP 的区别
TCP是面向连接的,而UDP是无连接的,即发送数据前不需要建立连接。
TCP是提供可靠的服务的,TCP传输的数据是无差错,无重复,不丢失的,且按序到达。而UCP就是尽最大的努力交付,不保证可靠的交付。
UDP有很好的实时性,比TCP的工作效率高,一般用于视频直播,等广播通信,而TCP一般用于传输文件,邮件传输。
每一条TCP都是点对点的,而UDP支持一对一,一对多,多对一,多对多。
TCP对系统资源较多,而UDP较少。
HTTP和HTTPS
HTTPS比HTTP更加安全,HTTP采取的是明文传输,而HTTPS是密文传输的。
HTTPS是通过对称加密和非对称加密,而HTTP只采用对称加密。
HTTP的端口是80,而HTTPS是443。
HTTPS 需要CA申请证书需要缴费。
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议,需要消耗更多的CPU和内存资源。
谈下 HTTP 1.0 和 1.1、2.0 的主要变化?
HTTP 1.0和HTTP 1.1有以下区别:
连接方面:http1.0默认使用的是非持久连接,而http1.1默认是持久连接。http1.1通过使用持久连接来使多个http请求复用同一个tcp连接,从而来避免使用非持久连接时每次建立连接的时延。
资源请求方面:在http1.0中,存在一些浪费带宽的现象,例如客户端就想要对象中的一部分,但是服务器却把整个对象发了过来,并且不支持断点续传功能,http1.0则在请求头引入range头域,它允许只请求资源的某部分,返回码206。
缓存方面:在http1.0中阻延使用header里的 If-Modified-Since、Expires 来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
http1.1相对于1.0新增了很多请求方法:PUT,HTAD,OPTIONS等
http1.1中新增host字段,用来指定服务器的域名。http1.0认为一台服务器绑定一个IP,因此请求消息中的URL并没有传递主机名,但是随着虚拟主机的发展,一台物理机上可以存在多个虚拟主机,并且他们共享一个IP有了host,就可以将请求发往到一台服务器上的不同网站。
HTTP1.1和HTTP2.0的区别
二进制协议:HTTP2.0是一个二进制协议,HTTP1.1数据体可以是文本,也可以是二进制,HTTP2.0则是一个彻底的二进制协议。
多路复用:HTTP2.0实现了多路复用复用TCP连接,但是在一个连接里,客户端和服务端都可以同时发送多个请求或回应,而且不用按照顺序一一发送避免队头阻塞。
数据流: HTTP/2 使用了数据流的概念,因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流 ID ,用来区分它属于哪个数据流。
头信息压缩: HTTP/2 实现了头信息压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。
服务器推送: HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。这里需要注意的是 http2 下服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。
什么是对称加密和非对称加密?
常见的HTTP请求头和响应头
1. HTTP Request Header
Accept:浏览器能够处理的内容类型。
Accept-Charset:浏览器能够显示的字符集
Accept-Encoding:浏览器能够处理的压缩编码
Accept-Language:浏览器当前设置的语言
Connection:浏览器与服务器之间连接的类型
Cookie:当前页面设置的任何Cookie
Host:发出请求的页面所在域
Referer:发出请求的页面URL
User-Agent:浏览器的用户代理字符串
2.HTTP Responses Header
Date:表示消息发送的时间,时间的描述格式由rfc822定义
server:服务器名称
Connection:浏览器与服务器之间连接的类型
Cache-Control:控制HTTP缓存
content-type:表示后面的文档属于什么MIME类型
根域名服务器
根服务器主要用来管理互联网的主目录,最早是IPV4,全球只有13台(这13台IPv4根域名服务器名字分别为“A”至“M”),1个为主根服务器在美国,由美国互联网机构Network Solutions运作。其余12个均为辅根服务器,其中9个在美国,2个在欧洲(位于英国和瑞典),1个在亚洲(位于日本)
顶级域名
顶级域名也叫一级域名,域名是由两个或两个以上的词构成,中间由点号分隔开,最右边的那个词就叫做顶级域名,比如baidu.com 。
顶级域名又分为两类:一是国家和地区顶级域名。例如中国是cn,美国是us等;二是国际顶级域名,例如表示工商企业的.com,表示非盈利组织的.org,表示网络商的.net等。
二级域名英语为Second-level domain,英文缩写SLD,是互联网 DNS 等级之中,处于顶级域名之下的域。二级域名是域名的倒数第二个部份,二级域名就是主域名分出来的域名。比如www.baidu.com 。
二级域名比较适用于大型网站。因为使用二级域名可以减短网址途径的长度,也许会对收录起到很好的效果。全站交织衔接,可以使搜索引擎能检索到,还主动生成网站地图。
本地DNS
本地DNS一般是指你电脑上网时IPv4或者IPv6设置中填写的那个DNS。这个有可能是手工指定的或者是DHCP自动分配的。 如果你的电脑是直连运营商网络,一般默认设置情况下DNS为DHCP分配到的运营商的服务器地址。如果你的电脑和运营商之间还加了无线或者有线路由,那极有可能路由器本身还内置了一个DNS转发器,这玩意的作用是将发往他所有的DNS请求转发到上层DNS。此时由于路由器本身也接管了下挂电脑的DHCP服务,所以它分配给下面电脑的DNS地址就是它自身,所以你能看到电脑的DNS分配到的可能是192.168.1.1。实际上就是路由器自身,而路由器的DNS转发器将请求转发到上层ISP的DNS。所以这里说DNS是局域网或者是运营商的都可以(因为最终都是转发到运营商,小细节不用纠结)。
DNS解析域名
现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。
现在的我计算机要向这台ISPDNS发起请求查询www.baidu.com这个域名了,(经网友提醒:这里其实准确来说不是ISPDNS,而应该是用户自己电脑网络设置里的DNS,并不一定是ISPDNS。比如也有可能你手工设置了8.8.8.8)
ISPDNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答。
如果缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中),
然后像其中一台发起请求。
根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。
然后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。
(目前百度有4台baidu.com的顶级域名服务器)。
ISPDNS不厌其烦的再次向baidu.com这个域的权威服务器发起请求,baidu.com收到之后,查了下有www的这台主机,就把这个IP返回给你了,
然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。
HTTP请求报文是什么样的
请求报文有4部分组成:请求行,请求头部,空行,请求体。
请求行包括:请求方法字段,URL字段,HTTP协议版本字段。请求头部:关键字/值对组成,每行一对
HTTP响应报文是什么样的
组成:响应行,响应头,空行,响应体
响应行:由网络协议版本,状态码和状态码的原因短语组成,例如:HTTP/1.1 200 OK
响应头:响应部首组成
响应体:服务器响应的数据
HTTP协议的优缺点
优点:
支持客户端服务器模式。
简单快速
无连接,限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后就断开连接,采用这种方式可以节省传输时间。
无状态:状态是指通信过程的上下文信息。
灵活:HTTP允许传输任意类型的数据对象。
缺点:
无状态:HTTP是一个无状态的协议,HTTP服务器不会保存关于客户的任何信息。
明文传输。
不安全。
URL有哪些组成部分
协议部分:“http:”。
域名部分:“www.yanchenhao.top”,可以使用IP地址作为域名使用
端口部分:端口不是一个URL必要的部分,如果省略端口部分,HTTP协议默认使用80,HTTPS默认使用443。
虚拟目录部分:从域名后的第一个’/‘开始到最后一个'/',虚拟目录不是一个URL必须的部分。
文件名部分:从域名后最后一个'/'开始到'?'为止。
锚部分:从'#'开始,不是必要的。
参数部分:从'?'到'#'
什么是HTTPS协议
HTTPS是一种通过计算机网络进行安全通信的传输协议,HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包,HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
TLS/SSL的工作原理
TLS/SSL的功能实现主要依赖三类基本的算法:散列函数hash,对称加密,非对称加密。
基于散列函数验证信息的完整性;对称加密算法采用协商的密钥对数据加密;非对称加密实现身份认证和密钥协商。
HTTPS的通信过程
数字证书是什么
TSL/SSL方法不一定安全,因为没有办法确定得到的公钥就一定是安全的公钥,可能存在一个中间人,截取了对方发给我们的公钥,然后将自己的公钥发送给我,当我们使用他的公钥加密后发送信息,就可以被他用自己的私钥解密,然后他会伪装成我们以同样的方法向对方发送信息,这样我们的信息就被窃取了。
首先使用一种Hash算法来对公钥和其他信息进行加密,生成信息摘要,然后让有公信力的认证中心(CA)用他的私钥对信息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。
当接收方收到数字证书,先根据原始信息使用同样的Hash算法生成一个摘要,然后使用公证处的公钥对数字证书中的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,就能发现得到的信息是否被更改。
TCP报文格式
TCP报文的首部格式
确认号(ack小写):确认号是指期望收到对方下一个报文段的第一个数据字节的序号。弱确认好位n,则证明到需要N-1为止所有的数据都已经正确收到。
接收方收到了1,2,3个字节组成的数据包,然后接收方就会发送一个确认报文给发送方,其中确认报文的确认号就应该是4,因为1,2,3这三个字节的组成的数据包已经收到了。
序号是指在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
ACK:置为1时表示确认后合法,为0时表示数据段不包含确认信息,确认后被忽略。
SYN:置为1时用来发起一个连接
FIN:置为1时表示发送端已经完成发生任务,用来释放连接,表明发送方已经没有数据发送了。
缓存
缓存分为强缓存和协商缓存,强缓存不过服务器,协商缓存需要过服务器,协商缓存返回的状态码是304,强缓存的优先级高于协商缓存,当执行强缓存时,如果缓存命中,则直接使用缓存数据库中的数据,不再进行缓存协商。
协商缓存需要进行对比判断是否可以使用缓存,浏览器第一次请求数据时,服务器会将缓存标识与数据一起响应给客户端,客户端将他们备份至缓存中,再次请求时,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断,若未失效,返回304,浏览器拿到此状态码就可以直接使用缓存数据。
缓存场景:
对于某些不需要缓存的资源,可以使用Cache-control:no-store ,表示该资源不需要缓存。
对于频繁变动的资源,可以使用Cache-Control:no-cache并配合ETag使用,表示该资源已经被缓存
对于代码文件来说,通常使用Cache-Control:max-age=31536000并配合策略缓存使用,然后对文件进行指纹处理,一旦文件名变动就会立刻下载新的文件。