1从浏览器输入一个URL(www.baidu.com)的全过程
一.域名解析
浏览器搜索自己的DNS缓存
若没有,则搜索操作系统中的DNS缓存
首先检查本地磁盘上的
hosts文件
中的url与ip对应关系列表中是否有对应url的ip,有则直接返回。
没有
浏览器
则发送请求到
本地dns服务器
(一般为网络提供商),本地dns服务器会先查询缓存记录中的数据,(
此过程是递归的方式进行查询
)
如果没有则要去
dns根服务器
查询,
根DNS服务器没有记录具体的域名和IP地址的对应关系,他会返回本地DNS服务器
顶级域名服务器地址
本地DNS服务器继续向
顶级域名服务器
发出请求,
顶级域名服务器
收到请求之后,不会直接返回域名和地址的对应关系,而是返回给本地dns服务器权限域名
服务器的地址。
最后,【本地DNS服务器】向权限域名服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把
IP地址返回给用户电脑,还要把这个对应关系保存在缓存
中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
二.建立tcp连接(三次握手)
三次握手有几个常用的字段:
1.
序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
2.
确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
3.
标志位(Flags):共6个,即URG、ACK(确认序号有效)、PSH、RST、SYN(建立一个连接)、FIN(释放一个连接)
1.一般由浏览器向服务器发送一段
TCP报文
(
SYN=1,seq=x
),浏览器进入SYN SENT状态
2.服务器接受到浏览器发出的报文后
结束LISTEN阶段,并
给浏览器发送一个TCP报文(SYN=1,ACK=1,ack=x+1,seq=y),之后
服务器端进入SYN-RCVD状态
3.客户端接受到浏览器的确认信息后明确了客户端和服务器数据传输正常,浏览器结束
SYN-SENT状态
, 返回最后一段tcp报文(ACK=1,ack=y+1,seq=x+1),
随后客户端进入ESTABLISHED阶段。
4.
服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。
三.建立TCP连接后发起http请求
四.服务器收到请求并响应HTTP请求
五.浏览器解析htm代码,并请求htm代码中的资源(如js、css图片等)
六.断开TCP连接(四次挥手)
1.
首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:
FIN=1,seq=x),
随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
2.客户端接收到服务器发送的报文后,
确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文(
ACK=1,ack=x+1,seq=y
),
随后服务器端开始准备释放服务器端到客户端方向上的连接。
3.客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段(在这之前还需要接受服务器发送的最后的数据
)
4.
服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:(
ACK=1,FIN=1,seq=z,ack=x+1
),
随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。
5.
客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文(
ACK=1,ack=z+1,seq=x+1
)
6.服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。 客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
七.浏览器对页面进行渲染呈现给用户
为什么要进行第三次握手?
其实这个问题就是说,为什么tcp不能两次握手,或者一次握手就建立连接,和三次握手时怎么解决两次握手中的问题的。
为什么不能一次握手很容易理解,TCP是面向连接的,一次握手肯定建立不了连接,一条信息发出去连个回信都没有怎么连接?所以问题在为什么不能两次握手,这个问题也很容易网上说的也不少,假设只有两次握手,比如图中的1,2步,当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以A在一段时间内没收到ACK后,在发送一个SYN,B也成功收到,然后A也收到ACK,这时A发送的第一个SYN终于到了B,对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它,而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费
那三次握手为什么可以?两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手,也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的,这时如果Client端向Server写数据,Server端将以 RST包 响应,方能感知到Server的错误。
总的来说,三次握手可以保证任何一次握手出现问题,都是可以被发现或补救的
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
为什么客户端在TIME-WAIT阶段要等2MSL?
为的是确认服务器端是否收到客户端发出的ACK确认报文
当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;
如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手
所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因
http和https的区别?
http协议和https协议的区别:传输信du息安全性不同、连接方式不同、端口不同、证书申请方式不同。
传输信息安全性不同
1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
2、https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
连接方式不同
1、http协议:http的连接很简单,是无状态的。
2、https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
端口不同
1、http协议:使用的端口是80。
2、https协议:使用的端口是443.
证书申请方式不同
1、http协议:免费申请。
2、https协议:需要到ca申请证书,一般免费证书很少,需要交费。