第一步:浏览器生成http请求信息(第五层)

  1.分解url

    当用户输入网址时,浏览器会以一定的规则分解网址,

    以 http://www.cemabenteng.com/dir/index.html 为例进行分解,

    http为请求的协议名称,www.cemabenteng.com为请求的web服务器,dir/index.html为请求的资源,

    (如果是静态资源,则dir为该服务器上的目录,index.html为该目录上的资源,如果是动态资源,则服务器会根据请求的资源名称动态提供资源)

  2.生成http请求消息

    消息格式:    <方法  URI  http版本>

             <消息头>

             <消息体> 

    2.1 方法

       当用户输入网址,或者点击超链接请求服务器时,使用的是GET方法

       当提交form表单时,使用form页面设置的方法

    2.2 URI

       即上例中的dir/index.html

    2.3 http版本

      一般为1.1

    2.4 消息头

      与请求相关的一些信息,例如我们熟知的cookie,User-Agent(使用的浏览器类型及版本)等。

    2.5 消息体

      消息体存放请求中携带的数据,因为GET方法所携带的数据都在URL中,因此消息体没有内容。而POST方法所携带的数据就存放于此。

  3.域名解析

    生成消息后,浏览器会调用操作系统的DNS客户端向DNS服务器查询域名对应的IP地址。

      3.1 浏览器将域名(即上例中的www.cemabenteng.com)发送给DNS服务器,

      3.2 DNS客户器将域名生成域名查询消息并发送给tcpip协议驱动,

      3.3 tcpip协议驱动使用网卡将消息发送给最近的DNS服务器,

      3.4 最近的DNS服务器将消息发送给根服务器,然后逐级向下查询,直到查询到结果返回。

        ps:DNS查询使用UDP协议,只发送一个包,而由于包大小有限,只能容下13个根服务器信息,因此世界上只有13个根服务器,国内只有根服务器镜像。

  4.委托操作系统发送http请求

    浏览器将IP地址和请求消息发送给操作系统,委托操作系统发送出http请求。

第二步:TCP模块发送请求(第四层)

    1.创建套接字

      操作系统在接到请求后,首先会申请一块用于存放一个套接字所需的内存空间,套接字是存放了一些通信相关的控制信息的集合。

      然后向这个内存空间写入一些初始状态,并把该套接字的唯一标识告诉应用程序,即浏览器。

    2.连接服务器

      连接服务器就是通信双方交换控制信息。操作系统首先接受浏览器给出的服务器地址,然后申请数据缓存空间并创建TCP头部,通过

      委托ip模块,向服务器传达开始通信的请求。服务器会返回连接成功的信息,之后会向套接字中写入服务器的ip等信息,并标识状态为已连接。

      最后客户端返回接收相应成功的信息给服务器,连接就算成功完成了。当没有收到确认信息时,会重新发送,多次失败后才会向外报错。

      (这就像一个快递公司,有很复杂的机制)

    3.发送数据

      操作系统收到数据后会将数据存放在的发送数据缓存区中,并等待接收后续数据,只有当接收的数据达到一个网络包的大小的时候,或者达到最大等待时间之后,

      才会委托ip模块发送出去。浏览器数据量小、对性能要求高,一般会设置为直接发送。一般的http请求数据用一个网络包就够了,但有时提交的表单数据较大时,会拆分成

      多个网络包发送。

第三步:IP模块发送请求(第三层)

    1.生成IP头部

      IP模块在发送数据前,会生成IP头部,再附上要发送的数据。IP头部包含IP地址等信息。

    2.生成MAC头部

      生成IP头部后,还会在前面加上MAC头部。它包含了MAC地址等信息。MAC地址需使用IP通过ARP协议查询。每次转发过程都会更换下一个网络设备的MAC地址。

第四步:MAC模块发送请求(第二层)

    1.生成报头

      mac模块会在网络包的开头加上报头和起始帧分界符。报头是一串固定频率的时钟信号,它用于确定数据每一位的读取时机。

      报头后面是起始帧分界符,它的末尾序列比起报头有一点变化,用来标记报头的结束,网络包的开始。

    2.生成校验序列

      除了开头的报头,末尾还会加上帧校验序列,校验序列是通过整个包计算出来的,用于校验包的正误。类似身份证的校验码。

    3.生成电信号

      帧组装完毕后,便会转换成通用的电信号并委托PHY模块发送。

第五步:PHY模块发送请求(第一层)

    最终网卡中的PHY模块会将通用电信号转换成网络传输所需的格式,通过网线发送出去。经过网络转发后,最终到达服务器。

    。。。

    最后,服务器反向重复上述步骤,把电信号逐步转换回http请求信息并进行处理。

    ps:上述内容纯属博主个人理解,如有谬误,还望指出。

http请求全过程的更多相关文章

  1. SpringMVC 请求全过程漫谈

    SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...

  2. Linux 下curl模拟Http 的get or post请求

    一.get请求 curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...

  3. Linux下开发常用 模拟 Http get和post请求

    1.get请求 curl "http://www.baidu.com"      如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "htt ...

  4. Linux 下模拟Http 的get or post请求(curl和wget两种方法)

    一.get请求: 1.使用curl命令: curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地curl -i & ...

  5. curl模拟Http请求

    一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http://w ...

  6. Linux命令模拟Http的get或post请求

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求. get请求: 1.使用curl命令: cur ...

  7. linux 测试 get 请求 跳过SSL证书验证

    Linux 下测试 get 请求: curl : curl "http://www.qq.com" # 标准输出页面内容 curl -i "http://www.qq.c ...

  8. Linux(centos) 下curl模拟Http get / post请求 [ curl ]

    一.get请求 curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...

  9. Linux系统如何模拟Http的get或post请求?

    一.get请求: 1.使用curl命令: curl “http://www.baidu.com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i “http://www ...

随机推荐

  1. [GO]接口的定义和实现

    package main import "fmt" type Humaner interface { SayHi() } type Student struct { name st ...

  2. NodeJS下的阿里云企业邮箱邮件发送问题

    还没有到11点,再顺带发一个上次碰到NodeJS的邮箱插件nodeMailer不支持阿里云邮件问题. 网上很多资料都默认使用QQ之类的邮箱,因为nodeMailer默认添加了QQ之类的SMTP地址,但 ...

  3. save is not valid without active transaction

    org.hibernate.HibernateException: save is not valid without active transaction at org.hibernate.cont ...

  4. CodeForces 682A Alyona and Numbers (水题,数学)

    题意:给定两个数 m,n,问你在从1到 n,和从 1到 m中任选两个数加起来是5的倍数,问你有多少个. 析:先计算 m 和 n中有多少个取模5是从0到4的,然后根据排列组合,相乘就得到了小于等于 m ...

  5. Android canvas bug

    安卓4.1.1-4.1.2的webkit在渲染canvas元素时有bug. 具体表现是出现重影,即canvas的clearRect()方法不能彻底清空画布,仍然保留之前某个状态当“背景”. 目前的修复 ...

  6. C#:几种数据库的大数据批量插入 - faib

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  7. 安装并使用PICT,生成测试用例

    一.PICT简介 PICT工具是在微软公司内部使用的一款承兑组合的命令行生成工具,现在已经对外提供,可以在 http://download.microsoft.com/download/f/5/5/f ...

  8. 团体程序设计天梯赛L1-023 输出GPLT 2017-03-22 17:56 39人阅读 评论(0) 收藏

    L1-023. 输出GPLT 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个长度不超过10000的.仅由英文字母构成的 ...

  9. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

  10. linux mysql 权限

    原文地址:http://www.cnblogs.com/eczhou/archive/2012/07/12/2588187.html Linux下mysql新建账号及权限设置 1.权限赋予 说明:my ...