浏览器输入一个URL地址后发生的事情

在浏览器中输入一个URL至页面呈现,发生的事情?

1、域名解析:浏览器获得URL地址,向操作系统请求该URL对应的IP地址,操作系统查询DNS(首先查询本地HOST文件,没有则查询网络)获得对应的IP地址

解释:

把URL分割成几个部分:协议、网络地址、资源路径

协议:指从该计算机获取资源的方式,常见的是HTTP、FTP

网络地址:可以是域名或者是IP地址,也可以包括端口号,如果不注明端口号,默认是80端口

如果地址不是一个IP地址,则需要通过DNS(域名系统)将该地址解析成IP地址,IP地址对应着网络上的一台计算机,DNS服务器本身也有IP,你的网络设置包含DNS服务器的IP,例如,www.abc.com不是一个IP,则需要向DNS询问请求www.abc.com对应的IP,获得IP,在这个过程中,你的电脑直接询问DNS服务器可能没有发现www.abc.com对应的IP,就会向它的上级服务器询问,这样依次一层层向上级找,最高可达根节点,直到找到或者全部找不到为止

端口号就相当于银行的窗口,不同的窗口负责不同的服务,如果输入www.abc.com:8080/,则表示不使用默认的80端口,而使用指定的8080端口

2、确认好了IP和端口号,则可以向该IP地址对应的服务器的该端口号发起TCP连接请求

3、服务器接收到TCP连接请求后,回复可以连接请求

4、浏览器收到回传的数据后,还会向服务器发送数据包,表示三次握手结束

5、三次握手成功后,开始通讯,根据HTTP协议的要求,组织一个请求的数据包,里面包含请求的资源路径、你的身份信息等,例如,www.abc.com/images/1/表示的资源路径是images/1/,发送后,服务器响应请求,将数据返回给浏览器,数据可以是根据HTML协议组织的网页,里面包含页面的布局、文字等等,也可以是图片或者脚本程序等,如果资源路径指定的资源不存在,服务器就会返回404错误,如果返回的是一个页面,则根据页面里的一些外链URL地址,重复上述步骤,再次获取

6、渲染页面,并开始响应用户的操作

7、窗口关闭时,浏览器终止与服务器的连接

以上只是基本步骤,还有一些可选的步骤,例如:网页缓存、连接池、加载策略、加密解密、代理中转等


TCP表示传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP/IP即传输控制协议/网间协议,是为广域网设计的

TCP三次握手和四次挥手

TCP三次握手:

所谓的三次握手,是指建立一个TCP连接时,需要客户端和服务器端总共发送三个包,三次握手的目的是连接服务器的指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息,在SOCKET编程中,客户端执行connect()时,将会触发三次握手


解释:

ACK:TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN:在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1,因此,SYN置1就表示这是一个连接请求或连接接受报文

FIN:即终结的意思,用来释放一个连接,当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接

为什么要进行三次握手(两次确认)?

主要是为了防止客户端发出的已失效的连接请求报文段突然又传送到了服务器端,因而产生错误,考虑一种正常情况,A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后,就释放了连接,A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B,正常,再考虑一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段,但B收到此失效的连接请求报文段后,会误以为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接,假定不采用第三次握手,那么只要B发出确认,新的连接就建立了,一直等待A发送数据过来,使得B的许多资源就浪费了,所以采用三次握手的方法可以防止上述现象的发生,在刚才的情况下,A不会向B发出第二次确认,B由于收不到确认,就知道A并没有要求建立连接


TCP四次挥手:

TCP连接的拆除需要发送四个包,客户端或者服务器端均可主动发起挥手动作,在SOCKET编程中,任何一方执行close()即可产生挥手操作

解释:当A没有数据要发送时,就要释放A这边的连接,A会发送一个报文(没有数据),B收到后会给应用程序一个信,这时候A那边的连接已经关闭,即A不再发送信息(但仍可接收信息),A收到B的确认后进入等待状态,等待B请求释放连接,B数据发送完成后就向A请求连接释放,A收到后回复一个确认信息,并等待2MSL时间

为什么要等待呢?

考虑到这种情况,B向A发送释放连接请求,但这个报文丢失了,A没有接收到不会发送确认信息,B超时会重传,这时A在等待时间内还能够接收到这个请求,再回复一个确认就行了

另外服务器B存在一个保活状态,如果A突然死机了,保活时间到了后,B会发送探测信息,以决定是否释放连接


常见的状态代码、状态描述:

200 客户端请求成功

400 客户端请求有语法错误,不能被服务器理解

401 请求未经授权

403 服务器收到请求,但是拒绝提供服务

404 请求资源不存在

500 服务器发生了不可预期的错误

503 服务器当前不能处理客户端请求,一段时间后可能恢复正常


参考链接:

http://swiftlet.net/archives/1082

http://blog.csdn.net/oney139/article/details/8103223

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值