Loading

浏览器输入URL发生了什么

1.DNS域名解析
所有浏览器首先要确认的是域名所对应的服务器在哪里。将域名解析成对应的服务器IP地址,是由DNS服务器来完成的。
客户端收到你输入的域名地址后,它首先去找本地的hosts文件,检查在该文件中是否有相应的域名、IP对应关系,如果有,则向其IP地址发送请求,如果没有,再去找DNS服务器。

浏览器客户端向本地DNS服务器发送一个含有域名www.cnblogs.com的DNS查询报文。本地DNS服务器把查询报文转发到根DNS服务器,根DNS服务器注意到其com后缀,于是向本地DNS服务器返回comDNS服务器的IP地址。本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其www.cnblogs.com后缀并用负责该域名的权威DNS服务器的IP地址作为回应。最后,本地DNS服务器将含有www.cnblogs.com的IP地址的响应报文发送给客户端。
从客户端到本地服务器属于递归查询,而DNS服务器之间的交互属于迭代查询。
正常情况下,本地DNS服务器的缓存中已有comDNS服务器的地址,因此请求根域名服务器这一步不是必需的。
2.建立TCP连接
TCP的报文格式
端口号(port)
前4个字节来标识了发送方的端口号和接收方的端口号,即该数据包由谁发送,由谁接收。前2个字节标识源端口号,紧接着2个字节标识目的端口号。
即发送方:(11111111,1111111)2 = (65535)10,除去0~1023.
即接收方:(11111111,1111111)2 = (65535)10,除去0~1023.
序号(seq)
TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。长度为4字节,序号是32bit的无符号数,序号到达232 - 1后又从0开始。
确认号(ack)
ack:确认序号,即确认字节的序号,更确切地说,是发送确认的一端所期望收到的下一个序号。
所谓的发送确认的一端就是将确认信息发出的一端。比如第二次握手的S端就是发送确认的一端。
确认序号为上次接收的最后一个字节序号加1.只有确认标志位(ACK)为1的时候,确认序号才有效。
数据偏移
也叫首部长度,占4个bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
保留(reserve)
占6位,保留为今后使用,但目前应置为0。
紧急URG(urgent)
当URG=1时,表明紧急指针字段有效。
它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。
例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。
当URG置为1时,应用进程就告诉TCP有紧急数据要传送。于是TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
确认ACK(acknowledgment)
仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
推送 PSH(push)
当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
复位RST(reset)
当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
同步SYN(synchronization)
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。
因此SYN=1就表示这是一个连接请求或连接接受报文。
终止FIN(finis,意思是“完”“终”)
用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。
窗口
占2字节。窗口值是(0,216 -1)之间的整数。
窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口),窗口大小是给对方用的。
窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(以字节为单位)。
之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
总之:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。
TCP三次握手
• 第一次握手:Client(客户端主机A)向Server(服务器主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号SEQ=x,上图中x=200,Client(客户端)进入SYN_SEND(已发送)状态,等待Server(服务器)确认。
• (插入)包的概念:包(Packet)是网络上传输的数据片段,也称分组。包是一种统称,在不同的协议不同的层次,包有不同的名字
• 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,随机产生一个发送序号SEQ=y,上图中y=500,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD(已接收)状态。
• 第三次握手:Client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ACK=y+1=501,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1=501,标志位ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED(已建立)状态。
3.发送HTTP请求
请求行包括请求方法、URI、HTTP版本。
4.服务器处理请求
服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix等。web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。
5.返回响应结果
在响应结果中都会有个一个HTTP状态码,比如我们熟知的200、301、404、500等。通过这个状态码我们可以知道服务器端的处理是否正常,并能了解具体的错误。
6.关闭TCP连接
四次挥手
• 第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号SEQ=x,确认序号ACK=y,上图中x=200,y=500。Client进入FIN_WAIT_1状态(已发送fin,等待回复)。
• 第二次挥手:客户B知道A要断开后,发送一个确认包,其中标志位ACK=1发送序号,SEQ=y确认序号ACK=x+1=201,Server进入CLOSE_WAIT状态(被动关闭)。
• 第三次挥手:客户B也断开TCP连接,此时发送一个包,其中,标志位fin=1,发送序号SEQ=y+1=501,Server进入LAST_ACK状态(确认请求)。
• 第四次挥手:客户A收到B的断开请求后,Client进入TIME_WAIT状态,接着发送一个确认包,标志位ACK=1,发送序号SEQ=x+1=201,确认序号ACK=y+2=502;Server进入CLOSED状态(关闭)。
7.浏览器解析HTML
浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。
8.浏览器布局渲染

posted @ 2021-03-29 21:09  _bwang  阅读(131)  评论(0编辑  收藏  举报