note-网络是怎样连接的1 浏览器内部

note-网络是怎样连接的1 浏览器内部

码农世界 2024-05-23 前端 71 次浏览 0个评论
助记提要
  1. 常见浏览器使用的协议 4种
  2. HTTP方法 8种
  3. 响应状态码类型 5种
  4. 5种IP地址的含义
  5. 域名查找的基本原理
  6. 协议栈发送消息的4个阶段

第1章 浏览器生成消息 探索浏览器内部

1 浏览器输入的URL

  • 常见协议

    http(访问Web服务器),ftp(从ftp服务器下载和上传),file(读取客户端本地文件),mailto(发送电子邮件),news(阅读新闻组的内容)。

  • URL的格式会随着协议的不同而不同。

    访问Web服务器的URL格式:协议://服务器名/数据路径。

    数据路径省略文件名时,会读取文件夹下事先设置好的默认文件名。不确定是文件还是文件夹的情况下,有文件则读取文件,无文件会按目录处理。

    2 HTTP协议

    2.1 URI

    表示访问的目标,一般是路径名,指向一个存放网页数据的文件或是一个CGI程序文件。

    直接从URL中提取即可。

    一条请求中只能写一个URI。获取多个文件,必须对每个文件发送一次请求。

    2.2 HTTP的方法

    GET,获取URI指定的信息。

    POST,向服务器发送数据。

    HEAD,与GET相同,但是只返回HTTP消息头,不返回数据内容。用来获取文件最后更新时间等信息。

    OPTIONS,通知或查询通信选项。

    PUT,替换URI指定的服务器上的文件。文件不存在则新建。

    DELETE,删除URI指定的服务器上的文件。

    TRACE,把服务器收到的请求行和头部直接返回给客户端。用于在代理时检查改写请求的情况。

    CONNECT,使用代理传输加密消息时使用的方法。

    2.3 请求和响应消息的结构

    请求消息

    方法 URI HTTP版本   # 请求行,版本号表示该消息是基于哪个HTTP规格写的
    字段:值            # 消息头,请求的附加信息,多行键值对,
    ...
    ...
    (空行)
    消息体             # 消息体,向服务器发送的数据
    

    响应消息

    HTTP版本 状态码 响应短语 # 状态行
    字段:值            # 消息头
    ...
    ...
    (空行)
    消息体             # 消息体为服务器向客户端发送的数据
    
    2.4 HTTP的主要消息头字段
    • 通用

      Date,请求或响应生成的日期;

      Pragma,表示数据是否允许缓存的通信选项;

      Cache-Control,控制缓存的信息;

      Connection,发送响应后TCP连接是否继续保持;

      Transfer-Encoding,消息主体的编码格式;

      Via,记录途中经过的代理和网关;

    • 请求头

      Authorization,身份认证数据;

      From,请求发送者的邮件地址;

      If-Modified-Since,判断客户端缓存是否过期,过期后才获取新的数据;

      Refer,通过点击超链接进入页面时,Refer记录上一个页面的URL;

      User-Agent,客户端软件的名称和版本号;

      Accept,客户端支持的数据类型,MIME类型表示;

      Accept-Charset,客户端支持的字符集;

      Accept-Encoding,客户端可支持的编码格式,一般是数据的压缩格式;

      Accept-Language,客户端支持的语言;

      Host,接受请求的服务器的IP地址和端口号;

      If-Unmodified-Since,指定日期后数据未更新时执行请求;

      Range,指定数据范围,以仅获取部分数据;

    • 响应头

      Location,表示信息的准确位置。URI为相对路径时,这个字段返回绝对路径;

      Server,服务器程序的名称和版本号;

      WWW-Authenticate,请求的信息存爱访问控制时,返回身份认证用的数据

      Accept-Ranges,使用Range请求部分数据时,服务器告知客户端是否支持此功能;

    • 实体头

      Allow,表示指定的URI支持的方法;

      Content-Encoding,消息体经过压缩等编码时,表示其编码格式;

      Content-Length,表示消息体长度;

      Content-Type,表示消息体的数据类型,以MIME规定的数据类型表示;

      Expires,消息的有效期;

      Last-Modified,数据的最后更新日期;

      Content-Language,消息体的语言;

      Content-Location,消息体在服务器上的位置;

      Content-Range,当仅请求部分数据时,表示数据范围;

      Etag,更新操作中可能需要基于上次的响应数据来发送下次请求。Etag可以用来提供上次响应与下次请求的关联信息。响应时,服务器发给客户端一个唯一标识,下次请求时客户端通过If-Match、If-None-Match、If-Range字段把标识告诉服务器。Etag是将Cookie标准化后的规格。

      2.5 响应状态码类型

      1xx,告知请求的处理进度和情况;

      2xx,请求成功;

      3xx,表示进一步操做;

      4xx,客户端错误;

      5xx,服务器错误;

      3 IP地址

      3.1 TCP/IP的思路

      集线器连接几个计算机组成子网,子网通过路由器组成网络。

      网络中每个设备都会分配一个IP地址,通过IP地址可以判断访问的服务器的位置,然后才能发送消息。

      发出的消息先经过集线器,转发到最近的路由器上,路由器会根据消息判断下一个路由器的位置,然后再发送到下一个路由器,不断转发直到传给目的地。

      3.2 IP地址结构
      # IP地址主体
      10.11.12.13
      # IP地址加子网掩码
      10.11.12.13/255.255.255.0
      # 使用网络号的比特数表示子网掩码
      10.11.12.13/24
      # 主机号全部为0,代表整个子网
      10.11.12.0/24
      # 主机号全部为1,表示对整个子网进行广播
      10.11.12.255/24
      

      子网掩码左边一半全是1,右边一半全是0。子网掩码为1的部分是网络号,为0的部分是主机号。

      3.3 域名和IP并用的理由

      域名比IP地址更容易记,因此由人使用。

      IP地址简短且格式统一,能被设备高效处理。

      通过DNS进行IP和域名的互查。

      3.4 socket库查询IP地址

      socket库中的程序组件可以让其他应用程序调用系统的网络功能。域名解析器是socket库中的一种程序组件。

      网络应用程序调用解析器后,程序的控制流程回转移到解析器内部。

      解析器先生成发送给DNS服务器的查询消息,然后委托给操作系统内部的协议栈执行发送操作。

      协议栈执行发送消息的操作,通过网卡把消息发给DNS服务器。

      DNS服务器根据消息中的内容进行查询,找到IP地址,返回给客户端。

      消息经过网络到达客户端,然后经过协议栈传给解析器。解析器读出其中的IP地址,并将IP地址写到应用程序指定的内存地址中。

      控制流程重新回到应用程序。

      4 DNS

      DNS查询消息的结构

      域名,服务器或邮件服务器的名称。

      Class,用于识别网络的信息。只会是表示互联网的IN。

      记录类型,表示域名对应哪种类型的记录。

      4.1 几种记录类型

      A:域名对应IP地址

      MX:域名对应邮件服务器

      PTR:IP对应域名

      CNAME:域名对应域名的别名

      NS:查询DNS服务器的IP地址

      SOA:查询域名属性信息

      4.2 域名的层次结构

      域名是用句点分隔不同层级的,每个层级都表示一个域,越靠右的域层级越高。

      一个域的信息作为一个整体存放在DNS服务器中。

      4.3 DNS服务器查找的基本原理

      下级域的DNS服务器的IP地址都会注册到他们的上级DNS服务器中,上级DNS服务器的IP地址再注册到更上一级的DNS服务器。客户端通过上级DNS服务器查询到下级DNS服务器的IP地址,就能像下级DNS发送查询请求。

      顶级域上面还有根域。根域DNS服务器在全世界仅有13个,它们的地址基本不发生变化。根域DNS的地址在所有的DNS服务器都有保存。

      客户端先访问最近的一台DNS服务器,如果其中没有所查询域名对应的信息,DNS服务器会把查询请求转发给根域DNS。

      根域中也找不到该域名,但是能判断出域名属于根域下的哪一个域,根域DNS把这个下一级DNS的IP地址返回给离客户端最近的DNS服务器。

      最近的DNS又向根域的下一级DNS服务器发出查询请求,下一级DNS找不到域名,会再返回下下级的DNS服务器的IP,以此类推,直到找到目标DNS服务器,得到所查询域名的IP地址,返回给客户端。

      DNS能缓存之前查询过的域名。如果查询的域名不在缓存中,接下来可以从缓存的位置开始向下进行,避免每次查询都从根域开始。缓存中的信息有一个有效期,响应时也会告诉客户端是来自缓存还是来自管理该域名的服务器。

      5 委托协议栈发送消息

      分为4步。

      1. 创建套接字

      服务器先创建套接字,然后等待客户端向该套接字连接管道。

      客户端调用socket组件创建套接字。

      之后协议栈会返回一个描述符,应用程序会把描述符存到内存中。描述符用来识别后续使用哪一个套接字。

      2. 连接阶段

      客户端调用socket库的connect程序组件,委托协议栈将客户端创建的套接字和服务器那边的套接字连接起来。

      connect需要三个参数:描述符、IP地址、端口号,然后执行连接操作。

      连接成功后,会把服务器的IP地址和端口号保存在涛姐字中。

      描述符是应用程序识别使用哪一个套接字的;IP地址和端口号是客户端和服务器之间识别对方套接字的。

      3. 通信阶段

      应用程序在内存中准备好要发送的数据;

      调用socket库的write组件,使用指定的描述符发送数据;

      服务器收到数据内容后,解析并做相应的操作,向客户端返回响应信息;

      客户端使用socket的read组件把服务器的响应信息存在接收缓冲区中。

      接收缓冲区是应用程序内部划分出来的内存空间。

      4. 断开阶段

      客户端可以调用socket库的close组件。

      HTTP协议规定,Web服务器发送完响应消息后,应主动执行断开操作。因此Web服务器会先调用close断开连接。

      断开操作传达到客户端后,客户端的套接字也进入断开阶段。

      read组件接受完数据后,浏览器得到数据收发结束的消息,就调用close组件。

      每获取一个数据都要执行连接、发请求、收响应、断开的操作,效率低。HTTP1.1允许在一次请求中进行多次收发操作。

转载请注明来自码农世界,本文标题:《note-网络是怎样连接的1 浏览器内部》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,71人围观)参与讨论

还没有评论,来说两句吧...

Top