输入一个url后发生的事

当你输入"www.baidu.com"后发生了些什么?

1.当你输入"b"时:

首先,当你输入"www.b"甚至是输入"b"时,浏览器接受到这个消息以后,会触发自动完成机制,浏览器根据自己的算法,和你的历史记录或者是否处于隐私浏览状态,在地址栏下方给出建议,所以在输入b后,浏览器可能就会给出"baidu.com"的建议.
当协议或主机名不合法时,浏览器会将地址栏中输入的文字传给默认的搜索引擎,大部分情况下在把文字传递给搜索引擎的时候,URL会带有一个特定的字符串,用来告诉搜索引擎这次搜索来自这个特定的浏览器.

2.HTST列表

浏览器检查自带的HTST列表(HTTP严格传输安全),这个列表里包含了那些请求浏览器只适用HTTPS进行连接的网站.如果网站在这个列表里,那么浏览器就会使用HTTPS而不是HTTP协议,否则,最初的请求会使用HTTP协议发送.

3.DNS域名解析

浏览器先查找自己主机对应的域名服务器.域名服务器先查找自己的数据库中的数据,如果没有,就向上级域名服务器进行查找,以此类推,最多回溯到跟域名服务器,肯定能够找到这个域名的IP地址.(当然,域名服务器自身也会进行一些缓存,把曾经访问过的域名和对应的IP地址缓存起来,可以加速查找过程.)

4.ARP过程

知道了目的IP地址后,我们需要知道对应的MAC地址.每台主机都维护一个ARP缓存表,如果缓存命中,返回结果目标IP = MAC,缓存表中的表项有过期时间,下次还要发送ARP请求来获得目的主机的硬件地址.
如果缓存没有命中:

  • 源主机发送ARP请求,询问对应IP地址的主机的硬件地址是多少?并将这个请求广播到本地网段.
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址写在应答包中.

5.使用套接字

当浏览器得到目标服务器的IP地址,以及URL中给出来的端口号,它会生成一个TCP流套接字.

  • 这个请求首先被交给传输层,在传输层请求被封装成TCP segment,目标端口号和源端口号会被加入头部,
  • TCP segment被送往网络层,网络层会在其中再加入一个IP头部,里面包含了目标服务器的IP地址以及本机的IP地址,把它封装成一个IP packet.
  • 这个TCP packet接下来进入数据链路层,链路层会在封包中加入frame头部,里面包含了本地内置网卡的MAC地址以及本地路由器的MAC地址.
  • 最终封包会到达管理本地子网的路由器,在那里出发,一路上经过的路由器会从IP数据报报头里提取出目标地址,并将封包正确的路由到下一个目的地.IP数据报头部的time to live(TTL)域的值没经过一个路由器就减一,如果封包中的TTL减为0,那么这个包就会被路由器丢弃.

以上的发送和接收过程在TCP连接期间会发生很多次.

  • 服务器进入LISTEN(监听)状态,时刻准备接收客户端请求.
  • 客户端向服务器发送请求连接报文,SYN=1,同时选择一个自己的初始化序列号seq=x.此时TCP客户端进入SYN-SENT(同步已发送)状态.
  • 服务器收到请求后,发出确认报文,ACK=1,确认号ack=x+1,并且初始化自己的序列号seq=y…此时,服务期进入SYN-RCVD(同步已收到)状态.
  • 客户端收到确认后,再次发送确认.ACK=1,确认号ack=y+1,并且初始化自己的序列号seq=x+1.此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态.
  • 服务器确认后也进入ESTABLISHED状态,双方开始通信.

6.HTTP请求与与应答

连接建立完成,客户端向服务器发送HTTP请求.
通常HTTP请求由请求行,请求报头,空行和正文四部分组成.

**请求行:**由请求方法,url和HTTP版本组成.通过请求方法来告诉服务器"我"想干什么.如果是是GET方法,那么就是发送请求来获得服务器上的资源,如果是POST方法,那么就是向服务器提交资源让服务器处理.通过url来请求对应的url地址(它通常和请求报头的Host来组成一个完整的url),版本自然不用多说,不过这里需要注意的是,HTTP1.0并没有Host,而是HTTP1.1才有的.

**请求报头:**有很多属性,它们是为了协助客户端和服务器之间交互而产生的.服务器可以通过其中的Host得知所请求的资源哪个主机的哪个端口上.Content-Length得知Body体的长度.Content-Type得知正文的数据类型.Accept得知客户端可以接受的资源,Accept-Language得知客户端能救接受的语言,Accept-Encoding得知客户端能够接受的编码格式,user-agent得知用户的操作系统和浏览器版本信息,referer得知当前页面是从那个页面跳转过来的,Connection得知客户端希望建立的是长连接还是短连接.客户端还可以通过cookie向服务器带数据.

**空行:**的作用是为了将正文和报头分离(这是必不可少的.)

**正文:**如果是GET方法,那么正文为空,如果是POST方法,则通常此处放置的就是要提交的数据.

服务器收到HTTP请求后,向客户端发送HTTP应答.
HTTP应答通常也由状态行,响应报头,空行和正文四部分组成.

状态行 : 由HTTP版本,状态码和对状态码的描述组成
状态码如图:
在这里插入图片描述
这里响应报头,空行,正文不再细说.

7.渲染

当服务器提供了资源后,浏览器进行解析,渲染,将页面呈现给用户.

8.断开连接

  • 客户端发送释放连接报文,并停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u,此时客户端进入FIN-WAIT(终止等待)状态.
  • 服务器收到连接释放报文,发出确认报文,ACK=1,确认号ack =u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态.服务器通知应用程序,客户端向服务器的方向就释放了,这时处于半关闭状态(但是服务器可能还有数据要给客户端).
  • 客户端收到请求后,进入FIN-WAIT2(终止等待2)状态.等待服务器发送链接释放报文.
  • 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于处于半关闭状态,服务器很可能又发送了一些数据,假定seq=w,服务期进入LAST–WAIT(最终确认)状态.等待客户端的确认
  • 客户端收到服务器的连接释放报文后,ACK=1,ack=w+1,而自己的序列号为seq=u+1,此时客户端进入TIME-WAIT状态,此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,才进入CLOSED状态
  • 服务器收到客户端发出的确认后,立即进入CLOSED状态.
  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

我的程序才没有bug!

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值