前端知识体系(二)http请求

https://blog.csdn.net/Lammonpeter/article/details/81358387html

1、DNS解析浏览器

首先DNS域名系统的做用是将输入的url域名解析成ip地址以方便对于ip对应的电脑的查找。好比:咱们在浏览器地址栏输入:www.baidu.com接下来就是解析过程:缓存

一、首先在浏览器的缓存中查找有没有域名对应的ip地址信息。安全

用户经过浏览器浏览过某网站以后,浏览器就会自动缓存该网站域名对应的IP地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址,由于缓存不只是有大小限制,并且还有时间限制(域名被缓存的时间经过TTL属性来设置),因此存在域名对应的IP找不到的状况。当浏览器从缓存中找到了该网站域名对应的IP地址,那么整个DNS解析过程结束,若是没有找到,将进行下一步骤。对于IP的缓存时间问题,不宜设置太长的缓存时间,时间太长,若是域名对应的IP发生变化,那么用户将在一段时间内没法正常访问到网站,若是过短,那么又形成频繁解析域名。
二、接着在本地系统查找是否缓存过该域名对应的ip地址。服务器

若是第一个步骤没有完成对域名的解析过程,那么浏览器会去系统缓存中查找系统是否缓存过这个域名对应的IP地址,也能够理解为系统本身也具有域名解析的基本能力。在Windows系统中,能够经过设置hosts文件来将域名手动绑定到某IP上,hosts文件位置在C:\Windows\System32\drivers\etc\hosts。网络

三、向本地域名系统发起域名解析请求tcp

若是上面第二部仍旧没有查找到,那么就要向本地的域名解析系统发送域名解析请求了,本地域名系统LDNS通常都是本地区的域名服务器,好比你链接的校园网,那么域名解析系统就在你的校园机房里,若是你链接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。对于本地DNS服务器地址,Windows系统使用命令ipconfig就能够查看,在Linux和Mac系统下,直接使用命令cat /etc/resolv.conf来查看LDNS服务地址。LDNS通常都缓存了大部分的域名解析的结果,固然缓存时间也受域名失效时间控制,大部分的解析工做到这里就差很少已经结束了,LDNS负责了大部分的解析工做。网站

四、向根域名服务器发起解析请求ui

本地DNS域名解析器尚未完成解析的话,那么本地域名解析服务器将向根域名服务器发起解析请求。而后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。加密

五、重复查询

本地服务器再向上一步返回的域名服务器发送请求,而后接受请求的服务器查询本身的缓存,若是没有该纪录,则返回相关的下级的域名服务器的地址。重复这一步,直到找到正确的纪录。

六、缓存结果

本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

接下来咱们用nslookup这个命令看,能够看到有非权威应答,意思就是来自于缓存。若是对域名解析想要深刻了解能够查看大神博客:https://blog.csdn.net/Lammonpeter/article/details/81358387

2、TCP链接

将ip地址解析出来以后,咱们就能够进行tcp链接,这里是著名的三次握手和四次挥手。

参考:https://blog.csdn.net/qq_34386891/article/details/80515912

三次握手:

第一次握手:

Client将SYN置为1,seq=随机值j,将该数据包发送给Server,进入SYN_SENT状态,等待Server确认。

第二次握手:

Server收到数据包由标志位SYN=1知道,是请求创建新链接, 将ACK置为1,ack=j+1,做为响应Client的请求, 将SYN置为1,seq=随机值k,发送给Client等待确认, Server进入SYN_RECV状态 由于是创建链接,这些信息在一个数据包中。
第三次握手:

Client收到响应 检查ACK==1?,ack==j+1?,若都符合 将ACK置为1,ack=k+1,发送给Server,Client进入establish状态 Server收到响应 检查ACK==1?,ack==k+1?,若都符合 进入establish状态,三次握手完成,TCP链接创建,开始通讯。

如图:

接下来四次挥手:

因为TCP链接时全双工的,所以,每一个方向都必需要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的链接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,可是在这个TCP链接上仍然可以发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另外一方则执行被动关闭。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

以下图:

接下来为何是三次握手?

在通讯的过程当中,协议会给每一个字节一个序分配一个序号。三步握手的过程,主要是为了互相确认双方的起始序列号。

若是只进行两次握手,客户端发送连接请求及起始序列号seq = x, 收到 服务器端的起始序列号seq = y及对客户端序列号seq= x 的确认。此时,双方就 客户端的起始序列号达成了共识。

此时,并无对服务器的起始序列号达成共识,因此就须要进行第三次握手。对B的起始序列号达成共识,不能保证通讯的可靠。

若是进行四次握手,在四次握手的过程当中,能够把第2、三步合并,这样能够提升链接的速度与效率。

为何是四次挥手?

 TCP协议是一种面向链接的、可靠的、基于字节流的运输层通讯协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经所有发送完毕了;可是,这个时候主机1仍是能够接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,可是主机2仍是能够发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,以后彼此就会愉快的中断此次TCP链接。

为何四次挥手会有TIME_WAIT状态?

为了保证B能收到A的确认应答。 
若A发完确认应答后直接进入CLOSED状态,那么若是该应答丢失,B等待超时后就会从新发送链接释放请求,但此时A已经关闭了,不会做出任何响应,所以B永远没法正常关闭。

 

3、HTTP请求

https://blog.51cto.com/13570193/2108347

https://www.cnblogs.com/ranyonsue/p/5984001.html

 HTTP(超文本传输协议)是一种创建在TCP上的无状态链接,整个基本的工做流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动做,服务端收到请求以后,服务端开始处理请求,并根据请求作出相应的动做访问服务器资源,最后经过发送HTTP响应把结果返回给客户端。

HTTP请求:

 HTTP请求是客户端往服务端发送请求动做,告知服务器本身的要求。HTTP请求由状态行、请求头、请求正文三部分组成:

状态行:包括请求方式Method、资源路径URL、协议版本Version;

请求头:包括一些访问的域名、用户代理、Cookie等信息;

请求正文:就是HTTP请求的数据

其中请求方式又分为几种:

1.GET:获取资源

  GET方法用来请求访问已被URI识别的资源。也就是指定了服务器处理请求以后响应的内容。

2.POST:传输实体主体

  POST方法用来传输实体主体。POST与GET的区别之一就是目的不一样,两者之间的区别会在文章的最后详细说明。虽然GET方法也能够传输,可是通常不用,由于GET的目的是获取,POST的目的是传输。

3.PUT:传输文件

  PUT方法用来传输文件。相似FTP协议,文件内容包含在请求报文的实体中,而后请求保存到URL指定的服务器位置。

4.HEAD:得到报文首部

  HEAD方法相似GET方法,可是不一样的是HEAD方法不要求返回数据。用于确认URI的有效性及资源更新时间等。

5.DELETE:删除文件

  DELETE方法用来删除文件,是与PUT相反的方法。DELETE是要求返回URL指定的资源。

6.OPTIONS:询问支持的方法

  由于并非全部的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法例如DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。

7.TRACE:追踪路径

  TRACE方法是让Web服务器将以前的请求通讯环回给客户端的方法。这个方法并不经常使用。

8.CONNECT:要求用隧道协议链接代理

  CONNECT方法要求在与代理服务器通讯时创建隧道,实现用隧道协议进行TCP通讯。主要使用SSL/TLS协议对通讯内容加密后传输。

GET和POST的区别:

    1. GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

    2. GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

    3. GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值。

    4. GET方式提交数据,会带来安全问题,好比一个登陆页面,经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码.

HTTP响应:

服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动做要求,服务端作出具体的动做,将结果回应给客户端,称为HTTP响应。HTTP响应由三部分组成:状态行、响应头、响应正文;

状态行:包括协议版本Version、状态码Status Code、回应短语;

响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;

响应正文:就是响应的具体数据。

常见状态码:

  200---OK/请求已经正常处理完毕

        301---/请求永久重定向

        302---/请求临时重定向

        304---/请求被重定向到客户端本地缓存

        400---/客户端请求存在语法错误

        401---/客户端请求没有通过受权

        403---/客户端的请求被服务器拒绝,通常为客户端没有访问权限

        404---/客户端请求的URL在服务端不存在

        500---/服务端永久错误

        503---/服务端发生临时错误

接下来HTTPS:

https://blog.csdn.net/xiaoming100001/article/details/81109617

HTTPS是一种经过计算机网络进行安全通讯的传输协议,经由HTTP进行通讯,利用SSL/TLS创建全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性,此过程当中有两次HTTP链接。

一、client向server发送请求https://baidu.com,而后链接到server的443端口。

服务端必需要有一套数字证书,能够本身制做,也能够向组织申请。区别就是本身颁发的证书须要客户端验证经过,才能够继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。

二、传送证书
这个证书其实就是公钥,只是包含了不少信息,如证书的颁发机构,过时时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。

三、客户端解析证书
这部分工做是由客户端的TLS来完成的,首先会验证公钥是否有效,好比颁发机构,过时时间等等,若是发现异常,则会弹出一个警告框,提示证书存在问题。若是证书没有问题,那么就生成一个随即值(秘钥)。而后用证书对该随机值进行加密。

四、传送加密信息
这部分传送的是用证书加密后的秘钥,目的就是让服务端获得这个秘钥,之后客户端和服务端的通讯就能够经过这个随机值来进行加密解密了。

五、服务段加密信息
服务端用私钥解密秘密秘钥,获得了客户端传过来的私钥,而后把内容经过该值进行对称加密。

六、传输加密后的信息
这部分信息是服务端用私钥加密后的信息,能够在客户端被还原。

七、客户端解密信息 客户端用以前生成的私钥解密服务端传过来的信息,因而获取了解密后的内容。

相关文章
相关标签/搜索