zoukankan      html  css  js  c++  java
  • http知识填坑

    当我们输入网址回车或者刷新页面时,浏览器和计算机做了什么事呢?

    首先就是域名解析,1.浏览器先搜索自身的DNS缓存

    2.若浏览器没有找到缓存或者缓存已经失效,那么计算机搜索自身的DNS缓存

    3.读取本地的HOST文件

    4.浏览器发起一个DNS的一个系统调用

    宽带运营商服务器查看本身缓存

    运营商服务器发起一个迭代DNS解析的请求

    运营商服务器把结果返回操作系统内核同时缓存起来

    操作系统内核把结果返回浏览器

    浏览器就拿到了www.xxxxxx.com的ip地址了

    5.浏览器获得域名对应的ip地址后,发起HTTP经典的“三次握手”

    6.TCP/IP链接建立起来后,浏览器就可以向服务器发生HTTP请求了

    7.服务器端接受到了这个请求,根据路径参数,经过后端的一些处理之后,把处理后的结果数据返回给浏览器,比如页面完整的html代码返回给浏览器

    8.浏览器拿到了完整的html代码后,在解析和渲染这个页面时,里面js,css,图片静态资源,他们同样也是一个个http请求,都要经过上面七个步骤

    9.浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户

    而对于三次握手的解释是这样的:

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

    位码即tcp标志位,有6种标示:

    SYN(synchronous建立联机)

    ACK(acknowledgement 确认)

    PSH(push传送)

    FIN(finish结束)

    RST(reset重置)

    URG(urgent紧急)

    Sequence number(顺序号码)

    Acknowledge number(确认号码)

    客户端TCP状态迁移:
    CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
    服务器TCP状态迁移:
    CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

    各个状态的意义如下:
    LISTEN - 侦听来自远方TCP端口的连接请求;
    SYN-SENT -在发送连接请求后等待匹配的连接请求;
    SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
    ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
    FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
    FIN-WAIT-2 - 从远程TCP等待连接中断请求;
    CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
    CLOSING -等待远程TCP对连接中断的确认;
    LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
    TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
    CLOSED - 没有任何连接状态;

    TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,

    (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

    (2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

    (3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据。

    http协议可以粗暴的分为请求和响应,请求和响应都会发送http头和正文信息。http头发送的是一些附加的信息:内容类型,服务器发送响应的日期,http状态码。正文的话就是表单的数据和返回的数据

    未来的你会感谢现在努力的你
  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/cjxblogs/p/7244083.html
Copyright © 2011-2022 走看看