zoukankan      html  css  js  c++  java
  • 一个用户从发起请求到接收到响应,中间经过哪些服务,每个服务做什么事情

    1.先来看看一张概要图

     2.分析过程

    (1)用户输入url,浏览器内部代码将url进行拆分解析,如下图所示:

    (2) 浏览器首先去找本地的hosts文件,检查在该文件中是否有相应的域名、IP对应关系,如果有,则向其IP地址发送请求,如果没有就会将domain(域)发送给 dns(域名服务器)进行解析(解析如下图),将域名解析成对应的服务器IP地址,发回给浏览器

    注释:(结合上图看)
    浏览器客户端向本地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地址的响应报文发送给客户端。
    (3)拿到服务器ip后,接下来就是网络通信(过程如下图),分层由高到低分别为:应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端从数据链路层往上走。
    首先:应用层客户端发送HTTP请求
    HTTP请求包括请求报头和请求主体两个部分,其中请求报头包含了至关重要的信息,包括请求的方法(GET / POST)、目标url、遵循的协议(http / https / ftp…),返回的信息是否需要缓存,以及客户端是否发送cookie等。
    然后:传输层TCP传输报文
    3次握手,User-Agent(一般指浏览器)会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx)等的80端口。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间有各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终达到WEB程序,最终建立了TCP/IP的连接

    第一次握手:host1发送一个TCP标志位 SYN=1、ACK=0的数据包给host2,并随机会产生一个Sequence number=1110,当host2接受到这个数据后,host2由SYN=1可知客户端是想要建立连接

    第二次握手:host2要对客户端的联机请求进行确认,向host1发送应答号ACK=1、SYN=1、确认号Acknowledge number =1111,此值是host1的序列号+1,还会产生一个随机的序列号Sequence number = 22222,这样就告诉host1可以进行连接;

    第三次握手:host1收到数据后检查Acknowledge number 是否是1110 + 1的值,以及ACK的值是否为1,若为1,host1会发送ACK = 1、确认号码Acknowledge number = 22222,告诉host2,你的请求连接被确认,连接可以建立

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
    在运用此协议进行数据传输前都会进行连接的建立工作(三次握手)
    当数据传输完毕,连接的双方都会通知对方要释放此连接(四次挥手)
    tcp标志位有6种标志位
    1.SYN(synchronous )建立联机

    2.ACK(acknowledgement)确认

    3.PSH(push)传送

    4.FIN(finsh)结束

    5.RST(reset)重置

    6.URG(urgent)紧急

    接着:网络层IP协议查询MAC地址
       IP协议的作用是把TCP分割好的各种数据包传送给接收方。而要保证确实能传到接收方还需要接收方的MAC地址,也就是物理地址。IP地址和MAC地址是一一对应的关系,一个网络设备的IP地址可以更换,但是MAC地址一般是固定不变的。ARP协议可以将IP地址解析成对应的MAC地址。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,在中转的过程中需要通过下一个中转站的MAC地址来搜索下一个中转目标。
    数据到达数据链路层
       在找到对方的MAC地址后,就将数据发送到数据链路层传输。这时,客户端发送请求的阶段结束
    再次:服务器接收数据
       接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在运输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文。
    服务器响应请求
       服务接收到客户端发送的HTTP请求后,查找客户端请求的资源,并返回响应报文,响应报文中包括一个重要的信息——状态码。状态码由三位数字组成,
    其中比较常见的是200 OK表示请求成功。
    301表示永久重定向,即请求的资源已经永久转移到新的位置。在返回301状态码的同时,响应报文也会附带重定向的url,客户端接收到后将http请求的url做相应的改变再重新发送。
    404 not found 表示客户端请求的资源找不到。
    最后: 服务器返回相应文件
        服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。
    关闭TCP连接
    为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP连接的3次握手类似,关闭TCP连接,需要4次挥手。

    第一次挥手:当传输的数据到达尾部时,host1向host2发送FIN = 1标志位;可理解成,host1向host2说,我这边数据传送完成了,我准备断开连接了

    第二次挥手:因TCP的连接是全双工的双向连接,关闭也是要从两边关闭;当host2收到host1发来的FIN=1的标志位后,host2不会立刻向host1发送FIND=1的请求关闭信息,而是先向host1发送一个ACK=1的应答信息,表示:你请求关闭的请求我已经收到,但我可能还有数据没有完成传送,你再等下,等我数据传输完成了我就告诉你

    第三次挥手:host2数据传输完成,向host1发送FIN=1,host1收到请求关闭 连接的请求后,host1就明白host2的数据已经传输完成,现在可以断开连接了

    第四次挥手:host1收到FIN = 1后,host1还是怕由于网络不稳定的原因,怕host2不知道他要断开连接,于是向host2发送ACK = 1确认信息进行确认,把自己(host1)设置成TIME_WAIT的状态并启动2MSL定时器,如果host2没有收到ACK,host2端重传定时器触发,会重发FIN = 1,要求host1重新发送ACK,当host2收到ACK后,host2就断开连接;;当host1等待2MSL(2倍报文最大生存时间)后,仍然没有收到host2的重传请求,他就知道 host2已经收到了ACK,所以 host1此时才关闭连接,否则会重复上述过程,如果被动一方始终没能收到ACK,最终会超过最大重传次数,连接被关闭 这一点设计地很巧妙


  • 相关阅读:
    centos出现“FirewallD is not running”怎么办
    百度编辑器(Ueditor)最新版(1.4.3.3)插入锚点失败原因分析及BUG修复
    centos rm -rf 恢复删除的文件
    php实现粘贴截图并完成上传功能
    微信网页授权java实现
    JAVA使用POI读取EXCEL文件的简单model
    java读取excel文件数据
    java文件操作(读流)
    oracle 10g正则表达式 REGEXP_LIKE 用法
    Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
  • 原文地址:https://www.cnblogs.com/sglx/p/12761187.html
Copyright © 2011-2022 走看看