zoukankan      html  css  js  c++  java
  • 网络请求生命周期

    在浏览器请求一个域名,例如:http://www.cnblogs.com/weiyalin/ 我们可以得到一个页面。看似简单的一个操作,背后却隐藏了诸多细节。

    下面我们来讨论一下这些细节,也就是一次网络请求的完整生命周期。

    1、根据域名获取IP地址

    当浏览器请求 http://www.cnblogs.com/weiyalin/ 这个域名时,浏览器并不知道去哪里获取资源,它需要知道一个确切的IP地址。那有人就要问了为什么不直接使用IP地址进行访问呢?当然可以直接用IP地址进行访问,但对于用户来说要记忆IP地址并不是一件容易的事,使用域名就是为了方便用户。将域名转换为IP地址则是使用DNS 域名解析系统(分布式),如果用户在浏览器输入的是域名,则浏览器首先从域名服务器那里获取域名对应的IP地址

    2、添加HTTP头

    拿到IP地址之后,浏览器就开始打包本次请求,使用的协议是HTTP协议或HTTPS协议。打包格式如下:

    GET、URL、HTTP1.1

    正文格式、正文长度

    请求数据

      HTTP头:主要包含方法、请求资源的URL,以及HTTP的版本

    上文中使用的DNS、HTTP、HTTPS进行的操作都是在应用层进行的,经过应用层封装之后,浏览器将包交个下一层传输层来完成。

    3、添加TCP头

    传输层有两种协议分别是TCP与UDP协议,TCP面向连接,需要三握才能建立连接,比较稳定但是开销较大,性能不如UDP;UDP面向无连接,速度较快但是不可靠,可能会丢包。

    对于 HTTP/HTTPS 请求来说,都是基于 TCP 协议的可靠连接,TCP 协议有两个端口,一个是源端口(浏览器监听的端口,监听服务器响应),一个是目的端口(服务器监听的端口,监听客户端请求,对于 HTTP 请求,通常是 80 端口,对于 HTTPS 请求,通常是 443 端口),操作系统会根据端口来判断,将得到的包转发给哪个进程。

    浏览器端口:12345

    服务器端口:443

    GET/POST、URL、HTTP1.1

    正文格式、正文长度

    请求数据

     TCP头:主要包含源端口、目的端口 以及序号、确认号等一些信息

     

    4、添加IP头

    传输层封装完成后,会将包交给操作系统的网络层,网络层根据IP协议再给包加上IP头,IP头中包含源IP地址和目的IP地址,即浏览器所在机器IP地址和服务器IP地址。

    源IP:192.168.0.1

    目的IP:47.96.240.190

    浏览器端口:12345

    服务器端口:443

    GET/POST、URL、HTTP1.1

    正文格式、正文长度

    请求数据

     

     IP头:源IP、目的IP

     

     

    5、添加MAC头

    在添加完IP头后,封装成的IP数据报就交给数据链路层封装成MAC帧了。MAC帧在传送是使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。

    源MAC地址

    目的MAC地址

    源IP:192.168.0.1

    目的IP:47.96.240.190

    浏览器端口:12345

    服务器端口:443

    GET/POST、URL、HTTP1.1

    正文格式、正文长度

    请求数据

     

     MAC头:源地址、目的地址

    注:在局域网中,由于硬件地址已经固化在网卡中的ROM中,因此常常将硬件地址称为物理地址。因为在局域网的MAC帧中的源地址和目的地址都是硬件地址,因此又将硬件地址称为MAC地址。

    MAC帧在经过多个网关的跳转之后,到达目的服务器。目标服务器根据MAC帧首部的硬件地址决定收下或放弃,当比对成功后,取下MAC头,将包传递给上一层网络层。网络层发现 IP 也对上了,就取下 IP 头,然后交给传输层。在传输层里,对于收到的每一个包,都要回复包收到了,这个回复不是此次请求的响应,仅仅是回复包已收到而已,这个回复会沿着包的来路回去。同时通过对比TCP头中的端口号,找到目标服务器兼职监听的端口,然后取下TCP头,将包交给应用层对 HTTP/HTTPS 请求进行处理。

    后台处理完后的响应内容经过和请求包同样的处理流程自上而下经过层层打包后,发送给请求的客户端,然后再经过自下而上的处理,最终在客户端浏览器显示出结果。

  • 相关阅读:
    docker 常用命令
    linux 查看服务器序列号
    centos 7 lsof 安装使用
    Jenkins +svn +maven +tomcat+ ansible 自动化批量部署
    nginx 部署前期一定要关闭selinux
    yum 执行不了, 解决方法
    IIS发布网站
    使用TreeView 使用多选功能
    C#类和接口
    关于C#垃圾回收
  • 原文地址:https://www.cnblogs.com/weiyalin/p/10607758.html
Copyright © 2011-2022 走看看